blob: 99d25d38d2f6579a4bbaa85d28efa656ded39df5 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000032 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000033 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000034 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000035 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000036 PyObject *weakreflist; /* List of weak references */
Guido van Rossum778983b1993-02-19 15:55:02 +000037} arrayobject;
38
Jeremy Hylton938ace62002-07-17 16:30:39 +000039static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000040
Martin v. Löwis99866332002-03-01 10:27:01 +000041#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimese93237d2007-12-19 02:37:44 +000042#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000043
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000044static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000045array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000046{
47 char *items;
48 size_t _new_size;
49
50 /* Bypass realloc() when a previous overallocation is large enough
51 to accommodate the newsize. If the newsize is 16 smaller than the
52 current size, then proceed with the realloc() to shrink the list.
53 */
54
55 if (self->allocated >= newsize &&
Christian Heimese93237d2007-12-19 02:37:44 +000056 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000057 self->ob_item != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +000058 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000059 return 0;
60 }
61
62 /* This over-allocates proportional to the array size, making room
63 * for additional growth. The over-allocation is mild, but is
64 * enough to give linear-time amortized behavior over a long
65 * sequence of appends() in the presence of a poorly-performing
66 * system realloc().
67 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
68 * Note, the pattern starts out the same as for lists but then
69 * grows at a smaller rate so that larger arrays only overallocate
70 * by about 1/16th -- this is done because arrays are presumed to be more
71 * memory critical.
72 */
73
Christian Heimese93237d2007-12-19 02:37:44 +000074 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000075 items = self->ob_item;
76 /* XXX The following multiplication and division does not optimize away
77 like it does for lists since the size is not known at compile time */
78 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
79 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
80 else
81 items = NULL;
82 if (items == NULL) {
83 PyErr_NoMemory();
84 return -1;
85 }
86 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +000087 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000088 self->allocated = _new_size;
89 return 0;
90}
91
Tim Petersbb307342000-09-10 05:22:54 +000092/****************************************************************************
93Get and Set functions for each type.
94A Get function takes an arrayobject* and an integer index, returning the
95array value at that index wrapped in an appropriate PyObject*.
96A Set function takes an arrayobject, integer index, and PyObject*; sets
97the array value at that index to the raw C data extracted from the PyObject*,
98and returns 0 if successful, else nonzero on failure (PyObject* not of an
99appropriate type or value).
100Note that the basic Get and Set functions do NOT check that the index is
101in bounds; that's the responsibility of the caller.
102****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000103
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000104static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000105c_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000106{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000107 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000108}
109
110static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000112{
113 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000114 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000115 return -1;
116 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000117 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000118 return 0;
119}
120
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000121static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000123{
124 long x = ((char *)ap->ob_item)[i];
125 if (x >= 128)
126 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000127 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000128}
129
130static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000131b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000132{
Fred Drake541dc3b2000-06-28 17:49:30 +0000133 short x;
134 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
135 must use the next size up that is signed ('h') and manually do
136 the overflow checking */
137 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000138 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000139 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000140 PyErr_SetString(PyExc_OverflowError,
141 "signed char is less than minimum");
142 return -1;
143 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000144 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000145 PyErr_SetString(PyExc_OverflowError,
146 "signed char is greater than maximum");
147 return -1;
148 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000149 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000150 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000151 return 0;
152}
153
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000154static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000155BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000156{
157 long x = ((unsigned char *)ap->ob_item)[i];
158 return PyInt_FromLong(x);
159}
160
Fred Drake541dc3b2000-06-28 17:49:30 +0000161static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000162BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000163{
164 unsigned char x;
165 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
166 if (!PyArg_Parse(v, "b;array item must be integer", &x))
167 return -1;
168 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000169 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000170 return 0;
171}
Guido van Rossum549ab711997-01-03 19:09:47 +0000172
Martin v. Löwis99866332002-03-01 10:27:01 +0000173#ifdef Py_USING_UNICODE
174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
183 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187 return -1;
188 if (len != 1) {
Neal Norwitz92a6be42006-04-03 04:46:28 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000191 return -1;
192 }
193 if (i >= 0)
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195 return 0;
196}
197#endif
198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000202 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
205static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000206h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000207{
208 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000209 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000210 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000211 return -1;
212 if (i >= 0)
213 ((short *)ap->ob_item)[i] = x;
214 return 0;
215}
216
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000217static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000218HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000219{
220 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
221}
222
Fred Drake541dc3b2000-06-28 17:49:30 +0000223static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000225{
226 int x;
227 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
228 must use the next size up and manually do the overflow checking */
229 if (!PyArg_Parse(v, "i;array item must be integer", &x))
230 return -1;
231 else if (x < 0) {
232 PyErr_SetString(PyExc_OverflowError,
233 "unsigned short is less than minimum");
234 return -1;
235 }
236 else if (x > USHRT_MAX) {
237 PyErr_SetString(PyExc_OverflowError,
238 "unsigned short is greater than maximum");
239 return -1;
240 }
241 if (i >= 0)
242 ((short *)ap->ob_item)[i] = (short)x;
243 return 0;
244}
Guido van Rossum549ab711997-01-03 19:09:47 +0000245
246static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000247i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000248{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000249 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000250}
251
252static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000254{
255 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000256 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000257 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000258 return -1;
259 if (i >= 0)
260 ((int *)ap->ob_item)[i] = x;
261 return 0;
262}
263
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000264static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000265II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000266{
267 return PyLong_FromUnsignedLong(
268 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
269}
270
271static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000272II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000273{
274 unsigned long x;
275 if (PyLong_Check(v)) {
276 x = PyLong_AsUnsignedLong(v);
277 if (x == (unsigned long) -1 && PyErr_Occurred())
278 return -1;
279 }
280 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000281 long y;
282 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000283 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000284 if (y < 0) {
285 PyErr_SetString(PyExc_OverflowError,
286 "unsigned int is less than minimum");
287 return -1;
288 }
289 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000290
Guido van Rossum549ab711997-01-03 19:09:47 +0000291 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000292 if (x > UINT_MAX) {
293 PyErr_SetString(PyExc_OverflowError,
294 "unsigned int is greater than maximum");
295 return -1;
296 }
297
Guido van Rossum549ab711997-01-03 19:09:47 +0000298 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000299 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000300 return 0;
301}
302
303static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000305{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000307}
308
309static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000311{
312 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000313 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000314 return -1;
315 if (i >= 0)
316 ((long *)ap->ob_item)[i] = x;
317 return 0;
318}
319
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000320static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000321LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000322{
323 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
324}
325
326static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000328{
329 unsigned long x;
330 if (PyLong_Check(v)) {
331 x = PyLong_AsUnsignedLong(v);
332 if (x == (unsigned long) -1 && PyErr_Occurred())
333 return -1;
334 }
335 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000336 long y;
337 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000338 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000339 if (y < 0) {
340 PyErr_SetString(PyExc_OverflowError,
341 "unsigned long is less than minimum");
342 return -1;
343 }
344 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000345
Guido van Rossum549ab711997-01-03 19:09:47 +0000346 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000347 if (x > ULONG_MAX) {
348 PyErr_SetString(PyExc_OverflowError,
349 "unsigned long is greater than maximum");
350 return -1;
351 }
Tim Petersbb307342000-09-10 05:22:54 +0000352
Guido van Rossum549ab711997-01-03 19:09:47 +0000353 if (i >= 0)
354 ((unsigned long *)ap->ob_item)[i] = x;
355 return 0;
356}
357
358static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000359f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000360{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000361 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000362}
363
364static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000365f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000366{
367 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000368 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000369 return -1;
370 if (i >= 0)
371 ((float *)ap->ob_item)[i] = x;
372 return 0;
373}
374
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000375static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000376d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000377{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000378 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000379}
380
381static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000383{
384 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000385 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 return -1;
387 if (i >= 0)
388 ((double *)ap->ob_item)[i] = x;
389 return 0;
390}
391
392/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000393static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 {'c', sizeof(char), c_getitem, c_setitem},
395 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000396 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000397#ifdef Py_USING_UNICODE
398 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
399#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000401 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000402 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000403 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000405 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 {'f', sizeof(float), f_getitem, f_setitem},
407 {'d', sizeof(double), d_getitem, d_setitem},
408 {'\0', 0, 0, 0} /* Sentinel */
409};
Tim Petersbb307342000-09-10 05:22:54 +0000410
411/****************************************************************************
412Implementations of array object methods.
413****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000414
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000415static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000416newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000417{
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000420
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000422 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 return NULL;
424 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000425
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 nbytes = size * descr->itemsize;
427 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000428 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000431 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000432 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000433 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000434 }
Neal Norwitz705cd062008-06-13 06:02:26 +0000435 op->ob_descr = descr;
436 op->allocated = size;
437 op->weakreflist = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000438 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000439 if (size <= 0) {
440 op->ob_item = NULL;
441 }
442 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 if (op->ob_item == NULL) {
Neal Norwitz705cd062008-06-13 06:02:26 +0000445 Py_DECREF(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000446 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 }
448 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000450}
451
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000452static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
455 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000456 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 ap = (arrayobject *)op;
Christian Heimese93237d2007-12-19 02:37:44 +0000458 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return (*ap->ob_descr->getitem)(ap, i);
460}
461
462static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 char *items;
Christian Heimese93237d2007-12-19 02:37:44 +0000466 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000467 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 return -1;
470 }
471 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000473
474 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000476 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000477 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000479 if (where < 0)
480 where = 0;
481 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000482 if (where > n)
483 where = n;
484 /* appends don't need to call memmove() */
485 if (where != n)
486 memmove(items + (where+1)*self->ob_descr->itemsize,
487 items + where*self->ob_descr->itemsize,
488 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 return (*self->ob_descr->setitem)(self, where, v);
490}
491
Guido van Rossum778983b1993-02-19 15:55:02 +0000492/* Methods */
493
494static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000495array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000497 if (op->weakreflist != NULL)
498 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000499 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500 PyMem_DEL(op->ob_item);
Christian Heimese93237d2007-12-19 02:37:44 +0000501 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000502}
503
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504static PyObject *
505array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000506{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507 arrayobject *va, *wa;
508 PyObject *vi = NULL;
509 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511 PyObject *res;
512
Martin v. Löwis99866332002-03-01 10:27:01 +0000513 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000514 Py_INCREF(Py_NotImplemented);
515 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000516 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000517
518 va = (arrayobject *)v;
519 wa = (arrayobject *)w;
520
Christian Heimese93237d2007-12-19 02:37:44 +0000521 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000522 /* Shortcut: if the lengths differ, the arrays differ */
523 if (op == Py_EQ)
524 res = Py_False;
525 else
526 res = Py_True;
527 Py_INCREF(res);
528 return res;
529 }
530
531 /* Search for the first index where items are different */
532 k = 1;
Christian Heimese93237d2007-12-19 02:37:44 +0000533 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000534 vi = getarrayitem(v, i);
535 wi = getarrayitem(w, i);
536 if (vi == NULL || wi == NULL) {
537 Py_XDECREF(vi);
538 Py_XDECREF(wi);
539 return NULL;
540 }
541 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
542 if (k == 0)
543 break; /* Keeping vi and wi alive! */
544 Py_DECREF(vi);
545 Py_DECREF(wi);
546 if (k < 0)
547 return NULL;
548 }
549
550 if (k) {
551 /* No more items to compare -- compare sizes */
Christian Heimese93237d2007-12-19 02:37:44 +0000552 Py_ssize_t vs = Py_SIZE(va);
553 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000554 int cmp;
555 switch (op) {
556 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000557 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000558 case Py_EQ: cmp = vs == ws; break;
559 case Py_NE: cmp = vs != ws; break;
560 case Py_GT: cmp = vs > ws; break;
561 case Py_GE: cmp = vs >= ws; break;
562 default: return NULL; /* cannot happen */
563 }
564 if (cmp)
565 res = Py_True;
566 else
567 res = Py_False;
568 Py_INCREF(res);
569 return res;
570 }
571
572 /* We have an item that differs. First, shortcuts for EQ/NE */
573 if (op == Py_EQ) {
574 Py_INCREF(Py_False);
575 res = Py_False;
576 }
577 else if (op == Py_NE) {
578 Py_INCREF(Py_True);
579 res = Py_True;
580 }
581 else {
582 /* Compare the final item again using the proper operator */
583 res = PyObject_RichCompare(vi, wi, op);
584 }
585 Py_DECREF(vi);
586 Py_DECREF(wi);
587 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000588}
589
Martin v. Löwis18e16552006-02-15 17:27:45 +0000590static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000591array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000592{
Christian Heimese93237d2007-12-19 02:37:44 +0000593 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000594}
595
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
Christian Heimese93237d2007-12-19 02:37:44 +0000599 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 return NULL;
602 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000603 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604}
605
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000606static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000607array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000608{
609 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 if (ilow < 0)
611 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000612 else if (ilow > Py_SIZE(a))
613 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000614 if (ihigh < 0)
615 ihigh = 0;
616 if (ihigh < ilow)
617 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000618 else if (ihigh > Py_SIZE(a))
619 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000620 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 if (np == NULL)
622 return NULL;
623 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
624 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000625 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626}
627
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000629array_copy(arrayobject *a, PyObject *unused)
630{
Christian Heimese93237d2007-12-19 02:37:44 +0000631 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000632}
633
634PyDoc_STRVAR(copy_doc,
635"copy(array)\n\
636\n\
637 Return a copy of the array.");
638
639static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000640array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000641{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000644 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000645 PyErr_Format(PyExc_TypeError,
646 "can only append array (not \"%.200s\") to array",
Christian Heimese93237d2007-12-19 02:37:44 +0000647 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return NULL;
649 }
650#define b ((arrayobject *)bb)
651 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000652 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return NULL;
654 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000655 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
656 return PyErr_NoMemory();
657 }
Christian Heimese93237d2007-12-19 02:37:44 +0000658 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000659 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000660 if (np == NULL) {
661 return NULL;
662 }
Christian Heimese93237d2007-12-19 02:37:44 +0000663 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
664 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
665 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000666 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000667#undef b
668}
669
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000670static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000672{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000673 Py_ssize_t i;
674 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 arrayobject *np;
676 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000677 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000678 if (n < 0)
679 n = 0;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000680 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
681 return PyErr_NoMemory();
682 }
Christian Heimese93237d2007-12-19 02:37:44 +0000683 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000684 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000685 if (np == NULL)
686 return NULL;
687 p = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000688 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000689 for (i = 0; i < n; i++) {
690 memcpy(p, a->ob_item, nbytes);
691 p += nbytes;
692 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000693 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000694}
695
696static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000697array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000698{
699 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000700 Py_ssize_t n; /* Size of replacement array */
701 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000702#define b ((arrayobject *)v)
703 if (v == NULL)
704 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000705 else if (array_Check(v)) {
Christian Heimese93237d2007-12-19 02:37:44 +0000706 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000707 if (a == b) {
708 /* Special case "a[i:j] = a" -- copy b first */
709 int ret;
710 v = array_slice(b, 0, n);
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +0000711 if (!v)
712 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000714 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000715 return ret;
716 }
717 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000718 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000719 return -1;
720 }
721 }
722 else {
Fred Drake137507e2000-06-01 02:02:46 +0000723 PyErr_Format(PyExc_TypeError,
724 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +0000725 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000726 return -1;
727 }
728 if (ilow < 0)
729 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000730 else if (ilow > Py_SIZE(a))
731 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000732 if (ihigh < 0)
733 ihigh = 0;
734 if (ihigh < ilow)
735 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000736 else if (ihigh > Py_SIZE(a))
737 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000738 item = a->ob_item;
739 d = n - (ihigh-ilow);
740 if (d < 0) { /* Delete -d items */
741 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
742 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000743 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
744 Py_SIZE(a) += d;
745 PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000746 /* Can't fail */
747 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000748 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000749 }
750 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000751 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +0000752 (Py_SIZE(a) + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000753 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000754 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000755 return -1;
756 }
757 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
758 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000759 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000760 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000761 Py_SIZE(a) += d;
762 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000763 }
764 if (n > 0)
765 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
766 n*b->ob_descr->itemsize);
767 return 0;
768#undef b
769}
770
771static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000772array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000773{
Christian Heimese93237d2007-12-19 02:37:44 +0000774 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000775 PyErr_SetString(PyExc_IndexError,
776 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000777 return -1;
778 }
779 if (v == NULL)
780 return array_ass_slice(a, i, i+1, v);
781 return (*a->ob_descr->setitem)(a, i, v);
782}
783
784static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000785setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000786{
Martin v. Löwis99866332002-03-01 10:27:01 +0000787 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000788 return array_ass_item((arrayobject *)a, i, v);
789}
790
Martin v. Löwis99866332002-03-01 10:27:01 +0000791static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000792array_iter_extend(arrayobject *self, PyObject *bb)
793{
794 PyObject *it, *v;
795
796 it = PyObject_GetIter(bb);
797 if (it == NULL)
798 return -1;
799
800 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +0000801 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000802 Py_DECREF(v);
803 Py_DECREF(it);
804 return -1;
805 }
806 Py_DECREF(v);
807 }
808 Py_DECREF(it);
809 if (PyErr_Occurred())
810 return -1;
811 return 0;
812}
813
814static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000815array_do_extend(arrayobject *self, PyObject *bb)
816{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000817 Py_ssize_t size;
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)) {
Neal Norwitz705cd062008-06-13 06:02:26 +0000829 PyErr_NoMemory();
830 return -1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000831 }
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) {
Neal Norwitz705cd062008-06-13 06:02:26 +0000835 PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000836 return -1;
837 }
Christian Heimese93237d2007-12-19 02:37:44 +0000838 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
839 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
840 Py_SIZE(self) = size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000841 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000842
843 return 0;
844#undef b
845}
846
847static PyObject *
848array_inplace_concat(arrayobject *self, PyObject *bb)
849{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000850 if (!array_Check(bb)) {
851 PyErr_Format(PyExc_TypeError,
852 "can only extend array with array (not \"%.200s\")",
Christian Heimese93237d2007-12-19 02:37:44 +0000853 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000854 return NULL;
855 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000856 if (array_do_extend(self, bb) == -1)
857 return NULL;
858 Py_INCREF(self);
859 return (PyObject *)self;
860}
861
862static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000863array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000864{
865 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000866 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000867
Christian Heimese93237d2007-12-19 02:37:44 +0000868 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000869 if (n < 0)
870 n = 0;
871 items = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000872 if ((self->ob_descr->itemsize != 0) &&
873 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
874 return PyErr_NoMemory();
875 }
Christian Heimese93237d2007-12-19 02:37:44 +0000876 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000877 if (n == 0) {
878 PyMem_FREE(items);
879 self->ob_item = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000880 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000881 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000882 }
883 else {
Gregory P. Smith9d534572008-06-11 07:41:16 +0000884 if (size > PY_SSIZE_T_MAX / n) {
885 return PyErr_NoMemory();
886 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000887 PyMem_Resize(items, char, n * size);
888 if (items == NULL)
889 return PyErr_NoMemory();
890 p = items;
891 for (i = 1; i < n; i++) {
892 p += size;
893 memcpy(p, items, size);
894 }
895 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +0000896 Py_SIZE(self) *= n;
897 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000898 }
899 }
900 Py_INCREF(self);
901 return (PyObject *)self;
902}
903
904
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000905static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000906ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000907{
908 if (ins1(self, where, v) != 0)
909 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000910 Py_INCREF(Py_None);
911 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000912}
913
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000914static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000915array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000917 Py_ssize_t count = 0;
918 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000919
Christian Heimese93237d2007-12-19 02:37:44 +0000920 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000922 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000923 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000924 if (cmp > 0)
925 count++;
926 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000927 return NULL;
928 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000929 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000930}
931
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000932PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000933"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000934\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000936
937static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000938array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000939{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000940 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000941
Christian Heimese93237d2007-12-19 02:37:44 +0000942 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000943 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000944 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
945 Py_DECREF(selfi);
946 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000947 return PyInt_FromLong((long)i);
948 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000949 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000950 return NULL;
951 }
952 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
953 return NULL;
954}
955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000956PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000957"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000958\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000959Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000960
Raymond Hettinger625812f2003-01-07 01:58:52 +0000961static int
962array_contains(arrayobject *self, PyObject *v)
963{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000964 Py_ssize_t i;
965 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000966
Christian Heimese93237d2007-12-19 02:37:44 +0000967 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000968 PyObject *selfi = getarrayitem((PyObject *)self, i);
969 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
970 Py_DECREF(selfi);
971 }
972 return cmp;
973}
974
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000975static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000976array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000977{
978 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000979
Christian Heimese93237d2007-12-19 02:37:44 +0000980 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000982 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
983 Py_DECREF(selfi);
984 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000985 if (array_ass_slice(self, i, i+1,
986 (PyObject *)NULL) != 0)
987 return NULL;
988 Py_INCREF(Py_None);
989 return Py_None;
990 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000991 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000992 return NULL;
993 }
994 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
995 return NULL;
996}
997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000998PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000999"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001000\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001001Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001002
1003static PyObject *
1004array_pop(arrayobject *self, PyObject *args)
1005{
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001006 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001007 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001008 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001009 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001010 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001011 /* Special-case most common failure cause */
1012 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1013 return NULL;
1014 }
1015 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001016 i += Py_SIZE(self);
1017 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001018 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1019 return NULL;
1020 }
1021 v = getarrayitem((PyObject *)self,i);
1022 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1023 Py_DECREF(v);
1024 return NULL;
1025 }
1026 return v;
1027}
1028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001029PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001030"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001031\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001032Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001033
1034static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001035array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001036{
Martin v. Löwis99866332002-03-01 10:27:01 +00001037 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001038 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001039 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001040 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001041}
1042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001043PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001044"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001045\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001046 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001047
1048static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001049array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001050{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001051 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001052 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001053 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001054 return NULL;
1055 return ins(self, i, v);
1056}
1057
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001058PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001059"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001060\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001061Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001062
1063
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001064static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001065array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001066{
Tim Peters077a11d2000-09-16 22:31:29 +00001067 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001068 retval = PyTuple_New(2);
1069 if (!retval)
1070 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001071
1072 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimese93237d2007-12-19 02:37:44 +00001073 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001074
1075 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001076}
1077
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001078PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001079"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001080\n\
1081Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001082the length in items of the buffer used to hold array's contents\n\
1083The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001084the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001085
1086
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001087static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001088array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001089{
Christian Heimese93237d2007-12-19 02:37:44 +00001090 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001091}
1092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001093PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001094"append(x)\n\
1095\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001096Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001097
1098
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001099static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001100array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001101{
1102 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001103 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001104
Guido van Rossum778983b1993-02-19 15:55:02 +00001105 switch (self->ob_descr->itemsize) {
1106 case 1:
1107 break;
1108 case 2:
Christian Heimese93237d2007-12-19 02:37:44 +00001109 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 char p0 = p[0];
1111 p[0] = p[1];
1112 p[1] = p0;
1113 }
1114 break;
1115 case 4:
Christian Heimese93237d2007-12-19 02:37:44 +00001116 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001117 char p0 = p[0];
1118 char p1 = p[1];
1119 p[0] = p[3];
1120 p[1] = p[2];
1121 p[2] = p1;
1122 p[3] = p0;
1123 }
1124 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001125 case 8:
Christian Heimese93237d2007-12-19 02:37:44 +00001126 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001127 char p0 = p[0];
1128 char p1 = p[1];
1129 char p2 = p[2];
1130 char p3 = p[3];
1131 p[0] = p[7];
1132 p[1] = p[6];
1133 p[2] = p[5];
1134 p[3] = p[4];
1135 p[4] = p3;
1136 p[5] = p2;
1137 p[6] = p1;
1138 p[7] = p0;
1139 }
1140 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001141 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001142 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001143 "don't know how to byteswap this array type");
1144 return NULL;
1145 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001146 Py_INCREF(Py_None);
1147 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001148}
1149
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001150PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001151"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001152\n\
Fred Drakebf272981999-12-03 17:15:30 +00001153Byteswap 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 +000011544, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001155
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001156static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001157array_reduce(arrayobject *array)
1158{
1159 PyObject *dict, *result;
1160
1161 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1162 if (dict == NULL) {
1163 PyErr_Clear();
1164 dict = Py_None;
1165 Py_INCREF(dict);
1166 }
Christian Heimese93237d2007-12-19 02:37:44 +00001167 if (Py_SIZE(array) > 0) {
Gregory P. Smith9d534572008-06-11 07:41:16 +00001168 if (array->ob_descr->itemsize
1169 > PY_SSIZE_T_MAX / array->ob_size) {
1170 return PyErr_NoMemory();
1171 }
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001172 result = Py_BuildValue("O(cs#)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001173 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001174 array->ob_descr->typecode,
1175 array->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001176 Py_SIZE(array) * array->ob_descr->itemsize,
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001177 dict);
1178 } else {
1179 result = Py_BuildValue("O(c)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001180 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001181 array->ob_descr->typecode,
1182 dict);
1183 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001184 Py_DECREF(dict);
1185 return result;
1186}
1187
1188PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1189
1190static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001191array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001192{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001193 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001194 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001195 /* little buffer to hold items while swapping */
1196 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001197 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001198
Christian Heimese93237d2007-12-19 02:37:44 +00001199 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001200 for (p = self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001201 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001202 p < q;
1203 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001204 /* memory areas guaranteed disjoint, so memcpy
1205 * is safe (& memmove may be slower).
1206 */
1207 memcpy(tmp, p, itemsize);
1208 memcpy(p, q, itemsize);
1209 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001210 }
1211 }
Tim Petersbb307342000-09-10 05:22:54 +00001212
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001213 Py_INCREF(Py_None);
1214 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001215}
Guido van Rossume77a7571993-11-03 15:01:26 +00001216
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001217PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001218"reverse()\n\
1219\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001220Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001221
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001222static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001223array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001224{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001225 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001226 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001227 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001228 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001230 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001231 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001232 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001233 return NULL;
1234 }
1235 if (n > 0) {
1236 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001237 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001238 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001239 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001240 size_t newbytes;
1241 /* Be careful here about overflow */
Christian Heimese93237d2007-12-19 02:37:44 +00001242 if ((newlength = Py_SIZE(self) + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001243 (newbytes = newlength * itemsize) / itemsize !=
1244 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001245 goto nomem;
1246 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001247 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001248 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001249 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001250 return NULL;
1251 }
1252 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001253 Py_SIZE(self) += n;
1254 self->allocated = Py_SIZE(self);
1255 nread = fread(item + (Py_SIZE(self) - n) * itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001256 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001257 if (nread < (size_t)n) {
Christian Heimese93237d2007-12-19 02:37:44 +00001258 Py_SIZE(self) -= (n - nread);
1259 PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001260 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001261 self->allocated = Py_SIZE(self);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001262 PyErr_SetString(PyExc_EOFError,
1263 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001264 return NULL;
1265 }
1266 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001267 Py_INCREF(Py_None);
1268 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001269}
1270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001271PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001272"fromfile(f, n)\n\
1273\n\
1274Read 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 +00001275array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001276
1277
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001278static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001279array_fromfile_as_read(arrayobject *self, PyObject *args)
1280{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001281 if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001282 "use array.fromfile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001283 return NULL;
1284 return array_fromfile(self, args);
1285}
1286
1287
1288static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001289array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001290{
Guido van Rossum778983b1993-02-19 15:55:02 +00001291 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001292
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001294 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001295 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001296 return NULL;
1297 }
1298 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001299 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1300 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001301 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001302 clearerr(fp);
1303 return NULL;
1304 }
1305 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001306 Py_INCREF(Py_None);
1307 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001308}
1309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001310PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001311"tofile(f)\n\
1312\n\
1313Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001314write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001315
1316
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001318array_tofile_as_write(arrayobject *self, PyObject *f)
1319{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001320 if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001321 "use array.tofile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001322 return NULL;
1323 return array_tofile(self, f);
1324}
1325
1326
1327static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001328array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001329{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001330 Py_ssize_t n;
1331 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001332
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001333 if (!PyList_Check(list)) {
1334 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 return NULL;
1336 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001337 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001338 if (n > 0) {
1339 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001340 Py_ssize_t i;
Christian Heimese93237d2007-12-19 02:37:44 +00001341 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001342 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001343 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001344 return NULL;
1345 }
1346 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001347 Py_SIZE(self) += n;
1348 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001349 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001350 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001351 if ((*self->ob_descr->setitem)(self,
Christian Heimese93237d2007-12-19 02:37:44 +00001352 Py_SIZE(self) - n + i, v) != 0) {
1353 Py_SIZE(self) -= n;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001354 if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1355 return PyErr_NoMemory();
1356 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001357 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +00001358 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001359 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001360 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001361 return NULL;
1362 }
1363 }
1364 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001365 Py_INCREF(Py_None);
1366 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001367}
1368
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001369PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001370"fromlist(list)\n\
1371\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001372Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001373
1374
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001375static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001376array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001377{
Christian Heimese93237d2007-12-19 02:37:44 +00001378 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001379 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001380
Guido van Rossum778983b1993-02-19 15:55:02 +00001381 if (list == NULL)
1382 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001383 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001384 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001385 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001386 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001387 return NULL;
1388 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001389 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001390 }
1391 return list;
1392}
1393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001394PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001395"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001396\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001397Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001398
1399
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001400static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001401array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001402{
1403 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001404 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001405 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001406 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001407 return NULL;
1408 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001409 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001410 "string length not a multiple of item size");
1411 return NULL;
1412 }
1413 n = n / itemsize;
1414 if (n > 0) {
1415 char *item = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001416 if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1417 ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1418 return PyErr_NoMemory();
1419 }
Christian Heimese93237d2007-12-19 02:37:44 +00001420 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001421 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001422 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001423 return NULL;
1424 }
1425 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001426 Py_SIZE(self) += n;
1427 self->allocated = Py_SIZE(self);
1428 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001429 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001430 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001431 Py_INCREF(Py_None);
1432 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001433}
1434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001435PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001436"fromstring(string)\n\
1437\n\
1438Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001439values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001440
1441
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001442static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001443array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001444{
Gregory P. Smith9d534572008-06-11 07:41:16 +00001445 if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1446 return PyString_FromStringAndSize(self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001447 Py_SIZE(self) * self->ob_descr->itemsize);
Gregory P. Smith9d534572008-06-11 07:41:16 +00001448 } else {
1449 return PyErr_NoMemory();
1450 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001451}
1452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001453PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001454"tostring() -> string\n\
1455\n\
1456Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001457representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001458
Martin v. Löwis99866332002-03-01 10:27:01 +00001459
1460
1461#ifdef Py_USING_UNICODE
1462static PyObject *
1463array_fromunicode(arrayobject *self, PyObject *args)
1464{
1465 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001466 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001467
1468 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1469 return NULL;
1470 if (self->ob_descr->typecode != 'u') {
1471 PyErr_SetString(PyExc_ValueError,
1472 "fromunicode() may only be called on "
1473 "type 'u' arrays");
1474 return NULL;
1475 }
1476 if (n > 0) {
1477 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001478 if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1479 return PyErr_NoMemory();
1480 }
Christian Heimese93237d2007-12-19 02:37:44 +00001481 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001482 if (item == NULL) {
1483 PyErr_NoMemory();
1484 return NULL;
1485 }
1486 self->ob_item = (char *) item;
Christian Heimese93237d2007-12-19 02:37:44 +00001487 Py_SIZE(self) += n;
1488 self->allocated = Py_SIZE(self);
1489 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001490 ustr, n * sizeof(Py_UNICODE));
1491 }
1492
1493 Py_INCREF(Py_None);
1494 return Py_None;
1495}
1496
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001497PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001498"fromunicode(ustr)\n\
1499\n\
1500Extends this array with data from the unicode string ustr.\n\
1501The array must be a type 'u' array; otherwise a ValueError\n\
1502is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001503append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001504
1505
1506static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001507array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001508{
Martin v. Löwis99866332002-03-01 10:27:01 +00001509 if (self->ob_descr->typecode != 'u') {
1510 PyErr_SetString(PyExc_ValueError,
1511 "tounicode() may only be called on type 'u' arrays");
1512 return NULL;
1513 }
Christian Heimese93237d2007-12-19 02:37:44 +00001514 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001515}
1516
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001517PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001518"tounicode() -> unicode\n\
1519\n\
1520Convert the array to a unicode string. The array must be\n\
1521a type 'u' array; otherwise a ValueError is raised. Use\n\
1522array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001523an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001524
1525#endif /* Py_USING_UNICODE */
1526
1527
1528static PyObject *
1529array_get_typecode(arrayobject *a, void *closure)
1530{
1531 char tc = a->ob_descr->typecode;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001532 return PyString_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001533}
1534
1535static PyObject *
1536array_get_itemsize(arrayobject *a, void *closure)
1537{
1538 return PyInt_FromLong((long)a->ob_descr->itemsize);
1539}
1540
1541static PyGetSetDef array_getsets [] = {
1542 {"typecode", (getter) array_get_typecode, NULL,
1543 "the typecode character used to create the array"},
1544 {"itemsize", (getter) array_get_itemsize, NULL,
1545 "the size, in bytes, of one array item"},
1546 {NULL}
1547};
1548
Martin v. Löwis111c1802008-06-13 07:47:47 +00001549static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001550 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001551 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001552 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001553 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001554 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001555 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001556 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1557 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001558 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001559 count_doc},
Thomas Wouters9e398ca2006-08-24 18:40:20 +00001560 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001561 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001562 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001563 extend_doc},
1564 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1565 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001566 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001567 fromlist_doc},
1568 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1569 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001570#ifdef Py_USING_UNICODE
1571 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1572 fromunicode_doc},
1573#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001574 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001575 index_doc},
1576 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1577 insert_doc},
1578 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1579 pop_doc},
Georg Brandl1e7c3752008-03-25 08:37:23 +00001580 {"read", (PyCFunction)array_fromfile_as_read, METH_VARARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001581 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001582 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1583 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001584 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001585 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001586 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001587 reverse_doc},
1588/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1589 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001590 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001591 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001592 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001593 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001594 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001595 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001596#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001597 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001598 tounicode_doc},
1599#endif
Georg Brandl1e7c3752008-03-25 08:37:23 +00001600 {"write", (PyCFunction)array_tofile_as_write, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001601 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001602 {NULL, NULL} /* sentinel */
1603};
1604
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001605static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001606array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001607{
Martin v. Löwis99866332002-03-01 10:27:01 +00001608 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001609 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001610 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001611
Christian Heimese93237d2007-12-19 02:37:44 +00001612 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001613 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001614 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001615 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001616 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001617 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001618
1619 if (typecode == 'c')
1620 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001621#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001622 else if (typecode == 'u')
1623 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001624#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001625 else
1626 v = array_tolist(a, NULL);
1627 t = PyObject_Repr(v);
1628 Py_XDECREF(v);
1629
1630 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001631 s = PyString_FromString(buf);
1632 PyString_ConcatAndDel(&s, t);
1633 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001634 return s;
1635}
1636
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001637static PyObject*
1638array_subscr(arrayobject* self, PyObject* item)
1639{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001640 if (PyIndex_Check(item)) {
1641 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001642 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001643 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001644 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001645 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001646 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001647 return array_item(self, i);
1648 }
1649 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001650 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001651 PyObject* result;
1652 arrayobject* ar;
1653 int itemsize = self->ob_descr->itemsize;
1654
Christian Heimese93237d2007-12-19 02:37:44 +00001655 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001656 &start, &stop, &step, &slicelength) < 0) {
1657 return NULL;
1658 }
1659
1660 if (slicelength <= 0) {
1661 return newarrayobject(&Arraytype, 0, self->ob_descr);
1662 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001663 else if (step == 1) {
1664 PyObject *result = newarrayobject(&Arraytype,
1665 slicelength, self->ob_descr);
1666 if (result == NULL)
1667 return NULL;
1668 memcpy(((arrayobject *)result)->ob_item,
1669 self->ob_item + start * itemsize,
1670 slicelength * itemsize);
1671 return result;
1672 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001673 else {
1674 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1675 if (!result) return NULL;
1676
1677 ar = (arrayobject*)result;
1678
1679 for (cur = start, i = 0; i < slicelength;
1680 cur += step, i++) {
1681 memcpy(ar->ob_item + i*itemsize,
1682 self->ob_item + cur*itemsize,
1683 itemsize);
1684 }
1685
1686 return result;
1687 }
1688 }
1689 else {
1690 PyErr_SetString(PyExc_TypeError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001691 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001692 return NULL;
1693 }
1694}
1695
1696static int
1697array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1698{
Thomas Wouters3ccec682007-08-28 15:28:19 +00001699 Py_ssize_t start, stop, step, slicelength, needed;
1700 arrayobject* other;
1701 int itemsize;
1702
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001703 if (PyIndex_Check(item)) {
1704 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001705
1706 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001707 return -1;
1708 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001709 i += Py_SIZE(self);
1710 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001711 PyErr_SetString(PyExc_IndexError,
1712 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001713 return -1;
1714 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001715 if (value == NULL) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001716 /* Fall through to slice assignment */
1717 start = i;
1718 stop = i + 1;
1719 step = 1;
1720 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001721 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001722 else
1723 return (*self->ob_descr->setitem)(self, i, value);
1724 }
1725 else if (PySlice_Check(item)) {
1726 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimese93237d2007-12-19 02:37:44 +00001727 Py_SIZE(self), &start, &stop,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001728 &step, &slicelength) < 0) {
1729 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001730 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001731 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001732 else {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001733 PyErr_SetString(PyExc_TypeError,
1734 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001735 return -1;
1736 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001737 if (value == NULL) {
1738 other = NULL;
1739 needed = 0;
1740 }
1741 else if (array_Check(value)) {
1742 other = (arrayobject *)value;
Christian Heimese93237d2007-12-19 02:37:44 +00001743 needed = Py_SIZE(other);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001744 if (self == other) {
1745 /* Special case "self[i:j] = self" -- copy self first */
1746 int ret;
1747 value = array_slice(other, 0, needed);
1748 if (value == NULL)
1749 return -1;
1750 ret = array_ass_subscr(self, item, value);
1751 Py_DECREF(value);
1752 return ret;
1753 }
1754 if (other->ob_descr != self->ob_descr) {
1755 PyErr_BadArgument();
1756 return -1;
1757 }
1758 }
1759 else {
1760 PyErr_Format(PyExc_TypeError,
1761 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +00001762 Py_TYPE(value)->tp_name);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001763 return -1;
1764 }
1765 itemsize = self->ob_descr->itemsize;
1766 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1767 if ((step > 0 && stop < start) ||
1768 (step < 0 && stop > start))
1769 stop = start;
1770 if (step == 1) {
1771 if (slicelength > needed) {
1772 memmove(self->ob_item + (start + needed) * itemsize,
1773 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001774 (Py_SIZE(self) - stop) * itemsize);
1775 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001776 needed - slicelength) < 0)
1777 return -1;
1778 }
1779 else if (slicelength < needed) {
Christian Heimese93237d2007-12-19 02:37:44 +00001780 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001781 needed - slicelength) < 0)
1782 return -1;
1783 memmove(self->ob_item + (start + needed) * itemsize,
1784 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001785 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001786 }
1787 if (needed > 0)
1788 memcpy(self->ob_item + start * itemsize,
1789 other->ob_item, needed * itemsize);
1790 return 0;
1791 }
1792 else if (needed == 0) {
1793 /* Delete slice */
1794 Py_ssize_t cur, i;
1795
1796 if (step < 0) {
1797 stop = start + 1;
1798 start = stop + step * (slicelength - 1) - 1;
1799 step = -step;
1800 }
1801 for (cur = start, i = 0; i < slicelength;
1802 cur += step, i++) {
1803 Py_ssize_t lim = step - 1;
1804
Christian Heimese93237d2007-12-19 02:37:44 +00001805 if (cur + step >= Py_SIZE(self))
1806 lim = Py_SIZE(self) - cur - 1;
Thomas Wouters3ccec682007-08-28 15:28:19 +00001807 memmove(self->ob_item + (cur - i) * itemsize,
1808 self->ob_item + (cur + 1) * itemsize,
1809 lim * itemsize);
1810 }
1811 cur = start + slicelength * step;
Christian Heimese93237d2007-12-19 02:37:44 +00001812 if (cur < Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001813 memmove(self->ob_item + (cur-slicelength) * itemsize,
1814 self->ob_item + cur * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001815 (Py_SIZE(self) - cur) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001816 }
Christian Heimese93237d2007-12-19 02:37:44 +00001817 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Wouters3ccec682007-08-28 15:28:19 +00001818 return -1;
1819 return 0;
1820 }
1821 else {
1822 Py_ssize_t cur, i;
1823
1824 if (needed != slicelength) {
1825 PyErr_Format(PyExc_ValueError,
1826 "attempt to assign array of size %zd "
1827 "to extended slice of size %zd",
1828 needed, slicelength);
1829 return -1;
1830 }
1831 for (cur = start, i = 0; i < slicelength;
1832 cur += step, i++) {
1833 memcpy(self->ob_item + cur * itemsize,
1834 other->ob_item + i * itemsize,
1835 itemsize);
1836 }
1837 return 0;
1838 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001839}
1840
1841static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001842 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001843 (binaryfunc)array_subscr,
1844 (objobjargproc)array_ass_subscr
1845};
1846
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001847static const void *emptybuf = "";
1848
Martin v. Löwis18e16552006-02-15 17:27:45 +00001849static Py_ssize_t
1850array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001851{
1852 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001853 PyErr_SetString(PyExc_SystemError,
1854 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001855 return -1;
1856 }
1857 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001858 if (*ptr == NULL)
1859 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001860 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001861}
1862
Martin v. Löwis18e16552006-02-15 17:27:45 +00001863static Py_ssize_t
1864array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001865{
1866 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001867 PyErr_SetString(PyExc_SystemError,
1868 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001869 return -1;
1870 }
1871 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001872 if (*ptr == NULL)
1873 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001874 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001875}
1876
Martin v. Löwis18e16552006-02-15 17:27:45 +00001877static Py_ssize_t
1878array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001879{
1880 if ( lenp )
Christian Heimese93237d2007-12-19 02:37:44 +00001881 *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001882 return 1;
1883}
1884
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001885static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001886 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001887 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001888 (ssizeargfunc)array_repeat, /*sq_repeat*/
1889 (ssizeargfunc)array_item, /*sq_item*/
1890 (ssizessizeargfunc)array_slice, /*sq_slice*/
1891 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1892 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001893 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001894 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001895 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001896};
1897
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001898static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001899 (readbufferproc)array_buffer_getreadbuf,
1900 (writebufferproc)array_buffer_getwritebuf,
1901 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001902 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001903};
1904
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001905static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001906array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001907{
1908 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001909 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001910 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001911
Georg Brandlb84c1372007-01-21 10:28:43 +00001912 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001913 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001914
1915 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1916 return NULL;
1917
1918 if (!(initial == NULL || PyList_Check(initial)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001919 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001920 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001921 it = PyObject_GetIter(initial);
1922 if (it == NULL)
1923 return NULL;
1924 /* We set initial to NULL so that the subsequent code
1925 will create an empty array of the appropriate type
1926 and afterwards we can use array_iter_extend to populate
1927 the array.
1928 */
1929 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001930 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001931 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1932 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001933 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001934 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001935
1936 if (initial == NULL || !(PyList_Check(initial)
1937 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001938 len = 0;
1939 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001940 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001941
1942 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001943 if (a == NULL)
1944 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001945
Guido van Rossum778983b1993-02-19 15:55:02 +00001946 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001947 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001948 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001949 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001950 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001951 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001952 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001953 return NULL;
1954 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001955 if (setarrayitem(a, i, v) != 0) {
1956 Py_DECREF(v);
1957 Py_DECREF(a);
1958 return NULL;
1959 }
1960 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001961 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001962 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001963 PyObject *t_initial, *v;
1964 t_initial = PyTuple_Pack(1, initial);
1965 if (t_initial == NULL) {
1966 Py_DECREF(a);
1967 return NULL;
1968 }
1969 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001970 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001971 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001972 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001973 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001974 return NULL;
1975 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001976 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001977#ifdef Py_USING_UNICODE
1978 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001979 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001980 if (n > 0) {
1981 arrayobject *self = (arrayobject *)a;
1982 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001983 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001984 if (item == NULL) {
1985 PyErr_NoMemory();
1986 Py_DECREF(a);
1987 return NULL;
1988 }
1989 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001990 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001991 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimese93237d2007-12-19 02:37:44 +00001992 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001993 }
1994#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001995 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001996 if (it != NULL) {
1997 if (array_iter_extend((arrayobject *)a, it) == -1) {
1998 Py_DECREF(it);
1999 Py_DECREF(a);
2000 return NULL;
2001 }
2002 Py_DECREF(it);
2003 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002004 return a;
2005 }
2006 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002007 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00002008 "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 +00002009 return NULL;
2010}
2011
Guido van Rossum778983b1993-02-19 15:55:02 +00002012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002013PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002014"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002015an array of basic values: characters, integers, floating point\n\
2016numbers. Arrays are sequence types and behave very much like lists,\n\
2017except that the type of objects stored in them is constrained. The\n\
2018type is specified at object creation time by using a type code, which\n\
2019is a single character. The following type codes are defined:\n\
2020\n\
2021 Type code C Type Minimum size in bytes \n\
2022 'c' character 1 \n\
2023 'b' signed integer 1 \n\
2024 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002025 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002026 'h' signed integer 2 \n\
2027 'H' unsigned integer 2 \n\
2028 'i' signed integer 2 \n\
2029 'I' unsigned integer 2 \n\
2030 'l' signed integer 4 \n\
2031 'L' unsigned integer 4 \n\
2032 'f' floating point 4 \n\
2033 'd' floating point 8 \n\
2034\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002035The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002036\n\
2037array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002038");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002040PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002041"array(typecode [, initializer]) -> array\n\
2042\n\
2043Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002044initialized from the optional initializer value, which must be a list,\n\
2045string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002046\n\
2047Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002048the type of objects stored in them is constrained.\n\
2049\n\
2050Methods:\n\
2051\n\
2052append() -- append a new item to the end of the array\n\
2053buffer_info() -- return information giving the current memory info\n\
2054byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002055count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002056extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002057fromfile() -- read items from a file object\n\
2058fromlist() -- append items from the list\n\
2059fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002060index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002061insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002062pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002063read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002064remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002065reverse() -- reverse the order of the items in the array\n\
2066tofile() -- write all items to a file object\n\
2067tolist() -- return the array converted to an ordinary list\n\
2068tostring() -- return the array converted to a string\n\
2069write() -- DEPRECATED, use tofile()\n\
2070\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002071Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002072\n\
2073typecode -- the typecode character used to create the array\n\
2074itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002075");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002076
Raymond Hettinger625812f2003-01-07 01:58:52 +00002077static PyObject *array_iter(arrayobject *ao);
2078
Tim Peters0c322792002-07-17 16:49:03 +00002079static PyTypeObject Arraytype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002080 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002081 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002082 sizeof(arrayobject),
2083 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002084 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002085 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002086 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002087 0, /* tp_setattr */
2088 0, /* tp_compare */
2089 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002090 0, /* tp_as_number*/
2091 &array_as_sequence, /* tp_as_sequence*/
2092 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002093 0, /* tp_hash */
2094 0, /* tp_call */
2095 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002096 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002097 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002098 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002099 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002100 arraytype_doc, /* tp_doc */
2101 0, /* tp_traverse */
2102 0, /* tp_clear */
2103 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002104 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002105 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002106 0, /* tp_iternext */
2107 array_methods, /* tp_methods */
2108 0, /* tp_members */
2109 array_getsets, /* tp_getset */
2110 0, /* tp_base */
2111 0, /* tp_dict */
2112 0, /* tp_descr_get */
2113 0, /* tp_descr_set */
2114 0, /* tp_dictoffset */
2115 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002116 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002117 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002118 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002119};
2120
Raymond Hettinger625812f2003-01-07 01:58:52 +00002121
2122/*********************** Array Iterator **************************/
2123
2124typedef struct {
2125 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002126 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002127 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002128 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002129} arrayiterobject;
2130
2131static PyTypeObject PyArrayIter_Type;
2132
2133#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2134
2135static PyObject *
2136array_iter(arrayobject *ao)
2137{
2138 arrayiterobject *it;
2139
2140 if (!array_Check(ao)) {
2141 PyErr_BadInternalCall();
2142 return NULL;
2143 }
2144
2145 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2146 if (it == NULL)
2147 return NULL;
2148
2149 Py_INCREF(ao);
2150 it->ao = ao;
2151 it->index = 0;
2152 it->getitem = ao->ob_descr->getitem;
2153 PyObject_GC_Track(it);
2154 return (PyObject *)it;
2155}
2156
2157static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002158arrayiter_next(arrayiterobject *it)
2159{
2160 assert(PyArrayIter_Check(it));
Christian Heimese93237d2007-12-19 02:37:44 +00002161 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002162 return (*it->getitem)(it->ao, it->index++);
2163 return NULL;
2164}
2165
2166static void
2167arrayiter_dealloc(arrayiterobject *it)
2168{
2169 PyObject_GC_UnTrack(it);
2170 Py_XDECREF(it->ao);
2171 PyObject_GC_Del(it);
2172}
2173
2174static int
2175arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2176{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002177 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002178 return 0;
2179}
2180
2181static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002182 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002183 "arrayiterator", /* tp_name */
2184 sizeof(arrayiterobject), /* tp_basicsize */
2185 0, /* tp_itemsize */
2186 /* methods */
2187 (destructor)arrayiter_dealloc, /* tp_dealloc */
2188 0, /* tp_print */
2189 0, /* tp_getattr */
2190 0, /* tp_setattr */
2191 0, /* tp_compare */
2192 0, /* tp_repr */
2193 0, /* tp_as_number */
2194 0, /* tp_as_sequence */
2195 0, /* tp_as_mapping */
2196 0, /* tp_hash */
2197 0, /* tp_call */
2198 0, /* tp_str */
2199 PyObject_GenericGetAttr, /* tp_getattro */
2200 0, /* tp_setattro */
2201 0, /* tp_as_buffer */
2202 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2203 0, /* tp_doc */
2204 (traverseproc)arrayiter_traverse, /* tp_traverse */
2205 0, /* tp_clear */
2206 0, /* tp_richcompare */
2207 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002208 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002209 (iternextfunc)arrayiter_next, /* tp_iternext */
2210 0, /* tp_methods */
2211};
2212
2213
2214/*********************** Install Module **************************/
2215
Martin v. Löwis99866332002-03-01 10:27:01 +00002216/* No functions in array module. */
2217static PyMethodDef a_methods[] = {
2218 {NULL, NULL, 0, NULL} /* Sentinel */
2219};
2220
2221
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002222PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002223initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002224{
Fred Drakef4e34842002-04-01 03:45:06 +00002225 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002226
Martin v. Löwis99866332002-03-01 10:27:01 +00002227 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002228 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002229 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002230 if (m == NULL)
2231 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002232
2233 Py_INCREF((PyObject *)&Arraytype);
2234 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2235 Py_INCREF((PyObject *)&Arraytype);
2236 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002237 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002238}