blob: ef6fb879cb75d738506575614895e7aff5001ffb [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000032 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000033 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000034 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000035 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000036 PyObject *weakreflist; /* List of weak references */
Guido van Rossum778983b1993-02-19 15:55:02 +000037} arrayobject;
38
Jeremy Hylton938ace62002-07-17 16:30:39 +000039static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000040
Martin v. Löwis99866332002-03-01 10:27:01 +000041#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimese93237d2007-12-19 02:37:44 +000042#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000043
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000044static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000045array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000046{
47 char *items;
48 size_t _new_size;
49
50 /* Bypass realloc() when a previous overallocation is large enough
51 to accommodate the newsize. If the newsize is 16 smaller than the
52 current size, then proceed with the realloc() to shrink the list.
53 */
54
55 if (self->allocated >= newsize &&
Christian Heimese93237d2007-12-19 02:37:44 +000056 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000057 self->ob_item != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +000058 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000059 return 0;
60 }
61
62 /* This over-allocates proportional to the array size, making room
63 * for additional growth. The over-allocation is mild, but is
64 * enough to give linear-time amortized behavior over a long
65 * sequence of appends() in the presence of a poorly-performing
66 * system realloc().
67 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
68 * Note, the pattern starts out the same as for lists but then
69 * grows at a smaller rate so that larger arrays only overallocate
70 * by about 1/16th -- this is done because arrays are presumed to be more
71 * memory critical.
72 */
73
Christian Heimese93237d2007-12-19 02:37:44 +000074 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000075 items = self->ob_item;
76 /* XXX The following multiplication and division does not optimize away
77 like it does for lists since the size is not known at compile time */
78 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
79 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
80 else
81 items = NULL;
82 if (items == NULL) {
83 PyErr_NoMemory();
84 return -1;
85 }
86 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +000087 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000088 self->allocated = _new_size;
89 return 0;
90}
91
Tim Petersbb307342000-09-10 05:22:54 +000092/****************************************************************************
93Get and Set functions for each type.
94A Get function takes an arrayobject* and an integer index, returning the
95array value at that index wrapped in an appropriate PyObject*.
96A Set function takes an arrayobject, integer index, and PyObject*; sets
97the array value at that index to the raw C data extracted from the PyObject*,
98and returns 0 if successful, else nonzero on failure (PyObject* not of an
99appropriate type or value).
100Note that the basic Get and Set functions do NOT check that the index is
101in bounds; that's the responsibility of the caller.
102****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000103
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000104static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000105c_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000106{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000107 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000108}
109
110static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000112{
113 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000114 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000115 return -1;
116 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000117 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000118 return 0;
119}
120
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000121static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000123{
124 long x = ((char *)ap->ob_item)[i];
125 if (x >= 128)
126 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000127 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000128}
129
130static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000131b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000132{
Fred Drake541dc3b2000-06-28 17:49:30 +0000133 short x;
134 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
135 must use the next size up that is signed ('h') and manually do
136 the overflow checking */
137 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000138 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000139 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000140 PyErr_SetString(PyExc_OverflowError,
141 "signed char is less than minimum");
142 return -1;
143 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000144 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000145 PyErr_SetString(PyExc_OverflowError,
146 "signed char is greater than maximum");
147 return -1;
148 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000149 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000150 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000151 return 0;
152}
153
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000154static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000155BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000156{
157 long x = ((unsigned char *)ap->ob_item)[i];
158 return PyInt_FromLong(x);
159}
160
Fred Drake541dc3b2000-06-28 17:49:30 +0000161static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000162BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000163{
164 unsigned char x;
165 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
166 if (!PyArg_Parse(v, "b;array item must be integer", &x))
167 return -1;
168 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000169 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000170 return 0;
171}
Guido van Rossum549ab711997-01-03 19:09:47 +0000172
Martin v. Löwis99866332002-03-01 10:27:01 +0000173#ifdef Py_USING_UNICODE
174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
183 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187 return -1;
188 if (len != 1) {
Neal Norwitz92a6be42006-04-03 04:46:28 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000191 return -1;
192 }
193 if (i >= 0)
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195 return 0;
196}
197#endif
198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000202 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
205static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000206h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000207{
208 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000209 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000210 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000211 return -1;
212 if (i >= 0)
213 ((short *)ap->ob_item)[i] = x;
214 return 0;
215}
216
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000217static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000218HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000219{
220 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
221}
222
Fred Drake541dc3b2000-06-28 17:49:30 +0000223static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000225{
226 int x;
227 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
228 must use the next size up and manually do the overflow checking */
229 if (!PyArg_Parse(v, "i;array item must be integer", &x))
230 return -1;
231 else if (x < 0) {
232 PyErr_SetString(PyExc_OverflowError,
233 "unsigned short is less than minimum");
234 return -1;
235 }
236 else if (x > USHRT_MAX) {
237 PyErr_SetString(PyExc_OverflowError,
238 "unsigned short is greater than maximum");
239 return -1;
240 }
241 if (i >= 0)
242 ((short *)ap->ob_item)[i] = (short)x;
243 return 0;
244}
Guido van Rossum549ab711997-01-03 19:09:47 +0000245
246static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000247i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000248{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000249 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000250}
251
252static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000254{
255 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000256 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000257 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000258 return -1;
259 if (i >= 0)
260 ((int *)ap->ob_item)[i] = x;
261 return 0;
262}
263
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000264static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000265II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000266{
267 return PyLong_FromUnsignedLong(
268 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
269}
270
271static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000272II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000273{
274 unsigned long x;
275 if (PyLong_Check(v)) {
276 x = PyLong_AsUnsignedLong(v);
277 if (x == (unsigned long) -1 && PyErr_Occurred())
278 return -1;
279 }
280 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000281 long y;
282 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000283 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000284 if (y < 0) {
285 PyErr_SetString(PyExc_OverflowError,
286 "unsigned int is less than minimum");
287 return -1;
288 }
289 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000290
Guido van Rossum549ab711997-01-03 19:09:47 +0000291 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000292 if (x > UINT_MAX) {
293 PyErr_SetString(PyExc_OverflowError,
294 "unsigned int is greater than maximum");
295 return -1;
296 }
297
Guido van Rossum549ab711997-01-03 19:09:47 +0000298 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000299 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000300 return 0;
301}
302
303static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000305{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000307}
308
309static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000311{
312 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000313 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000314 return -1;
315 if (i >= 0)
316 ((long *)ap->ob_item)[i] = x;
317 return 0;
318}
319
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000320static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000321LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000322{
323 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
324}
325
326static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000328{
329 unsigned long x;
330 if (PyLong_Check(v)) {
331 x = PyLong_AsUnsignedLong(v);
332 if (x == (unsigned long) -1 && PyErr_Occurred())
333 return -1;
334 }
335 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000336 long y;
337 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000338 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000339 if (y < 0) {
340 PyErr_SetString(PyExc_OverflowError,
341 "unsigned long is less than minimum");
342 return -1;
343 }
344 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000345
Guido van Rossum549ab711997-01-03 19:09:47 +0000346 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000347 if (x > ULONG_MAX) {
348 PyErr_SetString(PyExc_OverflowError,
349 "unsigned long is greater than maximum");
350 return -1;
351 }
Tim Petersbb307342000-09-10 05:22:54 +0000352
Guido van Rossum549ab711997-01-03 19:09:47 +0000353 if (i >= 0)
354 ((unsigned long *)ap->ob_item)[i] = x;
355 return 0;
356}
357
358static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000359f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000360{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000361 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000362}
363
364static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000365f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000366{
367 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000368 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000369 return -1;
370 if (i >= 0)
371 ((float *)ap->ob_item)[i] = x;
372 return 0;
373}
374
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000375static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000376d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000377{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000378 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000379}
380
381static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000383{
384 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000385 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 return -1;
387 if (i >= 0)
388 ((double *)ap->ob_item)[i] = x;
389 return 0;
390}
391
392/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000393static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 {'c', sizeof(char), c_getitem, c_setitem},
395 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000396 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000397#ifdef Py_USING_UNICODE
398 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
399#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000401 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000402 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000403 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000405 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 {'f', sizeof(float), f_getitem, f_setitem},
407 {'d', sizeof(double), d_getitem, d_setitem},
408 {'\0', 0, 0, 0} /* Sentinel */
409};
Tim Petersbb307342000-09-10 05:22:54 +0000410
411/****************************************************************************
412Implementations of array object methods.
413****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000414
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000415static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000416newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000417{
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000420
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000422 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 return NULL;
424 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000425
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 nbytes = size * descr->itemsize;
427 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000428 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000431 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000432 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000433 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000434 }
Neal Norwitz705cd062008-06-13 06:02:26 +0000435 op->ob_descr = descr;
436 op->allocated = size;
437 op->weakreflist = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000438 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000439 if (size <= 0) {
440 op->ob_item = NULL;
441 }
442 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 if (op->ob_item == NULL) {
Neal Norwitz705cd062008-06-13 06:02:26 +0000445 Py_DECREF(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000446 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 }
448 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000450}
451
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000452static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
455 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000456 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 ap = (arrayobject *)op;
Christian Heimese93237d2007-12-19 02:37:44 +0000458 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return (*ap->ob_descr->getitem)(ap, i);
460}
461
462static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 char *items;
Christian Heimese93237d2007-12-19 02:37:44 +0000466 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000467 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 return -1;
470 }
471 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000473
474 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000476 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000477 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000479 if (where < 0)
480 where = 0;
481 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000482 if (where > n)
483 where = n;
484 /* appends don't need to call memmove() */
485 if (where != n)
486 memmove(items + (where+1)*self->ob_descr->itemsize,
487 items + where*self->ob_descr->itemsize,
488 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 return (*self->ob_descr->setitem)(self, where, v);
490}
491
Guido van Rossum778983b1993-02-19 15:55:02 +0000492/* Methods */
493
494static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000495array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000497 if (op->weakreflist != NULL)
498 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000499 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500 PyMem_DEL(op->ob_item);
Christian Heimese93237d2007-12-19 02:37:44 +0000501 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000502}
503
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504static PyObject *
505array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000506{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507 arrayobject *va, *wa;
508 PyObject *vi = NULL;
509 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511 PyObject *res;
512
Martin v. Löwis99866332002-03-01 10:27:01 +0000513 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000514 Py_INCREF(Py_NotImplemented);
515 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000516 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000517
518 va = (arrayobject *)v;
519 wa = (arrayobject *)w;
520
Christian Heimese93237d2007-12-19 02:37:44 +0000521 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000522 /* Shortcut: if the lengths differ, the arrays differ */
523 if (op == Py_EQ)
524 res = Py_False;
525 else
526 res = Py_True;
527 Py_INCREF(res);
528 return res;
529 }
530
531 /* Search for the first index where items are different */
532 k = 1;
Christian Heimese93237d2007-12-19 02:37:44 +0000533 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000534 vi = getarrayitem(v, i);
535 wi = getarrayitem(w, i);
536 if (vi == NULL || wi == NULL) {
537 Py_XDECREF(vi);
538 Py_XDECREF(wi);
539 return NULL;
540 }
541 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
542 if (k == 0)
543 break; /* Keeping vi and wi alive! */
544 Py_DECREF(vi);
545 Py_DECREF(wi);
546 if (k < 0)
547 return NULL;
548 }
549
550 if (k) {
551 /* No more items to compare -- compare sizes */
Christian Heimese93237d2007-12-19 02:37:44 +0000552 Py_ssize_t vs = Py_SIZE(va);
553 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000554 int cmp;
555 switch (op) {
556 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000557 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000558 case Py_EQ: cmp = vs == ws; break;
559 case Py_NE: cmp = vs != ws; break;
560 case Py_GT: cmp = vs > ws; break;
561 case Py_GE: cmp = vs >= ws; break;
562 default: return NULL; /* cannot happen */
563 }
564 if (cmp)
565 res = Py_True;
566 else
567 res = Py_False;
568 Py_INCREF(res);
569 return res;
570 }
571
572 /* We have an item that differs. First, shortcuts for EQ/NE */
573 if (op == Py_EQ) {
574 Py_INCREF(Py_False);
575 res = Py_False;
576 }
577 else if (op == Py_NE) {
578 Py_INCREF(Py_True);
579 res = Py_True;
580 }
581 else {
582 /* Compare the final item again using the proper operator */
583 res = PyObject_RichCompare(vi, wi, op);
584 }
585 Py_DECREF(vi);
586 Py_DECREF(wi);
587 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000588}
589
Martin v. Löwis18e16552006-02-15 17:27:45 +0000590static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000591array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000592{
Christian Heimese93237d2007-12-19 02:37:44 +0000593 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000594}
595
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
Christian Heimese93237d2007-12-19 02:37:44 +0000599 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 return NULL;
602 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000603 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604}
605
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000606static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000607array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000608{
609 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 if (ilow < 0)
611 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000612 else if (ilow > Py_SIZE(a))
613 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000614 if (ihigh < 0)
615 ihigh = 0;
616 if (ihigh < ilow)
617 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000618 else if (ihigh > Py_SIZE(a))
619 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000620 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 if (np == NULL)
622 return NULL;
623 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
624 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000625 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626}
627
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000629array_copy(arrayobject *a, PyObject *unused)
630{
Christian Heimese93237d2007-12-19 02:37:44 +0000631 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000632}
633
634PyDoc_STRVAR(copy_doc,
635"copy(array)\n\
636\n\
637 Return a copy of the array.");
638
639static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000640array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000641{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000644 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000645 PyErr_Format(PyExc_TypeError,
646 "can only append array (not \"%.200s\") to array",
Christian Heimese93237d2007-12-19 02:37:44 +0000647 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return NULL;
649 }
650#define b ((arrayobject *)bb)
651 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000652 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return NULL;
654 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000655 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
656 return PyErr_NoMemory();
657 }
Christian Heimese93237d2007-12-19 02:37:44 +0000658 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000659 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000660 if (np == NULL) {
661 return NULL;
662 }
Christian Heimese93237d2007-12-19 02:37:44 +0000663 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
664 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
665 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000666 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000667#undef b
668}
669
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000670static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000672{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000673 Py_ssize_t i;
674 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 arrayobject *np;
676 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000677 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000678 if (n < 0)
679 n = 0;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000680 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
681 return PyErr_NoMemory();
682 }
Christian Heimese93237d2007-12-19 02:37:44 +0000683 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000684 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000685 if (np == NULL)
686 return NULL;
687 p = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000688 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000689 for (i = 0; i < n; i++) {
690 memcpy(p, a->ob_item, nbytes);
691 p += nbytes;
692 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000693 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000694}
695
696static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000697array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000698{
699 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000700 Py_ssize_t n; /* Size of replacement array */
701 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000702#define b ((arrayobject *)v)
703 if (v == NULL)
704 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000705 else if (array_Check(v)) {
Christian Heimese93237d2007-12-19 02:37:44 +0000706 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000707 if (a == b) {
708 /* Special case "a[i:j] = a" -- copy b first */
709 int ret;
710 v = array_slice(b, 0, n);
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +0000711 if (!v)
712 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000714 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000715 return ret;
716 }
717 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000718 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000719 return -1;
720 }
721 }
722 else {
Fred Drake137507e2000-06-01 02:02:46 +0000723 PyErr_Format(PyExc_TypeError,
724 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +0000725 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000726 return -1;
727 }
728 if (ilow < 0)
729 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000730 else if (ilow > Py_SIZE(a))
731 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000732 if (ihigh < 0)
733 ihigh = 0;
734 if (ihigh < ilow)
735 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000736 else if (ihigh > Py_SIZE(a))
737 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000738 item = a->ob_item;
739 d = n - (ihigh-ilow);
740 if (d < 0) { /* Delete -d items */
741 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
742 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000743 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
744 Py_SIZE(a) += d;
745 PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000746 /* Can't fail */
747 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000748 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000749 }
750 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000751 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +0000752 (Py_SIZE(a) + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000753 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000754 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000755 return -1;
756 }
757 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
758 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000759 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000760 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000761 Py_SIZE(a) += d;
762 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000763 }
764 if (n > 0)
765 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
766 n*b->ob_descr->itemsize);
767 return 0;
768#undef b
769}
770
771static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000772array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000773{
Christian Heimese93237d2007-12-19 02:37:44 +0000774 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000775 PyErr_SetString(PyExc_IndexError,
776 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000777 return -1;
778 }
779 if (v == NULL)
780 return array_ass_slice(a, i, i+1, v);
781 return (*a->ob_descr->setitem)(a, i, v);
782}
783
784static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000785setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000786{
Martin v. Löwis99866332002-03-01 10:27:01 +0000787 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000788 return array_ass_item((arrayobject *)a, i, v);
789}
790
Martin v. Löwis99866332002-03-01 10:27:01 +0000791static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000792array_iter_extend(arrayobject *self, PyObject *bb)
793{
794 PyObject *it, *v;
795
796 it = PyObject_GetIter(bb);
797 if (it == NULL)
798 return -1;
799
800 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +0000801 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000802 Py_DECREF(v);
803 Py_DECREF(it);
804 return -1;
805 }
806 Py_DECREF(v);
807 }
808 Py_DECREF(it);
809 if (PyErr_Occurred())
810 return -1;
811 return 0;
812}
813
814static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000815array_do_extend(arrayobject *self, PyObject *bb)
816{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000817 Py_ssize_t size;
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000818 char *old_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000819
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000820 if (!array_Check(bb))
821 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000822#define b ((arrayobject *)bb)
823 if (self->ob_descr != b->ob_descr) {
824 PyErr_SetString(PyExc_TypeError,
825 "can only extend with array of same kind");
826 return -1;
827 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000828 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
829 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
Neal Norwitz705cd062008-06-13 06:02:26 +0000830 PyErr_NoMemory();
831 return -1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000832 }
Christian Heimese93237d2007-12-19 02:37:44 +0000833 size = Py_SIZE(self) + Py_SIZE(b);
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000834 old_item = self->ob_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000835 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
836 if (self->ob_item == NULL) {
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000837 self->ob_item = old_item;
Neal Norwitz705cd062008-06-13 06:02:26 +0000838 PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000839 return -1;
840 }
Christian Heimese93237d2007-12-19 02:37:44 +0000841 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
842 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
843 Py_SIZE(self) = size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000844 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000845
846 return 0;
847#undef b
848}
849
850static PyObject *
851array_inplace_concat(arrayobject *self, PyObject *bb)
852{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000853 if (!array_Check(bb)) {
854 PyErr_Format(PyExc_TypeError,
855 "can only extend array with array (not \"%.200s\")",
Christian Heimese93237d2007-12-19 02:37:44 +0000856 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000857 return NULL;
858 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000859 if (array_do_extend(self, bb) == -1)
860 return NULL;
861 Py_INCREF(self);
862 return (PyObject *)self;
863}
864
865static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000866array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000867{
868 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000869 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000870
Christian Heimese93237d2007-12-19 02:37:44 +0000871 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000872 if (n < 0)
873 n = 0;
874 items = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000875 if ((self->ob_descr->itemsize != 0) &&
876 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
877 return PyErr_NoMemory();
878 }
Christian Heimese93237d2007-12-19 02:37:44 +0000879 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000880 if (n == 0) {
881 PyMem_FREE(items);
882 self->ob_item = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000883 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000884 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000885 }
886 else {
Gregory P. Smith9d534572008-06-11 07:41:16 +0000887 if (size > PY_SSIZE_T_MAX / n) {
888 return PyErr_NoMemory();
889 }
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000890 PyMem_RESIZE(items, char, n * size);
Martin v. Löwis99866332002-03-01 10:27:01 +0000891 if (items == NULL)
892 return PyErr_NoMemory();
893 p = items;
894 for (i = 1; i < n; i++) {
895 p += size;
896 memcpy(p, items, size);
897 }
898 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +0000899 Py_SIZE(self) *= n;
900 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000901 }
902 }
903 Py_INCREF(self);
904 return (PyObject *)self;
905}
906
907
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000908static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000909ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000910{
911 if (ins1(self, where, v) != 0)
912 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000913 Py_INCREF(Py_None);
914 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000915}
916
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000917static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000918array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000919{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000920 Py_ssize_t count = 0;
921 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922
Christian Heimese93237d2007-12-19 02:37:44 +0000923 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000925 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000926 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000927 if (cmp > 0)
928 count++;
929 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000930 return NULL;
931 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000932 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000933}
934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000936"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000937\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000938Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000939
940static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000941array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000942{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000943 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000944
Christian Heimese93237d2007-12-19 02:37:44 +0000945 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000946 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000947 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
948 Py_DECREF(selfi);
949 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000950 return PyInt_FromLong((long)i);
951 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000952 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000953 return NULL;
954 }
955 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
956 return NULL;
957}
958
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000959PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000960"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000961\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000962Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000963
Raymond Hettinger625812f2003-01-07 01:58:52 +0000964static int
965array_contains(arrayobject *self, PyObject *v)
966{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000967 Py_ssize_t i;
968 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000969
Christian Heimese93237d2007-12-19 02:37:44 +0000970 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000971 PyObject *selfi = getarrayitem((PyObject *)self, i);
972 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
973 Py_DECREF(selfi);
974 }
975 return cmp;
976}
977
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000978static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000979array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980{
981 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982
Christian Heimese93237d2007-12-19 02:37:44 +0000983 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000984 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000985 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
986 Py_DECREF(selfi);
987 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988 if (array_ass_slice(self, i, i+1,
989 (PyObject *)NULL) != 0)
990 return NULL;
991 Py_INCREF(Py_None);
992 return Py_None;
993 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000994 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000995 return NULL;
996 }
997 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
998 return NULL;
999}
1000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001001PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001002"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001003\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00001004Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001005
1006static PyObject *
1007array_pop(arrayobject *self, PyObject *args)
1008{
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001009 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001011 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001013 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001014 /* Special-case most common failure cause */
1015 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1016 return NULL;
1017 }
1018 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001019 i += Py_SIZE(self);
1020 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1022 return NULL;
1023 }
1024 v = getarrayitem((PyObject *)self,i);
1025 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1026 Py_DECREF(v);
1027 return NULL;
1028 }
1029 return v;
1030}
1031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001032PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001033"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001034\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001035Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001036
1037static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001038array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001039{
Martin v. Löwis99866332002-03-01 10:27:01 +00001040 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001041 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001042 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001043 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001044}
1045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001046PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001047"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001048\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001049 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001050
1051static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001052array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001053{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001054 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001055 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001056 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001057 return NULL;
1058 return ins(self, i, v);
1059}
1060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001061PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001062"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001063\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001064Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001065
1066
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001067static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001068array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001069{
Tim Peters077a11d2000-09-16 22:31:29 +00001070 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001071 retval = PyTuple_New(2);
1072 if (!retval)
1073 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001074
1075 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimese93237d2007-12-19 02:37:44 +00001076 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001077
1078 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001079}
1080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001081PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001082"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001083\n\
1084Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001085the length in items of the buffer used to hold array's contents\n\
1086The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001087the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001088
1089
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001090static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001091array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001092{
Christian Heimese93237d2007-12-19 02:37:44 +00001093 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001094}
1095
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001096PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001097"append(x)\n\
1098\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001099Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001100
1101
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001102static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001103array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001104{
1105 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001106 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001107
Guido van Rossum778983b1993-02-19 15:55:02 +00001108 switch (self->ob_descr->itemsize) {
1109 case 1:
1110 break;
1111 case 2:
Christian Heimese93237d2007-12-19 02:37:44 +00001112 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001113 char p0 = p[0];
1114 p[0] = p[1];
1115 p[1] = p0;
1116 }
1117 break;
1118 case 4:
Christian Heimese93237d2007-12-19 02:37:44 +00001119 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001120 char p0 = p[0];
1121 char p1 = p[1];
1122 p[0] = p[3];
1123 p[1] = p[2];
1124 p[2] = p1;
1125 p[3] = p0;
1126 }
1127 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001128 case 8:
Christian Heimese93237d2007-12-19 02:37:44 +00001129 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001130 char p0 = p[0];
1131 char p1 = p[1];
1132 char p2 = p[2];
1133 char p3 = p[3];
1134 p[0] = p[7];
1135 p[1] = p[6];
1136 p[2] = p[5];
1137 p[3] = p[4];
1138 p[4] = p3;
1139 p[5] = p2;
1140 p[6] = p1;
1141 p[7] = p0;
1142 }
1143 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001144 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001145 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001146 "don't know how to byteswap this array type");
1147 return NULL;
1148 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001149 Py_INCREF(Py_None);
1150 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001151}
1152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001153PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001154"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001155\n\
Fred Drakebf272981999-12-03 17:15:30 +00001156Byteswap all items of the array. If the items in the array are not 1, 2,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000011574, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001158
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001159static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001160array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001161{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001162 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001163 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001164 /* little buffer to hold items while swapping */
1165 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001166 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001167
Christian Heimese93237d2007-12-19 02:37:44 +00001168 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001169 for (p = self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001170 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001171 p < q;
1172 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001173 /* memory areas guaranteed disjoint, so memcpy
1174 * is safe (& memmove may be slower).
1175 */
1176 memcpy(tmp, p, itemsize);
1177 memcpy(p, q, itemsize);
1178 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001179 }
1180 }
Tim Petersbb307342000-09-10 05:22:54 +00001181
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001182 Py_INCREF(Py_None);
1183 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001184}
Guido van Rossume77a7571993-11-03 15:01:26 +00001185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001186PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001187"reverse()\n\
1188\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001189Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001190
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001191static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001192array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001193{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001194 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001195 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001196 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001197 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001198 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001199 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001200 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001201 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001202 return NULL;
1203 }
1204 if (n > 0) {
1205 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001206 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001207 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001208 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001209 size_t newbytes;
1210 /* Be careful here about overflow */
Christian Heimese93237d2007-12-19 02:37:44 +00001211 if ((newlength = Py_SIZE(self) + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001212 (newbytes = newlength * itemsize) / itemsize !=
1213 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001214 goto nomem;
1215 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001216 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001217 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001219 return NULL;
1220 }
1221 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001222 Py_SIZE(self) += n;
1223 self->allocated = Py_SIZE(self);
1224 nread = fread(item + (Py_SIZE(self) - n) * itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001225 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001226 if (nread < (size_t)n) {
Christian Heimese93237d2007-12-19 02:37:44 +00001227 Py_SIZE(self) -= (n - nread);
1228 PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001230 self->allocated = Py_SIZE(self);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 PyErr_SetString(PyExc_EOFError,
1232 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001233 return NULL;
1234 }
1235 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001236 Py_INCREF(Py_None);
1237 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001238}
1239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001240PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001241"fromfile(f, n)\n\
1242\n\
1243Read 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 +00001244array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001245
1246
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001247static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001248array_fromfile_as_read(arrayobject *self, PyObject *args)
1249{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001250 if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001251 "use array.fromfile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001252 return NULL;
1253 return array_fromfile(self, args);
1254}
1255
1256
1257static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001258array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001259{
Guido van Rossum778983b1993-02-19 15:55:02 +00001260 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001261
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001262 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001263 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001264 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001265 return NULL;
1266 }
1267 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001268 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1269 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001270 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001271 clearerr(fp);
1272 return NULL;
1273 }
1274 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001275 Py_INCREF(Py_None);
1276 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001277}
1278
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001279PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001280"tofile(f)\n\
1281\n\
1282Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001283write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001284
1285
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001286static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001287array_tofile_as_write(arrayobject *self, PyObject *f)
1288{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001289 if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001290 "use array.tofile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001291 return NULL;
1292 return array_tofile(self, f);
1293}
1294
1295
1296static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001297array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001298{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001299 Py_ssize_t n;
1300 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001301
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001302 if (!PyList_Check(list)) {
1303 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001304 return NULL;
1305 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001306 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001307 if (n > 0) {
1308 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001309 Py_ssize_t i;
Christian Heimese93237d2007-12-19 02:37:44 +00001310 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001311 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001312 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001313 return NULL;
1314 }
1315 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001316 Py_SIZE(self) += n;
1317 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001318 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001319 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001320 if ((*self->ob_descr->setitem)(self,
Christian Heimese93237d2007-12-19 02:37:44 +00001321 Py_SIZE(self) - n + i, v) != 0) {
1322 Py_SIZE(self) -= n;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001323 if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1324 return PyErr_NoMemory();
1325 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001326 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +00001327 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001328 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001329 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001330 return NULL;
1331 }
1332 }
1333 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001334 Py_INCREF(Py_None);
1335 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001336}
1337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001338PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001339"fromlist(list)\n\
1340\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001341Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001342
1343
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001344static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001345array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001346{
Christian Heimese93237d2007-12-19 02:37:44 +00001347 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001348 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001349
Guido van Rossum778983b1993-02-19 15:55:02 +00001350 if (list == NULL)
1351 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001352 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001353 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001354 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001355 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001356 return NULL;
1357 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001358 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001359 }
1360 return list;
1361}
1362
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001363PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001364"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001365\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001366Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001367
1368
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001369static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001370array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001371{
1372 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001373 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001374 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001375 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001376 return NULL;
1377 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001378 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001379 "string length not a multiple of item size");
1380 return NULL;
1381 }
1382 n = n / itemsize;
1383 if (n > 0) {
1384 char *item = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001385 if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1386 ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1387 return PyErr_NoMemory();
1388 }
Christian Heimese93237d2007-12-19 02:37:44 +00001389 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001390 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001391 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001392 return NULL;
1393 }
1394 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001395 Py_SIZE(self) += n;
1396 self->allocated = Py_SIZE(self);
1397 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001398 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001399 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001400 Py_INCREF(Py_None);
1401 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001402}
1403
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001404PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001405"fromstring(string)\n\
1406\n\
1407Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001408values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001409
1410
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001411static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001412array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001413{
Gregory P. Smith9d534572008-06-11 07:41:16 +00001414 if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1415 return PyString_FromStringAndSize(self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001416 Py_SIZE(self) * self->ob_descr->itemsize);
Gregory P. Smith9d534572008-06-11 07:41:16 +00001417 } else {
1418 return PyErr_NoMemory();
1419 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001420}
1421
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001422PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001423"tostring() -> string\n\
1424\n\
1425Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001426representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001427
Martin v. Löwis99866332002-03-01 10:27:01 +00001428
1429
1430#ifdef Py_USING_UNICODE
1431static PyObject *
1432array_fromunicode(arrayobject *self, PyObject *args)
1433{
1434 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001435 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001436
1437 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1438 return NULL;
1439 if (self->ob_descr->typecode != 'u') {
1440 PyErr_SetString(PyExc_ValueError,
1441 "fromunicode() may only be called on "
1442 "type 'u' arrays");
1443 return NULL;
1444 }
1445 if (n > 0) {
1446 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001447 if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1448 return PyErr_NoMemory();
1449 }
Christian Heimese93237d2007-12-19 02:37:44 +00001450 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001451 if (item == NULL) {
1452 PyErr_NoMemory();
1453 return NULL;
1454 }
1455 self->ob_item = (char *) item;
Christian Heimese93237d2007-12-19 02:37:44 +00001456 Py_SIZE(self) += n;
1457 self->allocated = Py_SIZE(self);
1458 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001459 ustr, n * sizeof(Py_UNICODE));
1460 }
1461
1462 Py_INCREF(Py_None);
1463 return Py_None;
1464}
1465
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001466PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001467"fromunicode(ustr)\n\
1468\n\
1469Extends this array with data from the unicode string ustr.\n\
1470The array must be a type 'u' array; otherwise a ValueError\n\
1471is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001472append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001473
1474
1475static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001476array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001477{
Martin v. Löwis99866332002-03-01 10:27:01 +00001478 if (self->ob_descr->typecode != 'u') {
1479 PyErr_SetString(PyExc_ValueError,
1480 "tounicode() may only be called on type 'u' arrays");
1481 return NULL;
1482 }
Christian Heimese93237d2007-12-19 02:37:44 +00001483 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001484}
1485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001486PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001487"tounicode() -> unicode\n\
1488\n\
1489Convert the array to a unicode string. The array must be\n\
1490a type 'u' array; otherwise a ValueError is raised. Use\n\
1491array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001492an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001493
1494#endif /* Py_USING_UNICODE */
1495
Alexandre Vassalotti999ecc02009-07-15 18:19:47 +00001496static PyObject *
1497array_reduce(arrayobject *array)
1498{
1499 PyObject *dict, *result, *list;
1500
1501 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1502 if (dict == NULL) {
1503 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1504 return NULL;
1505 PyErr_Clear();
1506 dict = Py_None;
1507 Py_INCREF(dict);
1508 }
1509 /* Unlike in Python 3.x, we never use the more efficient memory
1510 * representation of an array for pickling. This is unfortunately
1511 * necessary to allow array objects to be unpickled by Python 3.x,
1512 * since str objects from 2.x are always decoded to unicode in
1513 * Python 3.x.
1514 */
1515 list = array_tolist(array, NULL);
1516 if (list == NULL) {
1517 Py_DECREF(dict);
1518 return NULL;
1519 }
1520 result = Py_BuildValue(
1521 "O(cO)O", Py_TYPE(array), array->ob_descr->typecode, list, dict);
1522 Py_DECREF(list);
1523 Py_DECREF(dict);
1524 return result;
1525}
1526
1527PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001528
1529static PyObject *
1530array_get_typecode(arrayobject *a, void *closure)
1531{
1532 char tc = a->ob_descr->typecode;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001533 return PyString_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001534}
1535
1536static PyObject *
1537array_get_itemsize(arrayobject *a, void *closure)
1538{
1539 return PyInt_FromLong((long)a->ob_descr->itemsize);
1540}
1541
1542static PyGetSetDef array_getsets [] = {
1543 {"typecode", (getter) array_get_typecode, NULL,
1544 "the typecode character used to create the array"},
1545 {"itemsize", (getter) array_get_itemsize, NULL,
1546 "the size, in bytes, of one array item"},
1547 {NULL}
1548};
1549
Martin v. Löwis111c1802008-06-13 07:47:47 +00001550static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001551 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001552 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001553 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001554 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001555 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001556 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001557 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1558 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001559 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001560 count_doc},
Thomas Wouters9e398ca2006-08-24 18:40:20 +00001561 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001562 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001563 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001564 extend_doc},
1565 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1566 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001567 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001568 fromlist_doc},
1569 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1570 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001571#ifdef Py_USING_UNICODE
1572 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1573 fromunicode_doc},
1574#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001575 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001576 index_doc},
1577 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1578 insert_doc},
1579 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1580 pop_doc},
Georg Brandl1e7c3752008-03-25 08:37:23 +00001581 {"read", (PyCFunction)array_fromfile_as_read, METH_VARARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001582 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001583 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
Alexandre Vassalotti999ecc02009-07-15 18:19:47 +00001584 reduce_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001585 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001586 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001587 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001588 reverse_doc},
1589/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1590 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001591 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001592 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001593 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001594 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001595 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001596 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001597#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001598 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001599 tounicode_doc},
1600#endif
Georg Brandl1e7c3752008-03-25 08:37:23 +00001601 {"write", (PyCFunction)array_tofile_as_write, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001602 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001603 {NULL, NULL} /* sentinel */
1604};
1605
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001606static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001607array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001608{
Martin v. Löwis99866332002-03-01 10:27:01 +00001609 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001610 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001611 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001612
Christian Heimese93237d2007-12-19 02:37:44 +00001613 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001614 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001615 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001616 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001617 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001618 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001619
1620 if (typecode == 'c')
1621 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001622#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001623 else if (typecode == 'u')
1624 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001625#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001626 else
1627 v = array_tolist(a, NULL);
1628 t = PyObject_Repr(v);
1629 Py_XDECREF(v);
1630
1631 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001632 s = PyString_FromString(buf);
1633 PyString_ConcatAndDel(&s, t);
1634 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001635 return s;
1636}
1637
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001638static PyObject*
1639array_subscr(arrayobject* self, PyObject* item)
1640{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001641 if (PyIndex_Check(item)) {
1642 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001643 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001644 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001645 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001646 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001647 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001648 return array_item(self, i);
1649 }
1650 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001651 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001652 PyObject* result;
1653 arrayobject* ar;
1654 int itemsize = self->ob_descr->itemsize;
1655
Christian Heimese93237d2007-12-19 02:37:44 +00001656 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001657 &start, &stop, &step, &slicelength) < 0) {
1658 return NULL;
1659 }
1660
1661 if (slicelength <= 0) {
1662 return newarrayobject(&Arraytype, 0, self->ob_descr);
1663 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001664 else if (step == 1) {
1665 PyObject *result = newarrayobject(&Arraytype,
1666 slicelength, self->ob_descr);
1667 if (result == NULL)
1668 return NULL;
1669 memcpy(((arrayobject *)result)->ob_item,
1670 self->ob_item + start * itemsize,
1671 slicelength * itemsize);
1672 return result;
1673 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001674 else {
1675 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1676 if (!result) return NULL;
1677
1678 ar = (arrayobject*)result;
1679
1680 for (cur = start, i = 0; i < slicelength;
1681 cur += step, i++) {
1682 memcpy(ar->ob_item + i*itemsize,
1683 self->ob_item + cur*itemsize,
1684 itemsize);
1685 }
1686
1687 return result;
1688 }
1689 }
1690 else {
1691 PyErr_SetString(PyExc_TypeError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001692 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001693 return NULL;
1694 }
1695}
1696
1697static int
1698array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1699{
Thomas Wouters3ccec682007-08-28 15:28:19 +00001700 Py_ssize_t start, stop, step, slicelength, needed;
1701 arrayobject* other;
1702 int itemsize;
1703
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001704 if (PyIndex_Check(item)) {
1705 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001706
1707 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001708 return -1;
1709 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001710 i += Py_SIZE(self);
1711 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001712 PyErr_SetString(PyExc_IndexError,
1713 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001714 return -1;
1715 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001716 if (value == NULL) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001717 /* Fall through to slice assignment */
1718 start = i;
1719 stop = i + 1;
1720 step = 1;
1721 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001722 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001723 else
1724 return (*self->ob_descr->setitem)(self, i, value);
1725 }
1726 else if (PySlice_Check(item)) {
1727 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimese93237d2007-12-19 02:37:44 +00001728 Py_SIZE(self), &start, &stop,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001729 &step, &slicelength) < 0) {
1730 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001731 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001732 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001733 else {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001734 PyErr_SetString(PyExc_TypeError,
1735 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001736 return -1;
1737 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001738 if (value == NULL) {
1739 other = NULL;
1740 needed = 0;
1741 }
1742 else if (array_Check(value)) {
1743 other = (arrayobject *)value;
Christian Heimese93237d2007-12-19 02:37:44 +00001744 needed = Py_SIZE(other);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001745 if (self == other) {
1746 /* Special case "self[i:j] = self" -- copy self first */
1747 int ret;
1748 value = array_slice(other, 0, needed);
1749 if (value == NULL)
1750 return -1;
1751 ret = array_ass_subscr(self, item, value);
1752 Py_DECREF(value);
1753 return ret;
1754 }
1755 if (other->ob_descr != self->ob_descr) {
1756 PyErr_BadArgument();
1757 return -1;
1758 }
1759 }
1760 else {
1761 PyErr_Format(PyExc_TypeError,
1762 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +00001763 Py_TYPE(value)->tp_name);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001764 return -1;
1765 }
1766 itemsize = self->ob_descr->itemsize;
1767 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1768 if ((step > 0 && stop < start) ||
1769 (step < 0 && stop > start))
1770 stop = start;
1771 if (step == 1) {
1772 if (slicelength > needed) {
1773 memmove(self->ob_item + (start + needed) * itemsize,
1774 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001775 (Py_SIZE(self) - stop) * itemsize);
1776 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001777 needed - slicelength) < 0)
1778 return -1;
1779 }
1780 else if (slicelength < needed) {
Christian Heimese93237d2007-12-19 02:37:44 +00001781 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001782 needed - slicelength) < 0)
1783 return -1;
1784 memmove(self->ob_item + (start + needed) * itemsize,
1785 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001786 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001787 }
1788 if (needed > 0)
1789 memcpy(self->ob_item + start * itemsize,
1790 other->ob_item, needed * itemsize);
1791 return 0;
1792 }
1793 else if (needed == 0) {
1794 /* Delete slice */
Mark Dickinson36ecd672010-01-29 17:11:39 +00001795 size_t cur;
1796 Py_ssize_t i;
1797
Thomas Wouters3ccec682007-08-28 15:28:19 +00001798 if (step < 0) {
1799 stop = start + 1;
1800 start = stop + step * (slicelength - 1) - 1;
1801 step = -step;
1802 }
1803 for (cur = start, i = 0; i < slicelength;
1804 cur += step, i++) {
1805 Py_ssize_t lim = step - 1;
1806
Mark Dickinsond5fdc062010-02-14 13:40:30 +00001807 if (cur + step >= (size_t)Py_SIZE(self))
Christian Heimese93237d2007-12-19 02:37:44 +00001808 lim = Py_SIZE(self) - cur - 1;
Thomas Wouters3ccec682007-08-28 15:28:19 +00001809 memmove(self->ob_item + (cur - i) * itemsize,
1810 self->ob_item + (cur + 1) * itemsize,
1811 lim * itemsize);
1812 }
1813 cur = start + slicelength * step;
Mark Dickinsond5fdc062010-02-14 13:40:30 +00001814 if (cur < (size_t)Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001815 memmove(self->ob_item + (cur-slicelength) * itemsize,
1816 self->ob_item + cur * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001817 (Py_SIZE(self) - cur) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001818 }
Christian Heimese93237d2007-12-19 02:37:44 +00001819 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Wouters3ccec682007-08-28 15:28:19 +00001820 return -1;
1821 return 0;
1822 }
1823 else {
1824 Py_ssize_t cur, i;
1825
1826 if (needed != slicelength) {
1827 PyErr_Format(PyExc_ValueError,
1828 "attempt to assign array of size %zd "
1829 "to extended slice of size %zd",
1830 needed, slicelength);
1831 return -1;
1832 }
1833 for (cur = start, i = 0; i < slicelength;
1834 cur += step, i++) {
1835 memcpy(self->ob_item + cur * itemsize,
1836 other->ob_item + i * itemsize,
1837 itemsize);
1838 }
1839 return 0;
1840 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001841}
1842
1843static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001844 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001845 (binaryfunc)array_subscr,
1846 (objobjargproc)array_ass_subscr
1847};
1848
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001849static const void *emptybuf = "";
1850
Martin v. Löwis18e16552006-02-15 17:27:45 +00001851static Py_ssize_t
1852array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001853{
1854 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001855 PyErr_SetString(PyExc_SystemError,
1856 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001857 return -1;
1858 }
1859 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001860 if (*ptr == NULL)
1861 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001862 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001863}
1864
Martin v. Löwis18e16552006-02-15 17:27:45 +00001865static Py_ssize_t
1866array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001867{
1868 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001869 PyErr_SetString(PyExc_SystemError,
1870 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001871 return -1;
1872 }
1873 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001874 if (*ptr == NULL)
1875 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001876 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001877}
1878
Martin v. Löwis18e16552006-02-15 17:27:45 +00001879static Py_ssize_t
1880array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001881{
1882 if ( lenp )
Christian Heimese93237d2007-12-19 02:37:44 +00001883 *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001884 return 1;
1885}
1886
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001887static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001888 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001889 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001890 (ssizeargfunc)array_repeat, /*sq_repeat*/
1891 (ssizeargfunc)array_item, /*sq_item*/
1892 (ssizessizeargfunc)array_slice, /*sq_slice*/
1893 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1894 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001895 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001896 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001897 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001898};
1899
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001900static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001901 (readbufferproc)array_buffer_getreadbuf,
1902 (writebufferproc)array_buffer_getwritebuf,
1903 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001904 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001905};
1906
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001907static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001908array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001909{
1910 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001911 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001912 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001913
Georg Brandlb84c1372007-01-21 10:28:43 +00001914 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001915 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001916
1917 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1918 return NULL;
1919
1920 if (!(initial == NULL || PyList_Check(initial)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001921 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001922 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001923 it = PyObject_GetIter(initial);
1924 if (it == NULL)
1925 return NULL;
1926 /* We set initial to NULL so that the subsequent code
1927 will create an empty array of the appropriate type
1928 and afterwards we can use array_iter_extend to populate
1929 the array.
1930 */
1931 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001932 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001933 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1934 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001935 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001936 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001937
1938 if (initial == NULL || !(PyList_Check(initial)
1939 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001940 len = 0;
1941 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001942 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001943
1944 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001945 if (a == NULL)
1946 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001947
Guido van Rossum778983b1993-02-19 15:55:02 +00001948 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001949 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001950 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001951 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001952 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001953 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001954 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001955 return NULL;
1956 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001957 if (setarrayitem(a, i, v) != 0) {
1958 Py_DECREF(v);
1959 Py_DECREF(a);
1960 return NULL;
1961 }
1962 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001963 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001964 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001965 PyObject *t_initial, *v;
1966 t_initial = PyTuple_Pack(1, initial);
1967 if (t_initial == NULL) {
1968 Py_DECREF(a);
1969 return NULL;
1970 }
1971 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001972 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001973 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001974 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001975 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001976 return NULL;
1977 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001978 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001979#ifdef Py_USING_UNICODE
1980 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001981 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001982 if (n > 0) {
1983 arrayobject *self = (arrayobject *)a;
1984 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001985 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001986 if (item == NULL) {
1987 PyErr_NoMemory();
1988 Py_DECREF(a);
1989 return NULL;
1990 }
1991 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001992 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001993 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimese93237d2007-12-19 02:37:44 +00001994 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001995 }
1996#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001997 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001998 if (it != NULL) {
1999 if (array_iter_extend((arrayobject *)a, it) == -1) {
2000 Py_DECREF(it);
2001 Py_DECREF(a);
2002 return NULL;
2003 }
2004 Py_DECREF(it);
2005 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002006 return a;
2007 }
2008 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002009 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00002010 "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 +00002011 return NULL;
2012}
2013
Guido van Rossum778983b1993-02-19 15:55:02 +00002014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002015PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002016"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002017an array of basic values: characters, integers, floating point\n\
2018numbers. Arrays are sequence types and behave very much like lists,\n\
2019except that the type of objects stored in them is constrained. The\n\
2020type is specified at object creation time by using a type code, which\n\
2021is a single character. The following type codes are defined:\n\
2022\n\
2023 Type code C Type Minimum size in bytes \n\
2024 'c' character 1 \n\
2025 'b' signed integer 1 \n\
2026 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002027 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002028 'h' signed integer 2 \n\
2029 'H' unsigned integer 2 \n\
2030 'i' signed integer 2 \n\
2031 'I' unsigned integer 2 \n\
2032 'l' signed integer 4 \n\
2033 'L' unsigned integer 4 \n\
2034 'f' floating point 4 \n\
2035 'd' floating point 8 \n\
2036\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002037The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002038\n\
2039array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002040");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002042PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002043"array(typecode [, initializer]) -> array\n\
2044\n\
2045Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002046initialized from the optional initializer value, which must be a list,\n\
2047string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002048\n\
2049Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002050the type of objects stored in them is constrained.\n\
2051\n\
2052Methods:\n\
2053\n\
2054append() -- append a new item to the end of the array\n\
2055buffer_info() -- return information giving the current memory info\n\
2056byteswap() -- byteswap all the items of the array\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002057count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002058extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002059fromfile() -- read items from a file object\n\
2060fromlist() -- append items from the list\n\
2061fromstring() -- append items from the string\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002062index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002063insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002064pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002065read() -- DEPRECATED, use fromfile()\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002066remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002067reverse() -- reverse the order of the items in the array\n\
2068tofile() -- write all items to a file object\n\
2069tolist() -- return the array converted to an ordinary list\n\
2070tostring() -- return the array converted to a string\n\
2071write() -- DEPRECATED, use tofile()\n\
2072\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002073Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002074\n\
2075typecode -- the typecode character used to create the array\n\
2076itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002077");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002078
Raymond Hettinger625812f2003-01-07 01:58:52 +00002079static PyObject *array_iter(arrayobject *ao);
2080
Tim Peters0c322792002-07-17 16:49:03 +00002081static PyTypeObject Arraytype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002082 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002083 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002084 sizeof(arrayobject),
2085 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002086 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002087 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002088 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002089 0, /* tp_setattr */
2090 0, /* tp_compare */
2091 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002092 0, /* tp_as_number*/
2093 &array_as_sequence, /* tp_as_sequence*/
2094 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002095 0, /* tp_hash */
2096 0, /* tp_call */
2097 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002098 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002099 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002100 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002101 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002102 arraytype_doc, /* tp_doc */
2103 0, /* tp_traverse */
2104 0, /* tp_clear */
2105 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002106 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002107 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002108 0, /* tp_iternext */
2109 array_methods, /* tp_methods */
2110 0, /* tp_members */
2111 array_getsets, /* tp_getset */
2112 0, /* tp_base */
2113 0, /* tp_dict */
2114 0, /* tp_descr_get */
2115 0, /* tp_descr_set */
2116 0, /* tp_dictoffset */
2117 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002118 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002119 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002120 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002121};
2122
Raymond Hettinger625812f2003-01-07 01:58:52 +00002123
2124/*********************** Array Iterator **************************/
2125
2126typedef struct {
2127 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002128 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002129 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002130 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002131} arrayiterobject;
2132
2133static PyTypeObject PyArrayIter_Type;
2134
2135#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2136
2137static PyObject *
2138array_iter(arrayobject *ao)
2139{
2140 arrayiterobject *it;
2141
2142 if (!array_Check(ao)) {
2143 PyErr_BadInternalCall();
2144 return NULL;
2145 }
2146
2147 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2148 if (it == NULL)
2149 return NULL;
2150
2151 Py_INCREF(ao);
2152 it->ao = ao;
2153 it->index = 0;
2154 it->getitem = ao->ob_descr->getitem;
2155 PyObject_GC_Track(it);
2156 return (PyObject *)it;
2157}
2158
2159static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002160arrayiter_next(arrayiterobject *it)
2161{
2162 assert(PyArrayIter_Check(it));
Christian Heimese93237d2007-12-19 02:37:44 +00002163 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002164 return (*it->getitem)(it->ao, it->index++);
2165 return NULL;
2166}
2167
2168static void
2169arrayiter_dealloc(arrayiterobject *it)
2170{
2171 PyObject_GC_UnTrack(it);
2172 Py_XDECREF(it->ao);
2173 PyObject_GC_Del(it);
2174}
2175
2176static int
2177arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2178{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002179 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002180 return 0;
2181}
2182
2183static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002184 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002185 "arrayiterator", /* tp_name */
2186 sizeof(arrayiterobject), /* tp_basicsize */
2187 0, /* tp_itemsize */
2188 /* methods */
2189 (destructor)arrayiter_dealloc, /* tp_dealloc */
2190 0, /* tp_print */
2191 0, /* tp_getattr */
2192 0, /* tp_setattr */
2193 0, /* tp_compare */
2194 0, /* tp_repr */
2195 0, /* tp_as_number */
2196 0, /* tp_as_sequence */
2197 0, /* tp_as_mapping */
2198 0, /* tp_hash */
2199 0, /* tp_call */
2200 0, /* tp_str */
2201 PyObject_GenericGetAttr, /* tp_getattro */
2202 0, /* tp_setattro */
2203 0, /* tp_as_buffer */
2204 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2205 0, /* tp_doc */
2206 (traverseproc)arrayiter_traverse, /* tp_traverse */
2207 0, /* tp_clear */
2208 0, /* tp_richcompare */
2209 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002210 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002211 (iternextfunc)arrayiter_next, /* tp_iternext */
2212 0, /* tp_methods */
2213};
2214
2215
2216/*********************** Install Module **************************/
2217
Martin v. Löwis99866332002-03-01 10:27:01 +00002218/* No functions in array module. */
2219static PyMethodDef a_methods[] = {
2220 {NULL, NULL, 0, NULL} /* Sentinel */
2221};
2222
2223
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002224PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002225initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002226{
Fred Drakef4e34842002-04-01 03:45:06 +00002227 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002228
Martin v. Löwis99866332002-03-01 10:27:01 +00002229 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002230 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002231 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002232 if (m == NULL)
2233 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002234
2235 Py_INCREF((PyObject *)&Arraytype);
2236 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2237 Py_INCREF((PyObject *)&Arraytype);
2238 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002239 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002240}