blob: c6de243264e46aedd0b95de6d216d67327cda9c9 [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 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Thomas Wouters0e3f5912006-08-11 14:57:12 +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)
42#define array_CheckExact(op) ((op)->ob_type == &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 &&
56 self->ob_size < newsize + 16 &&
57 self->ob_item != NULL) {
58 self->ob_size = newsize;
59 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
74 _new_size = (newsize >> 4) + (self->ob_size < 8 ? 3 : 7) + newsize;
75 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;
87 self->ob_size = newsize;
88 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{
Roger E. Masse2919eaa1996-12-09 20:10:36 +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 +0000173static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000174u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000175{
176 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
177}
178
179static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000180u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000181{
182 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000183 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000184
185 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
186 return -1;
187 if (len != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000188 PyErr_SetString(PyExc_TypeError,
189 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000190 return -1;
191 }
192 if (i >= 0)
193 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
194 return 0;
195}
Martin v. Löwis99866332002-03-01 10:27:01 +0000196
Guido van Rossum549ab711997-01-03 19:09:47 +0000197static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000198h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000199{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000200 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000201}
202
203static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000204h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000205{
206 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000207 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000208 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000209 return -1;
210 if (i >= 0)
211 ((short *)ap->ob_item)[i] = x;
212 return 0;
213}
214
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000215static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000216HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000217{
218 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
219}
220
Fred Drake541dc3b2000-06-28 17:49:30 +0000221static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000222HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000223{
224 int x;
225 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
226 must use the next size up and manually do the overflow checking */
227 if (!PyArg_Parse(v, "i;array item must be integer", &x))
228 return -1;
229 else if (x < 0) {
230 PyErr_SetString(PyExc_OverflowError,
231 "unsigned short is less than minimum");
232 return -1;
233 }
234 else if (x > USHRT_MAX) {
235 PyErr_SetString(PyExc_OverflowError,
236 "unsigned short is greater than maximum");
237 return -1;
238 }
239 if (i >= 0)
240 ((short *)ap->ob_item)[i] = (short)x;
241 return 0;
242}
Guido van Rossum549ab711997-01-03 19:09:47 +0000243
244static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000245i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000246{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000247 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000248}
249
250static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000251i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000252{
253 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000254 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000255 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000256 return -1;
257 if (i >= 0)
258 ((int *)ap->ob_item)[i] = x;
259 return 0;
260}
261
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000262static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000263II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000264{
265 return PyLong_FromUnsignedLong(
266 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
267}
268
269static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000270II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000271{
272 unsigned long x;
273 if (PyLong_Check(v)) {
274 x = PyLong_AsUnsignedLong(v);
275 if (x == (unsigned long) -1 && PyErr_Occurred())
276 return -1;
277 }
278 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000279 long y;
280 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000281 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000282 if (y < 0) {
283 PyErr_SetString(PyExc_OverflowError,
284 "unsigned int is less than minimum");
285 return -1;
286 }
287 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000288
Guido van Rossum549ab711997-01-03 19:09:47 +0000289 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000290 if (x > UINT_MAX) {
291 PyErr_SetString(PyExc_OverflowError,
292 "unsigned int is greater than maximum");
293 return -1;
294 }
295
Guido van Rossum549ab711997-01-03 19:09:47 +0000296 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000297 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000298 return 0;
299}
300
301static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000302l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000303{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000304 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000305}
306
307static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000308l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000309{
310 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000311 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000312 return -1;
313 if (i >= 0)
314 ((long *)ap->ob_item)[i] = x;
315 return 0;
316}
317
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000318static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000319LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000320{
321 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
322}
323
324static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000325LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000326{
327 unsigned long x;
328 if (PyLong_Check(v)) {
329 x = PyLong_AsUnsignedLong(v);
330 if (x == (unsigned long) -1 && PyErr_Occurred())
331 return -1;
332 }
333 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000334 long y;
335 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000336 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000337 if (y < 0) {
338 PyErr_SetString(PyExc_OverflowError,
339 "unsigned long is less than minimum");
340 return -1;
341 }
342 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000343
Guido van Rossum549ab711997-01-03 19:09:47 +0000344 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000345 if (x > ULONG_MAX) {
346 PyErr_SetString(PyExc_OverflowError,
347 "unsigned long is greater than maximum");
348 return -1;
349 }
Tim Petersbb307342000-09-10 05:22:54 +0000350
Guido van Rossum549ab711997-01-03 19:09:47 +0000351 if (i >= 0)
352 ((unsigned long *)ap->ob_item)[i] = x;
353 return 0;
354}
355
356static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000357f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000358{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000359 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000360}
361
362static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000363f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000364{
365 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000366 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000367 return -1;
368 if (i >= 0)
369 ((float *)ap->ob_item)[i] = x;
370 return 0;
371}
372
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000373static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000374d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000375{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000376 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000377}
378
379static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000380d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000381{
382 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000383 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000384 return -1;
385 if (i >= 0)
386 ((double *)ap->ob_item)[i] = x;
387 return 0;
388}
389
390/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000391static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000392 {'c', sizeof(char), c_getitem, c_setitem},
393 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000394 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000395 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000396 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000397 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000398 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000399 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000401 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000402 {'f', sizeof(float), f_getitem, f_setitem},
403 {'d', sizeof(double), d_getitem, d_setitem},
404 {'\0', 0, 0, 0} /* Sentinel */
405};
Tim Petersbb307342000-09-10 05:22:54 +0000406
407/****************************************************************************
408Implementations of array object methods.
409****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000410
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000411static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000412newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000413{
Guido van Rossum778983b1993-02-19 15:55:02 +0000414 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000415 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000416
Guido van Rossum778983b1993-02-19 15:55:02 +0000417 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000418 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000419 return NULL;
420 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000421
Guido van Rossum778983b1993-02-19 15:55:02 +0000422 nbytes = size * descr->itemsize;
423 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000424 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000425 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000427 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000428 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000429 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000431 op->ob_size = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000432 if (size <= 0) {
433 op->ob_item = NULL;
434 }
435 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000436 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000437 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000438 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000439 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000440 }
441 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000442 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000443 op->allocated = size;
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000444 op->weakreflist = NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000445 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000446}
447
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000448static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000449getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000450{
451 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000452 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000453 ap = (arrayobject *)op;
Walter Dörwald8bb1ae92003-05-23 10:01:07 +0000454 assert(i>=0 && i<ap->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000455 return (*ap->ob_descr->getitem)(ap, i);
456}
457
458static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000459ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000460{
Guido van Rossum778983b1993-02-19 15:55:02 +0000461 char *items;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000462 Py_ssize_t n = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000464 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 return -1;
466 }
467 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
468 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000469
470 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000471 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000472 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000473 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000474 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000475 if (where < 0)
476 where = 0;
477 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 if (where > n)
479 where = n;
480 /* appends don't need to call memmove() */
481 if (where != n)
482 memmove(items + (where+1)*self->ob_descr->itemsize,
483 items + where*self->ob_descr->itemsize,
484 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000485 return (*self->ob_descr->setitem)(self, where, v);
486}
487
Guido van Rossum778983b1993-02-19 15:55:02 +0000488/* Methods */
489
490static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000491array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000492{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000493 if (op->weakreflist != NULL)
494 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000495 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000496 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000497 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000498}
499
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000500static PyObject *
501array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000502{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000503 arrayobject *va, *wa;
504 PyObject *vi = NULL;
505 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000506 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507 PyObject *res;
508
Martin v. Löwis99866332002-03-01 10:27:01 +0000509 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000510 Py_INCREF(Py_NotImplemented);
511 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000512 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000513
514 va = (arrayobject *)v;
515 wa = (arrayobject *)w;
516
517 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
518 /* Shortcut: if the lengths differ, the arrays differ */
519 if (op == Py_EQ)
520 res = Py_False;
521 else
522 res = Py_True;
523 Py_INCREF(res);
524 return res;
525 }
526
527 /* Search for the first index where items are different */
528 k = 1;
529 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
530 vi = getarrayitem(v, i);
531 wi = getarrayitem(w, i);
532 if (vi == NULL || wi == NULL) {
533 Py_XDECREF(vi);
534 Py_XDECREF(wi);
535 return NULL;
536 }
537 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
538 if (k == 0)
539 break; /* Keeping vi and wi alive! */
540 Py_DECREF(vi);
541 Py_DECREF(wi);
542 if (k < 0)
543 return NULL;
544 }
545
546 if (k) {
547 /* No more items to compare -- compare sizes */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000548 Py_ssize_t vs = va->ob_size;
549 Py_ssize_t ws = wa->ob_size;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000550 int cmp;
551 switch (op) {
552 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000553 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000554 case Py_EQ: cmp = vs == ws; break;
555 case Py_NE: cmp = vs != ws; break;
556 case Py_GT: cmp = vs > ws; break;
557 case Py_GE: cmp = vs >= ws; break;
558 default: return NULL; /* cannot happen */
559 }
560 if (cmp)
561 res = Py_True;
562 else
563 res = Py_False;
564 Py_INCREF(res);
565 return res;
566 }
567
568 /* We have an item that differs. First, shortcuts for EQ/NE */
569 if (op == Py_EQ) {
570 Py_INCREF(Py_False);
571 res = Py_False;
572 }
573 else if (op == Py_NE) {
574 Py_INCREF(Py_True);
575 res = Py_True;
576 }
577 else {
578 /* Compare the final item again using the proper operator */
579 res = PyObject_RichCompare(vi, wi, op);
580 }
581 Py_DECREF(vi);
582 Py_DECREF(wi);
583 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000584}
585
Martin v. Löwis18e16552006-02-15 17:27:45 +0000586static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000587array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000588{
589 return a->ob_size;
590}
591
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000592static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000593array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000594{
595 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000597 return NULL;
598 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000599 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000600}
601
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000602static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000603array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000604{
605 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000606 if (ilow < 0)
607 ilow = 0;
608 else if (ilow > a->ob_size)
609 ilow = a->ob_size;
610 if (ihigh < 0)
611 ihigh = 0;
612 if (ihigh < ilow)
613 ihigh = ilow;
614 else if (ihigh > a->ob_size)
615 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000616 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000617 if (np == NULL)
618 return NULL;
619 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
620 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000621 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000622}
623
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000624static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000625array_copy(arrayobject *a, PyObject *unused)
626{
627 return array_slice(a, 0, a->ob_size);
628}
629
630PyDoc_STRVAR(copy_doc,
631"copy(array)\n\
632\n\
633 Return a copy of the array.");
634
635static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000636array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000637{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000638 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000639 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000640 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000641 PyErr_Format(PyExc_TypeError,
642 "can only append array (not \"%.200s\") to array",
643 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000644 return NULL;
645 }
646#define b ((arrayobject *)bb)
647 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000648 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000649 return NULL;
650 }
651 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000652 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 if (np == NULL) {
654 return NULL;
655 }
656 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
657 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000658 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000659 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000660#undef b
661}
662
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000663static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000664array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000665{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000666 Py_ssize_t i;
667 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000668 arrayobject *np;
669 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000670 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000671 if (n < 0)
672 n = 0;
673 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000674 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 if (np == NULL)
676 return NULL;
677 p = np->ob_item;
678 nbytes = a->ob_size * a->ob_descr->itemsize;
679 for (i = 0; i < n; i++) {
680 memcpy(p, a->ob_item, nbytes);
681 p += nbytes;
682 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000683 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000684}
685
686static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000687array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000688{
689 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000690 Py_ssize_t n; /* Size of replacement array */
691 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000692#define b ((arrayobject *)v)
693 if (v == NULL)
694 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000695 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000696 n = b->ob_size;
697 if (a == b) {
698 /* Special case "a[i:j] = a" -- copy b first */
699 int ret;
700 v = array_slice(b, 0, n);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000701 if (!v)
702 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000703 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000704 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000705 return ret;
706 }
707 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000708 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000709 return -1;
710 }
711 }
712 else {
Fred Drake137507e2000-06-01 02:02:46 +0000713 PyErr_Format(PyExc_TypeError,
714 "can only assign array (not \"%.200s\") to array slice",
715 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000716 return -1;
717 }
718 if (ilow < 0)
719 ilow = 0;
720 else if (ilow > a->ob_size)
721 ilow = a->ob_size;
722 if (ihigh < 0)
723 ihigh = 0;
724 if (ihigh < ilow)
725 ihigh = ilow;
726 else if (ihigh > a->ob_size)
727 ihigh = a->ob_size;
728 item = a->ob_item;
729 d = n - (ihigh-ilow);
730 if (d < 0) { /* Delete -d items */
731 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
732 item + ihigh*a->ob_descr->itemsize,
733 (a->ob_size-ihigh)*a->ob_descr->itemsize);
734 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000735 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000736 /* Can't fail */
737 a->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000738 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000739 }
740 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000741 PyMem_RESIZE(item, char,
742 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000743 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000744 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000745 return -1;
746 }
747 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
748 item + ihigh*a->ob_descr->itemsize,
749 (a->ob_size-ihigh)*a->ob_descr->itemsize);
750 a->ob_item = item;
751 a->ob_size += d;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000752 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000753 }
754 if (n > 0)
755 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
756 n*b->ob_descr->itemsize);
757 return 0;
758#undef b
759}
760
761static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000762array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000763{
764 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000765 PyErr_SetString(PyExc_IndexError,
766 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000767 return -1;
768 }
769 if (v == NULL)
770 return array_ass_slice(a, i, i+1, v);
771 return (*a->ob_descr->setitem)(a, i, v);
772}
773
774static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000775setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000776{
Martin v. Löwis99866332002-03-01 10:27:01 +0000777 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000778 return array_ass_item((arrayobject *)a, i, v);
779}
780
Martin v. Löwis99866332002-03-01 10:27:01 +0000781static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000782array_iter_extend(arrayobject *self, PyObject *bb)
783{
784 PyObject *it, *v;
785
786 it = PyObject_GetIter(bb);
787 if (it == NULL)
788 return -1;
789
790 while ((v = PyIter_Next(it)) != NULL) {
791 if (ins1(self, (int) self->ob_size, v) != 0) {
792 Py_DECREF(v);
793 Py_DECREF(it);
794 return -1;
795 }
796 Py_DECREF(v);
797 }
798 Py_DECREF(it);
799 if (PyErr_Occurred())
800 return -1;
801 return 0;
802}
803
804static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000805array_do_extend(arrayobject *self, PyObject *bb)
806{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000807 Py_ssize_t size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000808
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000809 if (!array_Check(bb))
810 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000811#define b ((arrayobject *)bb)
812 if (self->ob_descr != b->ob_descr) {
813 PyErr_SetString(PyExc_TypeError,
814 "can only extend with array of same kind");
815 return -1;
816 }
817 size = self->ob_size + b->ob_size;
818 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
819 if (self->ob_item == NULL) {
820 PyObject_Del(self);
821 PyErr_NoMemory();
822 return -1;
823 }
824 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
825 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000826 self->ob_size = size;
827 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000828
829 return 0;
830#undef b
831}
832
833static PyObject *
834array_inplace_concat(arrayobject *self, PyObject *bb)
835{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000836 if (!array_Check(bb)) {
837 PyErr_Format(PyExc_TypeError,
838 "can only extend array with array (not \"%.200s\")",
839 bb->ob_type->tp_name);
840 return NULL;
841 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000842 if (array_do_extend(self, bb) == -1)
843 return NULL;
844 Py_INCREF(self);
845 return (PyObject *)self;
846}
847
848static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000849array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000850{
851 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000852 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000853
854 if (self->ob_size > 0) {
855 if (n < 0)
856 n = 0;
857 items = self->ob_item;
858 size = self->ob_size * self->ob_descr->itemsize;
859 if (n == 0) {
860 PyMem_FREE(items);
861 self->ob_item = NULL;
862 self->ob_size = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000863 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000864 }
865 else {
866 PyMem_Resize(items, char, n * size);
867 if (items == NULL)
868 return PyErr_NoMemory();
869 p = items;
870 for (i = 1; i < n; i++) {
871 p += size;
872 memcpy(p, items, size);
873 }
874 self->ob_item = items;
875 self->ob_size *= n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000876 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000877 }
878 }
879 Py_INCREF(self);
880 return (PyObject *)self;
881}
882
883
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000884static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000885ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000886{
887 if (ins1(self, where, v) != 0)
888 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000889 Py_INCREF(Py_None);
890 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000891}
892
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000893static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000894array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000895{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000896 Py_ssize_t count = 0;
897 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000898
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000899 for (i = 0; i < self->ob_size; i++) {
900 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000901 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000902 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000903 if (cmp > 0)
904 count++;
905 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000906 return NULL;
907 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000908 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000909}
910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000911PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000912"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000914Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000915
916static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000917array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000919 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921 for (i = 0; i < self->ob_size; i++) {
922 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000923 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
924 Py_DECREF(selfi);
925 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000926 return PyInt_FromLong((long)i);
927 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000928 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000929 return NULL;
930 }
931 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
932 return NULL;
933}
934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000936"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000937\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000938Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000939
Raymond Hettinger625812f2003-01-07 01:58:52 +0000940static int
941array_contains(arrayobject *self, PyObject *v)
942{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000943 Py_ssize_t i;
944 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000945
946 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
947 PyObject *selfi = getarrayitem((PyObject *)self, i);
948 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
949 Py_DECREF(selfi);
950 }
951 return cmp;
952}
953
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000954static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000955array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000956{
957 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000958
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000959 for (i = 0; i < self->ob_size; i++) {
960 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000961 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
962 Py_DECREF(selfi);
963 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000964 if (array_ass_slice(self, i, i+1,
965 (PyObject *)NULL) != 0)
966 return NULL;
967 Py_INCREF(Py_None);
968 return Py_None;
969 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000970 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000971 return NULL;
972 }
973 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
974 return NULL;
975}
976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000977PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000978"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000979\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000980Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981
982static PyObject *
983array_pop(arrayobject *self, PyObject *args)
984{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000985 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000986 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000987 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988 return NULL;
989 if (self->ob_size == 0) {
990 /* Special-case most common failure cause */
991 PyErr_SetString(PyExc_IndexError, "pop from empty array");
992 return NULL;
993 }
994 if (i < 0)
995 i += self->ob_size;
996 if (i < 0 || i >= self->ob_size) {
997 PyErr_SetString(PyExc_IndexError, "pop index out of range");
998 return NULL;
999 }
1000 v = getarrayitem((PyObject *)self,i);
1001 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1002 Py_DECREF(v);
1003 return NULL;
1004 }
1005 return v;
1006}
1007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001008PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001009"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001011Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012
1013static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001014array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001015{
Martin v. Löwis99866332002-03-01 10:27:01 +00001016 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001017 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001018 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001020}
1021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001022PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001023"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001024\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001025 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001026
1027static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001028array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001029{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001030 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001031 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001032 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 return NULL;
1034 return ins(self, i, v);
1035}
1036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001037PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001038"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001039\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001040Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001041
1042
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001043static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001044array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001045{
Tim Peters077a11d2000-09-16 22:31:29 +00001046 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001047 retval = PyTuple_New(2);
1048 if (!retval)
1049 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001050
1051 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1052 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1053
1054 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001055}
1056
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001057PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001058"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001059\n\
1060Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001061the length in items of the buffer used to hold array's contents\n\
1062The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001063the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001064
1065
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001066static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001067array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001068{
Guido van Rossum778983b1993-02-19 15:55:02 +00001069 return ins(self, (int) self->ob_size, v);
1070}
1071
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001072PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001073"append(x)\n\
1074\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001075Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001076
1077
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001078static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001079array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001080{
1081 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001082 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001083
Guido van Rossum778983b1993-02-19 15:55:02 +00001084 switch (self->ob_descr->itemsize) {
1085 case 1:
1086 break;
1087 case 2:
1088 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1089 char p0 = p[0];
1090 p[0] = p[1];
1091 p[1] = p0;
1092 }
1093 break;
1094 case 4:
1095 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1096 char p0 = p[0];
1097 char p1 = p[1];
1098 p[0] = p[3];
1099 p[1] = p[2];
1100 p[2] = p1;
1101 p[3] = p0;
1102 }
1103 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001104 case 8:
1105 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1106 char p0 = p[0];
1107 char p1 = p[1];
1108 char p2 = p[2];
1109 char p3 = p[3];
1110 p[0] = p[7];
1111 p[1] = p[6];
1112 p[2] = p[5];
1113 p[3] = p[4];
1114 p[4] = p3;
1115 p[5] = p2;
1116 p[6] = p1;
1117 p[7] = p0;
1118 }
1119 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001120 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001121 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001122 "don't know how to byteswap this array type");
1123 return NULL;
1124 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001125 Py_INCREF(Py_None);
1126 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001127}
1128
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001129PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001130"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001131\n\
Fred Drakebf272981999-12-03 17:15:30 +00001132Byteswap 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 +000011334, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001134
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001135static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001136array_reduce(arrayobject *array)
1137{
1138 PyObject *dict, *result;
1139
1140 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1141 if (dict == NULL) {
1142 PyErr_Clear();
1143 dict = Py_None;
1144 Py_INCREF(dict);
1145 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 if (array->ob_size > 0) {
1147 result = Py_BuildValue("O(cs#)O",
1148 array->ob_type,
1149 array->ob_descr->typecode,
1150 array->ob_item,
1151 array->ob_size * array->ob_descr->itemsize,
1152 dict);
1153 } else {
1154 result = Py_BuildValue("O(c)O",
1155 array->ob_type,
1156 array->ob_descr->typecode,
1157 dict);
1158 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001159 Py_DECREF(dict);
1160 return result;
1161}
1162
1163PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1164
1165static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001166array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001167{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001168 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001169 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001170 /* little buffer to hold items while swapping */
1171 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001172 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001173
Guido van Rossum778983b1993-02-19 15:55:02 +00001174 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001175 for (p = self->ob_item,
1176 q = self->ob_item + (self->ob_size - 1)*itemsize;
1177 p < q;
1178 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001179 /* memory areas guaranteed disjoint, so memcpy
1180 * is safe (& memmove may be slower).
1181 */
1182 memcpy(tmp, p, itemsize);
1183 memcpy(p, q, itemsize);
1184 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001185 }
1186 }
Tim Petersbb307342000-09-10 05:22:54 +00001187
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001188 Py_INCREF(Py_None);
1189 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001190}
Guido van Rossume77a7571993-11-03 15:01:26 +00001191
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001192PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001193"reverse()\n\
1194\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001195Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001196
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001197static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001198array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001199{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001200 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001201 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001202 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001203 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001204 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001205 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001206 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001207 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001208 return NULL;
1209 }
1210 if (n > 0) {
1211 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001212 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001213 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001214 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001215 size_t newbytes;
1216 /* Be careful here about overflow */
1217 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001218 (newbytes = newlength * itemsize) / itemsize !=
1219 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001220 goto nomem;
1221 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001222 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001223 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001224 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001225 return NULL;
1226 }
1227 self->ob_item = item;
1228 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001229 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 nread = fread(item + (self->ob_size - n) * itemsize,
1231 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001232 if (nread < (size_t)n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001233 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001234 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001235 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001236 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001237 PyErr_SetString(PyExc_EOFError,
1238 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001239 return NULL;
1240 }
1241 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001242 Py_INCREF(Py_None);
1243 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001244}
1245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001246PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001247"fromfile(f, n)\n\
1248\n\
1249Read 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 +00001250array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001251
1252
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001254array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001255{
Guido van Rossum778983b1993-02-19 15:55:02 +00001256 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001257
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001258 if (self->ob_size == 0)
1259 goto done;
1260
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261 fp = PyFile_AsFile(f);
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001262 if (fp != NULL) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001263 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1264 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001266 clearerr(fp);
1267 return NULL;
1268 }
1269 }
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001270 else {
1271 Py_ssize_t nbytes = self->ob_size * self->ob_descr->itemsize;
1272 /* Write 64K blocks at a time */
1273 /* XXX Make the block size settable */
1274 int BLOCKSIZE = 64*1024;
1275 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1276 Py_ssize_t i;
1277 for (i = 0; i < nblocks; i++) {
1278 char* ptr = self->ob_item + i*BLOCKSIZE;
1279 Py_ssize_t size = BLOCKSIZE;
1280 PyObject *bytes, *res;
1281 if (i*BLOCKSIZE + size > nbytes)
1282 size = nbytes - i*BLOCKSIZE;
1283 bytes = PyBytes_FromStringAndSize(ptr, size);
1284 if (bytes == NULL)
1285 return NULL;
1286 res = PyObject_CallMethod(f, "write", "O",
1287 bytes);
1288 Py_DECREF(bytes);
1289 if (res == NULL)
1290 return NULL;
1291 }
1292 }
1293
1294 done:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001295 Py_INCREF(Py_None);
1296 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001297}
1298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001299PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001300"tofile(f)\n\
1301\n\
1302Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001303write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001304
1305
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001306static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001307array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001308{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001309 Py_ssize_t n;
1310 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001311
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001312 if (!PyList_Check(list)) {
1313 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001314 return NULL;
1315 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001316 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001317 if (n > 0) {
1318 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001319 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001320 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001321 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001322 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001323 return NULL;
1324 }
1325 self->ob_item = item;
1326 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001327 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001328 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001329 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001330 if ((*self->ob_descr->setitem)(self,
1331 self->ob_size - n + i, v) != 0) {
1332 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001333 PyMem_RESIZE(item, char,
1334 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001336 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001337 return NULL;
1338 }
1339 }
1340 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001341 Py_INCREF(Py_None);
1342 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001343}
1344
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001345PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001346"fromlist(list)\n\
1347\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001348Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001349
1350
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001351static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001352array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001353{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001354 PyObject *list = PyList_New(self->ob_size);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001355 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001356
Guido van Rossum778983b1993-02-19 15:55:02 +00001357 if (list == NULL)
1358 return NULL;
1359 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001360 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001361 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 return NULL;
1364 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001365 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001366 }
1367 return list;
1368}
1369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001370PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001371"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001372\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001373Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001374
1375
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001376static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001377array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001378{
1379 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001380 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001381 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001382 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001383 return NULL;
1384 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001385 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 "string length not a multiple of item size");
1387 return NULL;
1388 }
1389 n = n / itemsize;
1390 if (n > 0) {
1391 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001392 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001393 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001394 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001395 return NULL;
1396 }
1397 self->ob_item = item;
1398 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001399 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001400 memcpy(item + (self->ob_size - n) * itemsize,
1401 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001402 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403 Py_INCREF(Py_None);
1404 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001405}
1406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001407PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001408"fromstring(string)\n\
1409\n\
1410Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001411values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001412
1413
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001414static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001415array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001416{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001417 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001418 self->ob_size * self->ob_descr->itemsize);
1419}
1420
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001421PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001422"tostring() -> string\n\
1423\n\
1424Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001425representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001426
Martin v. Löwis99866332002-03-01 10:27:01 +00001427
1428
Martin v. Löwis99866332002-03-01 10:27:01 +00001429static PyObject *
1430array_fromunicode(arrayobject *self, PyObject *args)
1431{
1432 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001433 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001434
1435 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1436 return NULL;
1437 if (self->ob_descr->typecode != 'u') {
1438 PyErr_SetString(PyExc_ValueError,
1439 "fromunicode() may only be called on "
1440 "type 'u' arrays");
1441 return NULL;
1442 }
1443 if (n > 0) {
1444 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1445 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1446 if (item == NULL) {
1447 PyErr_NoMemory();
1448 return NULL;
1449 }
1450 self->ob_item = (char *) item;
1451 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001452 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001453 memcpy(item + self->ob_size - n,
1454 ustr, n * sizeof(Py_UNICODE));
1455 }
1456
1457 Py_INCREF(Py_None);
1458 return Py_None;
1459}
1460
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001461PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001462"fromunicode(ustr)\n\
1463\n\
1464Extends this array with data from the unicode string ustr.\n\
1465The array must be a type 'u' array; otherwise a ValueError\n\
1466is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001467append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001468
1469
1470static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001471array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001472{
Martin v. Löwis99866332002-03-01 10:27:01 +00001473 if (self->ob_descr->typecode != 'u') {
1474 PyErr_SetString(PyExc_ValueError,
1475 "tounicode() may only be called on type 'u' arrays");
1476 return NULL;
1477 }
1478 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1479}
1480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001481PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001482"tounicode() -> unicode\n\
1483\n\
1484Convert the array to a unicode string. The array must be\n\
1485a type 'u' array; otherwise a ValueError is raised. Use\n\
1486array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001488
Martin v. Löwis99866332002-03-01 10:27:01 +00001489
1490
1491static PyObject *
1492array_get_typecode(arrayobject *a, void *closure)
1493{
1494 char tc = a->ob_descr->typecode;
1495 return PyString_FromStringAndSize(&tc, 1);
1496}
1497
1498static PyObject *
1499array_get_itemsize(arrayobject *a, void *closure)
1500{
1501 return PyInt_FromLong((long)a->ob_descr->itemsize);
1502}
1503
1504static PyGetSetDef array_getsets [] = {
1505 {"typecode", (getter) array_get_typecode, NULL,
1506 "the typecode character used to create the array"},
1507 {"itemsize", (getter) array_get_itemsize, NULL,
1508 "the size, in bytes, of one array item"},
1509 {NULL}
1510};
1511
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001512PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001513 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001514 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001515 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001516 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001517 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001518 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001519 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1520 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001521 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001522 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001523 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001524 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001525 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001526 extend_doc},
1527 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1528 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001529 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001530 fromlist_doc},
1531 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1532 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001533 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1534 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001535 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001536 index_doc},
1537 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1538 insert_doc},
1539 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1540 pop_doc},
1541 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1542 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001543 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1544 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001545 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001546 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001547 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001548 reverse_doc},
1549/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1550 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001551 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001552 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001553 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001554 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001555 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001556 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001557 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001558 tounicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001559 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001560 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001561 {NULL, NULL} /* sentinel */
1562};
1563
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001564static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001565array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001566{
Martin v. Löwis99866332002-03-01 10:27:01 +00001567 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001568 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001569 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001570
Guido van Rossum778983b1993-02-19 15:55:02 +00001571 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001572 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001573 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001574 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001575 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001576 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001577
1578 if (typecode == 'c')
1579 v = array_tostring(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001580 else if (typecode == 'u')
1581 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001582 else
1583 v = array_tolist(a, NULL);
1584 t = PyObject_Repr(v);
1585 Py_XDECREF(v);
1586
1587 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001588 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001589 PyString_ConcatAndDel(&s, t);
1590 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001591 return s;
1592}
1593
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001594static PyObject*
1595array_subscr(arrayobject* self, PyObject* item)
1596{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001597 if (PyIndex_Check(item)) {
1598 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001599 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001600 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001601 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001602 if (i < 0)
1603 i += self->ob_size;
1604 return array_item(self, i);
1605 }
1606 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001607 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001608 PyObject* result;
1609 arrayobject* ar;
1610 int itemsize = self->ob_descr->itemsize;
1611
1612 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1613 &start, &stop, &step, &slicelength) < 0) {
1614 return NULL;
1615 }
1616
1617 if (slicelength <= 0) {
1618 return newarrayobject(&Arraytype, 0, self->ob_descr);
1619 }
1620 else {
1621 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1622 if (!result) return NULL;
1623
1624 ar = (arrayobject*)result;
1625
1626 for (cur = start, i = 0; i < slicelength;
1627 cur += step, i++) {
1628 memcpy(ar->ob_item + i*itemsize,
1629 self->ob_item + cur*itemsize,
1630 itemsize);
1631 }
1632
1633 return result;
1634 }
1635 }
1636 else {
1637 PyErr_SetString(PyExc_TypeError,
1638 "list indices must be integers");
1639 return NULL;
1640 }
1641}
1642
1643static int
1644array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1645{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001646 if (PyIndex_Check(item)) {
1647 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001648 if (i==-1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001649 return -1;
1650 if (i < 0)
1651 i += self->ob_size;
1652 return array_ass_item(self, i, value);
1653 }
1654 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001655 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001656 int itemsize = self->ob_descr->itemsize;
1657
1658 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1659 &start, &stop, &step, &slicelength) < 0) {
1660 return -1;
1661 }
1662
1663 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1664 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1665 return array_ass_slice(self, start, stop, value);
1666
1667 if (value == NULL) {
1668 /* delete slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001669 Py_ssize_t cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001670
1671 if (slicelength <= 0)
1672 return 0;
1673
1674 if (step < 0) {
1675 stop = start + 1;
1676 start = stop + step*(slicelength - 1) - 1;
1677 step = -step;
1678 }
1679
Michael W. Hudson56796f62002-07-29 14:35:04 +00001680 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001681 cur += step, i++) {
1682 memmove(self->ob_item + (cur - i)*itemsize,
1683 self->ob_item + (cur + 1)*itemsize,
1684 (step - 1) * itemsize);
1685 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001686 extra = self->ob_size - (cur + 1);
1687 if (extra > 0) {
1688 memmove(self->ob_item + (cur - i)*itemsize,
1689 self->ob_item + (cur + 1)*itemsize,
1690 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001691 }
1692
1693 self->ob_size -= slicelength;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001694 self->ob_item = (char *)PyMem_REALLOC(self->ob_item,
1695 itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001696 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001697
1698 return 0;
1699 }
1700 else {
1701 /* assign slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001702 Py_ssize_t cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001703 arrayobject* av;
1704
1705 if (!array_Check(value)) {
1706 PyErr_Format(PyExc_TypeError,
1707 "must assign array (not \"%.200s\") to slice",
1708 value->ob_type->tp_name);
1709 return -1;
1710 }
1711
1712 av = (arrayobject*)value;
1713
1714 if (av->ob_size != slicelength) {
1715 PyErr_Format(PyExc_ValueError,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001716 "attempt to assign array of size %ld to extended slice of size %ld",
1717 /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001718 return -1;
1719 }
1720
1721 if (!slicelength)
1722 return 0;
1723
1724 /* protect against a[::-1] = a */
1725 if (self == av) {
1726 value = array_slice(av, 0, av->ob_size);
1727 av = (arrayobject*)value;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001728 if (!av)
1729 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001730 }
1731 else {
1732 Py_INCREF(value);
1733 }
1734
1735 for (cur = start, i = 0; i < slicelength;
1736 cur += step, i++) {
1737 memcpy(self->ob_item + cur*itemsize,
1738 av->ob_item + i*itemsize,
1739 itemsize);
1740 }
1741
1742 Py_DECREF(value);
1743
1744 return 0;
1745 }
1746 }
1747 else {
1748 PyErr_SetString(PyExc_TypeError,
1749 "list indices must be integers");
1750 return -1;
1751 }
1752}
1753
1754static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001755 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001756 (binaryfunc)array_subscr,
1757 (objobjargproc)array_ass_subscr
1758};
1759
Guido van Rossumd8faa362007-04-27 19:54:29 +00001760static const void *emptybuf = "";
1761
Martin v. Löwis18e16552006-02-15 17:27:45 +00001762static Py_ssize_t
1763array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001764{
1765 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001766 PyErr_SetString(PyExc_SystemError,
1767 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001768 return -1;
1769 }
1770 *ptr = (void *)self->ob_item;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001771 if (*ptr == NULL)
1772 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001773 return self->ob_size*self->ob_descr->itemsize;
1774}
1775
Martin v. Löwis18e16552006-02-15 17:27:45 +00001776static Py_ssize_t
1777array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001778{
1779 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001780 PyErr_SetString(PyExc_SystemError,
1781 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001782 return -1;
1783 }
1784 *ptr = (void *)self->ob_item;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001785 if (*ptr == NULL)
1786 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001787 return self->ob_size*self->ob_descr->itemsize;
1788}
1789
Martin v. Löwis18e16552006-02-15 17:27:45 +00001790static Py_ssize_t
1791array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001792{
1793 if ( lenp )
1794 *lenp = self->ob_size*self->ob_descr->itemsize;
1795 return 1;
1796}
1797
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001798static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001799 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001800 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001801 (ssizeargfunc)array_repeat, /*sq_repeat*/
1802 (ssizeargfunc)array_item, /*sq_item*/
1803 (ssizessizeargfunc)array_slice, /*sq_slice*/
1804 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1805 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001806 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001807 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001808 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001809};
1810
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001811static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001812 (readbufferproc)array_buffer_getreadbuf,
1813 (writebufferproc)array_buffer_getwritebuf,
1814 (segcountproc)array_buffer_getsegcount,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001815 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001816};
1817
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001818static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001819array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001820{
1821 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001822 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001823 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001824
Thomas Woutersb2137042007-02-01 18:02:27 +00001825 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001826 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001827
1828 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1829 return NULL;
1830
1831 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001832 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001833 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001834 it = PyObject_GetIter(initial);
1835 if (it == NULL)
1836 return NULL;
1837 /* We set initial to NULL so that the subsequent code
1838 will create an empty array of the appropriate type
1839 and afterwards we can use array_iter_extend to populate
1840 the array.
1841 */
1842 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001843 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001844 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1845 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001846 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001847 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001848
1849 if (initial == NULL || !(PyList_Check(initial)
1850 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001851 len = 0;
1852 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001853 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001854
1855 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001856 if (a == NULL)
1857 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001858
Guido van Rossum778983b1993-02-19 15:55:02 +00001859 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001860 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001861 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001862 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001863 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001864 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001865 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001866 return NULL;
1867 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001868 if (setarrayitem(a, i, v) != 0) {
1869 Py_DECREF(v);
1870 Py_DECREF(a);
1871 return NULL;
1872 }
1873 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001874 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001875 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001876 PyObject *t_initial, *v;
1877 t_initial = PyTuple_Pack(1, initial);
1878 if (t_initial == NULL) {
1879 Py_DECREF(a);
1880 return NULL;
1881 }
1882 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001883 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001884 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001885 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001886 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001887 return NULL;
1888 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001889 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001890 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001891 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001892 if (n > 0) {
1893 arrayobject *self = (arrayobject *)a;
1894 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001895 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001896 if (item == NULL) {
1897 PyErr_NoMemory();
1898 Py_DECREF(a);
1899 return NULL;
1900 }
1901 self->ob_item = item;
1902 self->ob_size = n / sizeof(Py_UNICODE);
1903 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001904 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001905 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001906 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001907 if (it != NULL) {
1908 if (array_iter_extend((arrayobject *)a, it) == -1) {
1909 Py_DECREF(it);
1910 Py_DECREF(a);
1911 return NULL;
1912 }
1913 Py_DECREF(it);
1914 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001915 return a;
1916 }
1917 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001918 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001919 "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 +00001920 return NULL;
1921}
1922
Guido van Rossum778983b1993-02-19 15:55:02 +00001923
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001924PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001925"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001926an array of basic values: characters, integers, floating point\n\
1927numbers. Arrays are sequence types and behave very much like lists,\n\
1928except that the type of objects stored in them is constrained. The\n\
1929type is specified at object creation time by using a type code, which\n\
1930is a single character. The following type codes are defined:\n\
1931\n\
1932 Type code C Type Minimum size in bytes \n\
1933 'c' character 1 \n\
1934 'b' signed integer 1 \n\
1935 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001936 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001937 'h' signed integer 2 \n\
1938 'H' unsigned integer 2 \n\
1939 'i' signed integer 2 \n\
1940 'I' unsigned integer 2 \n\
1941 'l' signed integer 4 \n\
1942 'L' unsigned integer 4 \n\
1943 'f' floating point 4 \n\
1944 'd' floating point 8 \n\
1945\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001946The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001947\n\
1948array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001949");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001950
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001951PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001952"array(typecode [, initializer]) -> array\n\
1953\n\
1954Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001955initialized from the optional initializer value, which must be a list,\n\
1956string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001957\n\
1958Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001959the type of objects stored in them is constrained.\n\
1960\n\
1961Methods:\n\
1962\n\
1963append() -- append a new item to the end of the array\n\
1964buffer_info() -- return information giving the current memory info\n\
1965byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001966count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001967extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001968fromfile() -- read items from a file object\n\
1969fromlist() -- append items from the list\n\
1970fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001971index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001972insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001973pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001974read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001975remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001976reverse() -- reverse the order of the items in the array\n\
1977tofile() -- write all items to a file object\n\
1978tolist() -- return the array converted to an ordinary list\n\
1979tostring() -- return the array converted to a string\n\
1980write() -- DEPRECATED, use tofile()\n\
1981\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001982Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001983\n\
1984typecode -- the typecode character used to create the array\n\
1985itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001986");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001987
Raymond Hettinger625812f2003-01-07 01:58:52 +00001988static PyObject *array_iter(arrayobject *ao);
1989
Tim Peters0c322792002-07-17 16:49:03 +00001990static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001991 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001992 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001993 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001994 sizeof(arrayobject),
1995 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001996 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001997 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001998 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001999 0, /* tp_setattr */
2000 0, /* tp_compare */
2001 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002002 0, /* tp_as_number*/
2003 &array_as_sequence, /* tp_as_sequence*/
2004 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002005 0, /* tp_hash */
2006 0, /* tp_call */
2007 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002008 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002009 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002010 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002011 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002012 arraytype_doc, /* tp_doc */
2013 0, /* tp_traverse */
2014 0, /* tp_clear */
2015 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002016 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002017 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002018 0, /* tp_iternext */
2019 array_methods, /* tp_methods */
2020 0, /* tp_members */
2021 array_getsets, /* tp_getset */
2022 0, /* tp_base */
2023 0, /* tp_dict */
2024 0, /* tp_descr_get */
2025 0, /* tp_descr_set */
2026 0, /* tp_dictoffset */
2027 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002028 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002029 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002030 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002031};
2032
Raymond Hettinger625812f2003-01-07 01:58:52 +00002033
2034/*********************** Array Iterator **************************/
2035
2036typedef struct {
2037 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002038 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002039 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002040 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002041} arrayiterobject;
2042
2043static PyTypeObject PyArrayIter_Type;
2044
2045#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2046
2047static PyObject *
2048array_iter(arrayobject *ao)
2049{
2050 arrayiterobject *it;
2051
2052 if (!array_Check(ao)) {
2053 PyErr_BadInternalCall();
2054 return NULL;
2055 }
2056
2057 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2058 if (it == NULL)
2059 return NULL;
2060
2061 Py_INCREF(ao);
2062 it->ao = ao;
2063 it->index = 0;
2064 it->getitem = ao->ob_descr->getitem;
2065 PyObject_GC_Track(it);
2066 return (PyObject *)it;
2067}
2068
2069static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002070arrayiter_next(arrayiterobject *it)
2071{
2072 assert(PyArrayIter_Check(it));
2073 if (it->index < it->ao->ob_size)
2074 return (*it->getitem)(it->ao, it->index++);
2075 return NULL;
2076}
2077
2078static void
2079arrayiter_dealloc(arrayiterobject *it)
2080{
2081 PyObject_GC_UnTrack(it);
2082 Py_XDECREF(it->ao);
2083 PyObject_GC_Del(it);
2084}
2085
2086static int
2087arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2088{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002089 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002090 return 0;
2091}
2092
2093static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002094 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002095 0, /* ob_size */
2096 "arrayiterator", /* tp_name */
2097 sizeof(arrayiterobject), /* tp_basicsize */
2098 0, /* tp_itemsize */
2099 /* methods */
2100 (destructor)arrayiter_dealloc, /* tp_dealloc */
2101 0, /* tp_print */
2102 0, /* tp_getattr */
2103 0, /* tp_setattr */
2104 0, /* tp_compare */
2105 0, /* tp_repr */
2106 0, /* tp_as_number */
2107 0, /* tp_as_sequence */
2108 0, /* tp_as_mapping */
2109 0, /* tp_hash */
2110 0, /* tp_call */
2111 0, /* tp_str */
2112 PyObject_GenericGetAttr, /* tp_getattro */
2113 0, /* tp_setattro */
2114 0, /* tp_as_buffer */
2115 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2116 0, /* tp_doc */
2117 (traverseproc)arrayiter_traverse, /* tp_traverse */
2118 0, /* tp_clear */
2119 0, /* tp_richcompare */
2120 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002121 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002122 (iternextfunc)arrayiter_next, /* tp_iternext */
2123 0, /* tp_methods */
2124};
2125
2126
2127/*********************** Install Module **************************/
2128
Martin v. Löwis99866332002-03-01 10:27:01 +00002129/* No functions in array module. */
2130static PyMethodDef a_methods[] = {
2131 {NULL, NULL, 0, NULL} /* Sentinel */
2132};
2133
2134
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002135PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002136initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002137{
Fred Drakef4e34842002-04-01 03:45:06 +00002138 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002139
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002140 if (PyType_Ready(&Arraytype) < 0)
2141 return;
Jason Tishler84375702003-02-10 20:45:47 +00002142 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002143 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002144 if (m == NULL)
2145 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002146
2147 Py_INCREF((PyObject *)&Arraytype);
2148 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2149 Py_INCREF((PyObject *)&Arraytype);
2150 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002151 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002152}