blob: 018ab873d42457aa10fda8b0f5375b4afcd375d5 [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 */
1795 Py_ssize_t cur, i;
1796
1797 if (step < 0) {
1798 stop = start + 1;
1799 start = stop + step * (slicelength - 1) - 1;
1800 step = -step;
1801 }
1802 for (cur = start, i = 0; i < slicelength;
1803 cur += step, i++) {
1804 Py_ssize_t lim = step - 1;
1805
Christian Heimese93237d2007-12-19 02:37:44 +00001806 if (cur + step >= Py_SIZE(self))
1807 lim = Py_SIZE(self) - cur - 1;
Thomas Wouters3ccec682007-08-28 15:28:19 +00001808 memmove(self->ob_item + (cur - i) * itemsize,
1809 self->ob_item + (cur + 1) * itemsize,
1810 lim * itemsize);
1811 }
1812 cur = start + slicelength * step;
Christian Heimese93237d2007-12-19 02:37:44 +00001813 if (cur < Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001814 memmove(self->ob_item + (cur-slicelength) * itemsize,
1815 self->ob_item + cur * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001816 (Py_SIZE(self) - cur) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001817 }
Christian Heimese93237d2007-12-19 02:37:44 +00001818 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Wouters3ccec682007-08-28 15:28:19 +00001819 return -1;
1820 return 0;
1821 }
1822 else {
1823 Py_ssize_t cur, i;
1824
1825 if (needed != slicelength) {
1826 PyErr_Format(PyExc_ValueError,
1827 "attempt to assign array of size %zd "
1828 "to extended slice of size %zd",
1829 needed, slicelength);
1830 return -1;
1831 }
1832 for (cur = start, i = 0; i < slicelength;
1833 cur += step, i++) {
1834 memcpy(self->ob_item + cur * itemsize,
1835 other->ob_item + i * itemsize,
1836 itemsize);
1837 }
1838 return 0;
1839 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001840}
1841
1842static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001843 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001844 (binaryfunc)array_subscr,
1845 (objobjargproc)array_ass_subscr
1846};
1847
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001848static const void *emptybuf = "";
1849
Martin v. Löwis18e16552006-02-15 17:27:45 +00001850static Py_ssize_t
1851array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001852{
1853 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001854 PyErr_SetString(PyExc_SystemError,
1855 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001856 return -1;
1857 }
1858 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001859 if (*ptr == NULL)
1860 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001861 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001862}
1863
Martin v. Löwis18e16552006-02-15 17:27:45 +00001864static Py_ssize_t
1865array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001866{
1867 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001868 PyErr_SetString(PyExc_SystemError,
1869 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001870 return -1;
1871 }
1872 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001873 if (*ptr == NULL)
1874 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001875 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001876}
1877
Martin v. Löwis18e16552006-02-15 17:27:45 +00001878static Py_ssize_t
1879array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001880{
1881 if ( lenp )
Christian Heimese93237d2007-12-19 02:37:44 +00001882 *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001883 return 1;
1884}
1885
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001886static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001887 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001888 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001889 (ssizeargfunc)array_repeat, /*sq_repeat*/
1890 (ssizeargfunc)array_item, /*sq_item*/
1891 (ssizessizeargfunc)array_slice, /*sq_slice*/
1892 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1893 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001894 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001895 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001896 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001897};
1898
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001899static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001900 (readbufferproc)array_buffer_getreadbuf,
1901 (writebufferproc)array_buffer_getwritebuf,
1902 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001903 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001904};
1905
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001906static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001907array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001908{
1909 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001910 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001911 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001912
Georg Brandlb84c1372007-01-21 10:28:43 +00001913 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001914 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001915
1916 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1917 return NULL;
1918
1919 if (!(initial == NULL || PyList_Check(initial)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001920 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001921 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001922 it = PyObject_GetIter(initial);
1923 if (it == NULL)
1924 return NULL;
1925 /* We set initial to NULL so that the subsequent code
1926 will create an empty array of the appropriate type
1927 and afterwards we can use array_iter_extend to populate
1928 the array.
1929 */
1930 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001931 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001932 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1933 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001934 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001935 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001936
1937 if (initial == NULL || !(PyList_Check(initial)
1938 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001939 len = 0;
1940 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001941 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001942
1943 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001944 if (a == NULL)
1945 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001946
Guido van Rossum778983b1993-02-19 15:55:02 +00001947 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001948 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001949 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001950 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001951 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001952 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001953 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001954 return NULL;
1955 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001956 if (setarrayitem(a, i, v) != 0) {
1957 Py_DECREF(v);
1958 Py_DECREF(a);
1959 return NULL;
1960 }
1961 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001962 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001963 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001964 PyObject *t_initial, *v;
1965 t_initial = PyTuple_Pack(1, initial);
1966 if (t_initial == NULL) {
1967 Py_DECREF(a);
1968 return NULL;
1969 }
1970 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001971 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001972 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001973 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001974 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001975 return NULL;
1976 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001977 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001978#ifdef Py_USING_UNICODE
1979 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001980 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001981 if (n > 0) {
1982 arrayobject *self = (arrayobject *)a;
1983 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001984 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001985 if (item == NULL) {
1986 PyErr_NoMemory();
1987 Py_DECREF(a);
1988 return NULL;
1989 }
1990 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001991 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001992 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimese93237d2007-12-19 02:37:44 +00001993 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001994 }
1995#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001996 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001997 if (it != NULL) {
1998 if (array_iter_extend((arrayobject *)a, it) == -1) {
1999 Py_DECREF(it);
2000 Py_DECREF(a);
2001 return NULL;
2002 }
2003 Py_DECREF(it);
2004 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002005 return a;
2006 }
2007 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002008 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00002009 "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00002010 return NULL;
2011}
2012
Guido van Rossum778983b1993-02-19 15:55:02 +00002013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002014PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002015"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002016an array of basic values: characters, integers, floating point\n\
2017numbers. Arrays are sequence types and behave very much like lists,\n\
2018except that the type of objects stored in them is constrained. The\n\
2019type is specified at object creation time by using a type code, which\n\
2020is a single character. The following type codes are defined:\n\
2021\n\
2022 Type code C Type Minimum size in bytes \n\
2023 'c' character 1 \n\
2024 'b' signed integer 1 \n\
2025 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002026 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002027 'h' signed integer 2 \n\
2028 'H' unsigned integer 2 \n\
2029 'i' signed integer 2 \n\
2030 'I' unsigned integer 2 \n\
2031 'l' signed integer 4 \n\
2032 'L' unsigned integer 4 \n\
2033 'f' floating point 4 \n\
2034 'd' floating point 8 \n\
2035\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002036The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002037\n\
2038array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002039");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002041PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002042"array(typecode [, initializer]) -> array\n\
2043\n\
2044Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002045initialized from the optional initializer value, which must be a list,\n\
2046string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002047\n\
2048Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002049the type of objects stored in them is constrained.\n\
2050\n\
2051Methods:\n\
2052\n\
2053append() -- append a new item to the end of the array\n\
2054buffer_info() -- return information giving the current memory info\n\
2055byteswap() -- byteswap all the items of the array\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002056count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002057extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002058fromfile() -- read items from a file object\n\
2059fromlist() -- append items from the list\n\
2060fromstring() -- append items from the string\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002061index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002062insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002063pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002064read() -- DEPRECATED, use fromfile()\n\
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002065remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002066reverse() -- reverse the order of the items in the array\n\
2067tofile() -- write all items to a file object\n\
2068tolist() -- return the array converted to an ordinary list\n\
2069tostring() -- return the array converted to a string\n\
2070write() -- DEPRECATED, use tofile()\n\
2071\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002072Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002073\n\
2074typecode -- the typecode character used to create the array\n\
2075itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002076");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002077
Raymond Hettinger625812f2003-01-07 01:58:52 +00002078static PyObject *array_iter(arrayobject *ao);
2079
Tim Peters0c322792002-07-17 16:49:03 +00002080static PyTypeObject Arraytype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002081 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002082 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002083 sizeof(arrayobject),
2084 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002085 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002086 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002087 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002088 0, /* tp_setattr */
2089 0, /* tp_compare */
2090 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002091 0, /* tp_as_number*/
2092 &array_as_sequence, /* tp_as_sequence*/
2093 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002094 0, /* tp_hash */
2095 0, /* tp_call */
2096 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002097 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002098 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002099 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002100 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002101 arraytype_doc, /* tp_doc */
2102 0, /* tp_traverse */
2103 0, /* tp_clear */
2104 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002105 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002106 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002107 0, /* tp_iternext */
2108 array_methods, /* tp_methods */
2109 0, /* tp_members */
2110 array_getsets, /* tp_getset */
2111 0, /* tp_base */
2112 0, /* tp_dict */
2113 0, /* tp_descr_get */
2114 0, /* tp_descr_set */
2115 0, /* tp_dictoffset */
2116 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002117 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002118 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002119 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002120};
2121
Raymond Hettinger625812f2003-01-07 01:58:52 +00002122
2123/*********************** Array Iterator **************************/
2124
2125typedef struct {
2126 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002127 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002128 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002129 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002130} arrayiterobject;
2131
2132static PyTypeObject PyArrayIter_Type;
2133
2134#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2135
2136static PyObject *
2137array_iter(arrayobject *ao)
2138{
2139 arrayiterobject *it;
2140
2141 if (!array_Check(ao)) {
2142 PyErr_BadInternalCall();
2143 return NULL;
2144 }
2145
2146 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2147 if (it == NULL)
2148 return NULL;
2149
2150 Py_INCREF(ao);
2151 it->ao = ao;
2152 it->index = 0;
2153 it->getitem = ao->ob_descr->getitem;
2154 PyObject_GC_Track(it);
2155 return (PyObject *)it;
2156}
2157
2158static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002159arrayiter_next(arrayiterobject *it)
2160{
2161 assert(PyArrayIter_Check(it));
Christian Heimese93237d2007-12-19 02:37:44 +00002162 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002163 return (*it->getitem)(it->ao, it->index++);
2164 return NULL;
2165}
2166
2167static void
2168arrayiter_dealloc(arrayiterobject *it)
2169{
2170 PyObject_GC_UnTrack(it);
2171 Py_XDECREF(it->ao);
2172 PyObject_GC_Del(it);
2173}
2174
2175static int
2176arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2177{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002178 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002179 return 0;
2180}
2181
2182static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002183 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002184 "arrayiterator", /* tp_name */
2185 sizeof(arrayiterobject), /* tp_basicsize */
2186 0, /* tp_itemsize */
2187 /* methods */
2188 (destructor)arrayiter_dealloc, /* tp_dealloc */
2189 0, /* tp_print */
2190 0, /* tp_getattr */
2191 0, /* tp_setattr */
2192 0, /* tp_compare */
2193 0, /* tp_repr */
2194 0, /* tp_as_number */
2195 0, /* tp_as_sequence */
2196 0, /* tp_as_mapping */
2197 0, /* tp_hash */
2198 0, /* tp_call */
2199 0, /* tp_str */
2200 PyObject_GenericGetAttr, /* tp_getattro */
2201 0, /* tp_setattro */
2202 0, /* tp_as_buffer */
2203 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2204 0, /* tp_doc */
2205 (traverseproc)arrayiter_traverse, /* tp_traverse */
2206 0, /* tp_clear */
2207 0, /* tp_richcompare */
2208 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002209 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002210 (iternextfunc)arrayiter_next, /* tp_iternext */
2211 0, /* tp_methods */
2212};
2213
2214
2215/*********************** Install Module **************************/
2216
Martin v. Löwis99866332002-03-01 10:27:01 +00002217/* No functions in array module. */
2218static PyMethodDef a_methods[] = {
2219 {NULL, NULL, 0, NULL} /* Sentinel */
2220};
2221
2222
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002223PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002224initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002225{
Fred Drakef4e34842002-04-01 03:45:06 +00002226 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002227
Martin v. Löwis99866332002-03-01 10:27:01 +00002228 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002229 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002230 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002231 if (m == NULL)
2232 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002233
2234 Py_INCREF((PyObject *)&Arraytype);
2235 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2236 Py_INCREF((PyObject *)&Arraytype);
2237 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002238 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002239}