blob: 2caa8ee5a8e892899ced7c9421eca9c3ca4e518e [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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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
Brett Cannon1eb32c22014-10-10 16:26:45 -040018/*[clinic input]
Brett Cannon1eb32c22014-10-10 16:26:45 -040019module array
20[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030021/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7d1b8d7f5958fd83]*/
Brett Cannon1eb32c22014-10-10 16:26:45 -040022
Guido van Rossum778983b1993-02-19 15:55:02 +000023struct arrayobject; /* Forward */
24
Tim Petersbb307342000-09-10 05:22:54 +000025/* All possible arraydescr values are defined in the vector "descriptors"
26 * below. That's defined later because the appropriate get and set
27 * functions aren't visible yet.
28 */
Guido van Rossum778983b1993-02-19 15:55:02 +000029struct arraydescr {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +020030 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 int itemsize;
32 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
33 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020034 const char *formats;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 int is_integer_type;
36 int is_signed;
Guido van Rossum778983b1993-02-19 15:55:02 +000037};
38
39typedef struct arrayobject {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 PyObject_VAR_HEAD
41 char *ob_item;
42 Py_ssize_t allocated;
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020043 const struct arraydescr *ob_descr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 PyObject *weakreflist; /* List of weak references */
45 int ob_exports; /* Number of exported buffers */
Guido van Rossum778983b1993-02-19 15:55:02 +000046} arrayobject;
47
Jeremy Hylton938ace62002-07-17 16:30:39 +000048static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000049
Brett Cannon1eb32c22014-10-10 16:26:45 -040050typedef struct {
51 PyObject_HEAD
52 Py_ssize_t index;
53 arrayobject *ao;
54 PyObject* (*getitem)(struct arrayobject *, Py_ssize_t);
55} arrayiterobject;
56
57static PyTypeObject PyArrayIter_Type;
58
59#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
60
Larry Hastingsdfbeb162014-10-13 10:39:41 +010061enum machine_format_code {
62 UNKNOWN_FORMAT = -1,
63 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
64 * array type code cannot be interpreted. When this occurs, a list of
65 * Python objects is used to represent the content of the array
66 * instead of using the memory content of the array directly. In that
67 * case, the array_reconstructor mechanism is bypassed completely, and
68 * the standard array constructor is used instead.
69 *
70 * This is will most likely occur when the machine doesn't use IEEE
71 * floating-point numbers.
72 */
73
74 UNSIGNED_INT8 = 0,
75 SIGNED_INT8 = 1,
76 UNSIGNED_INT16_LE = 2,
77 UNSIGNED_INT16_BE = 3,
78 SIGNED_INT16_LE = 4,
79 SIGNED_INT16_BE = 5,
80 UNSIGNED_INT32_LE = 6,
81 UNSIGNED_INT32_BE = 7,
82 SIGNED_INT32_LE = 8,
83 SIGNED_INT32_BE = 9,
84 UNSIGNED_INT64_LE = 10,
85 UNSIGNED_INT64_BE = 11,
86 SIGNED_INT64_LE = 12,
87 SIGNED_INT64_BE = 13,
88 IEEE_754_FLOAT_LE = 14,
89 IEEE_754_FLOAT_BE = 15,
90 IEEE_754_DOUBLE_LE = 16,
91 IEEE_754_DOUBLE_BE = 17,
92 UTF16_LE = 18,
93 UTF16_BE = 19,
94 UTF32_LE = 20,
95 UTF32_BE = 21
96};
97#define MACHINE_FORMAT_CODE_MIN 0
98#define MACHINE_FORMAT_CODE_MAX 21
99
100
101/*
102 * Must come after arrayobject, arrayiterobject,
103 * and enum machine_code_type definitions.
104 */
Brett Cannon1eb32c22014-10-10 16:26:45 -0400105#include "clinic/arraymodule.c.h"
106
Martin v. Löwis99866332002-03-01 10:27:01 +0000107#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimes90aa7642007-12-19 02:45:37 +0000108#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +0000109
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000110static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 char *items;
114 size_t _new_size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
117 PyErr_SetString(PyExc_BufferError,
118 "cannot resize an array that is exporting buffers");
119 return -1;
120 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 /* Bypass realloc() when a previous overallocation is large enough
123 to accommodate the newsize. If the newsize is 16 smaller than the
124 current size, then proceed with the realloc() to shrink the array.
125 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 if (self->allocated >= newsize &&
128 Py_SIZE(self) < newsize + 16 &&
129 self->ob_item != NULL) {
130 Py_SIZE(self) = newsize;
131 return 0;
132 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 if (newsize == 0) {
135 PyMem_FREE(self->ob_item);
136 self->ob_item = NULL;
137 Py_SIZE(self) = 0;
138 self->allocated = 0;
139 return 0;
140 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 /* This over-allocates proportional to the array size, making room
143 * for additional growth. The over-allocation is mild, but is
144 * enough to give linear-time amortized behavior over a long
145 * sequence of appends() in the presence of a poorly-performing
146 * system realloc().
147 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
148 * Note, the pattern starts out the same as for lists but then
149 * grows at a smaller rate so that larger arrays only overallocate
150 * by about 1/16th -- this is done because arrays are presumed to be more
151 * memory critical.
152 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
155 items = self->ob_item;
156 /* XXX The following multiplication and division does not optimize away
157 like it does for lists since the size is not known at compile time */
158 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
159 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
160 else
161 items = NULL;
162 if (items == NULL) {
163 PyErr_NoMemory();
164 return -1;
165 }
166 self->ob_item = items;
167 Py_SIZE(self) = newsize;
168 self->allocated = _new_size;
169 return 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000170}
171
Tim Petersbb307342000-09-10 05:22:54 +0000172/****************************************************************************
173Get and Set functions for each type.
174A Get function takes an arrayobject* and an integer index, returning the
175array value at that index wrapped in an appropriate PyObject*.
176A Set function takes an arrayobject, integer index, and PyObject*; sets
177the array value at that index to the raw C data extracted from the PyObject*,
178and returns 0 if successful, else nonzero on failure (PyObject* not of an
179appropriate type or value).
180Note that the basic Get and Set functions do NOT check that the index is
181in bounds; that's the responsibility of the caller.
182****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000183
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000184static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000185b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 long x = ((char *)ap->ob_item)[i];
188 if (x >= 128)
189 x -= 256;
190 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000191}
192
193static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000194b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 short x;
197 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
198 must use the next size up that is signed ('h') and manually do
199 the overflow checking */
200 if (!PyArg_Parse(v, "h;array item must be integer", &x))
201 return -1;
202 else if (x < -128) {
203 PyErr_SetString(PyExc_OverflowError,
204 "signed char is less than minimum");
205 return -1;
206 }
207 else if (x > 127) {
208 PyErr_SetString(PyExc_OverflowError,
209 "signed char is greater than maximum");
210 return -1;
211 }
212 if (i >= 0)
213 ((char *)ap->ob_item)[i] = (char)x;
214 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000215}
216
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000217static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000218BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 long x = ((unsigned char *)ap->ob_item)[i];
221 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000222}
223
Fred Drake541dc3b2000-06-28 17:49:30 +0000224static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000225BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 unsigned char x;
228 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
229 if (!PyArg_Parse(v, "b;array item must be integer", &x))
230 return -1;
231 if (i >= 0)
232 ((char *)ap->ob_item)[i] = x;
233 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000234}
Guido van Rossum549ab711997-01-03 19:09:47 +0000235
Martin v. Löwis99866332002-03-01 10:27:01 +0000236static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000237u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000238{
Victor Stinner62bb3942012-08-06 00:46:05 +0200239 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
Martin v. Löwis99866332002-03-01 10:27:01 +0000240}
241
242static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000243u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000244{
Victor Stinner62bb3942012-08-06 00:46:05 +0200245 Py_UNICODE *p;
246 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000247
Victor Stinner62bb3942012-08-06 00:46:05 +0200248 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 return -1;
Victor Stinner62bb3942012-08-06 00:46:05 +0200250 if (len != 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 PyErr_SetString(PyExc_TypeError,
252 "array item must be unicode character");
253 return -1;
254 }
255 if (i >= 0)
Victor Stinner62bb3942012-08-06 00:46:05 +0200256 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000258}
Martin v. Löwis99866332002-03-01 10:27:01 +0000259
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000260
Guido van Rossum549ab711997-01-03 19:09:47 +0000261static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000262h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000265}
266
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000267
Guido van Rossum778983b1993-02-19 15:55:02 +0000268static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000269h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 short x;
272 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
273 if (!PyArg_Parse(v, "h;array item must be integer", &x))
274 return -1;
275 if (i >= 0)
276 ((short *)ap->ob_item)[i] = x;
277 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000278}
279
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000280static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000281HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000284}
285
Fred Drake541dc3b2000-06-28 17:49:30 +0000286static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 int x;
290 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
291 must use the next size up and manually do the overflow checking */
292 if (!PyArg_Parse(v, "i;array item must be integer", &x))
293 return -1;
294 else if (x < 0) {
295 PyErr_SetString(PyExc_OverflowError,
296 "unsigned short is less than minimum");
297 return -1;
298 }
299 else if (x > USHRT_MAX) {
300 PyErr_SetString(PyExc_OverflowError,
301 "unsigned short is greater than maximum");
302 return -1;
303 }
304 if (i >= 0)
305 ((short *)ap->ob_item)[i] = (short)x;
306 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000307}
Guido van Rossum549ab711997-01-03 19:09:47 +0000308
309static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000313}
314
315static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000316i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 int x;
319 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
320 if (!PyArg_Parse(v, "i;array item must be integer", &x))
321 return -1;
322 if (i >= 0)
323 ((int *)ap->ob_item)[i] = x;
324 return 0;
Guido van Rossume77a7571993-11-03 15:01:26 +0000325}
326
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000327static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000328II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 return PyLong_FromUnsignedLong(
331 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000332}
333
334static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000335II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 unsigned long x;
338 if (PyLong_Check(v)) {
339 x = PyLong_AsUnsignedLong(v);
340 if (x == (unsigned long) -1 && PyErr_Occurred())
341 return -1;
342 }
343 else {
344 long y;
345 if (!PyArg_Parse(v, "l;array item must be integer", &y))
346 return -1;
347 if (y < 0) {
348 PyErr_SetString(PyExc_OverflowError,
349 "unsigned int is less than minimum");
350 return -1;
351 }
352 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 }
355 if (x > UINT_MAX) {
356 PyErr_SetString(PyExc_OverflowError,
357 "unsigned int is greater than maximum");
358 return -1;
359 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 if (i >= 0)
362 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
363 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000364}
365
366static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000367l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000370}
371
372static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000373l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 long x;
376 if (!PyArg_Parse(v, "l;array item must be integer", &x))
377 return -1;
378 if (i >= 0)
379 ((long *)ap->ob_item)[i] = x;
380 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000381}
382
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000383static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000384LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000387}
388
389static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000390LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 unsigned long x;
393 if (PyLong_Check(v)) {
394 x = PyLong_AsUnsignedLong(v);
395 if (x == (unsigned long) -1 && PyErr_Occurred())
396 return -1;
397 }
398 else {
399 long y;
400 if (!PyArg_Parse(v, "l;array item must be integer", &y))
401 return -1;
402 if (y < 0) {
403 PyErr_SetString(PyExc_OverflowError,
404 "unsigned long is less than minimum");
405 return -1;
406 }
407 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 }
410 if (x > ULONG_MAX) {
411 PyErr_SetString(PyExc_OverflowError,
412 "unsigned long is greater than maximum");
413 return -1;
414 }
Tim Petersbb307342000-09-10 05:22:54 +0000415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 if (i >= 0)
417 ((unsigned long *)ap->ob_item)[i] = x;
418 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000419}
420
Meador Inge1c9f0c92011-09-20 19:55:51 -0500421static PyObject *
422q_getitem(arrayobject *ap, Py_ssize_t i)
423{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700424 return PyLong_FromLongLong(((long long *)ap->ob_item)[i]);
Meador Inge1c9f0c92011-09-20 19:55:51 -0500425}
426
427static int
428q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
429{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700430 long long x;
Meador Inge1c9f0c92011-09-20 19:55:51 -0500431 if (!PyArg_Parse(v, "L;array item must be integer", &x))
432 return -1;
433 if (i >= 0)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700434 ((long long *)ap->ob_item)[i] = x;
Meador Inge1c9f0c92011-09-20 19:55:51 -0500435 return 0;
436}
437
438static PyObject *
439QQ_getitem(arrayobject *ap, Py_ssize_t i)
440{
441 return PyLong_FromUnsignedLongLong(
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700442 ((unsigned long long *)ap->ob_item)[i]);
Meador Inge1c9f0c92011-09-20 19:55:51 -0500443}
444
445static int
446QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
447{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700448 unsigned long long x;
Meador Inge1c9f0c92011-09-20 19:55:51 -0500449 if (PyLong_Check(v)) {
450 x = PyLong_AsUnsignedLongLong(v);
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700451 if (x == (unsigned long long) -1 && PyErr_Occurred())
Meador Inge1c9f0c92011-09-20 19:55:51 -0500452 return -1;
453 }
454 else {
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700455 long long y;
Meador Inge1c9f0c92011-09-20 19:55:51 -0500456 if (!PyArg_Parse(v, "L;array item must be integer", &y))
457 return -1;
458 if (y < 0) {
459 PyErr_SetString(PyExc_OverflowError,
460 "unsigned long long is less than minimum");
461 return -1;
462 }
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700463 x = (unsigned long long)y;
Meador Inge1c9f0c92011-09-20 19:55:51 -0500464 }
465
466 if (i >= 0)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700467 ((unsigned long long *)ap->ob_item)[i] = x;
Meador Inge1c9f0c92011-09-20 19:55:51 -0500468 return 0;
469}
Meador Inge1c9f0c92011-09-20 19:55:51 -0500470
Guido van Rossum549ab711997-01-03 19:09:47 +0000471static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000472f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000475}
476
477static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000478f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 float x;
481 if (!PyArg_Parse(v, "f;array item must be float", &x))
482 return -1;
483 if (i >= 0)
484 ((float *)ap->ob_item)[i] = x;
485 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000486}
487
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000488static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000489d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000492}
493
494static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000495d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 double x;
498 if (!PyArg_Parse(v, "d;array item must be float", &x))
499 return -1;
500 if (i >= 0)
501 ((double *)ap->ob_item)[i] = x;
502 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000503}
504
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000505
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000506/* Description of types.
507 *
508 * Don't forget to update typecode_to_mformat_code() if you add a new
509 * typecode.
510 */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200511static const struct arraydescr descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 {'b', 1, b_getitem, b_setitem, "b", 1, 1},
513 {'B', 1, BB_getitem, BB_setitem, "B", 1, 0},
Victor Stinner62bb3942012-08-06 00:46:05 +0200514 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u", 0, 0},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1},
516 {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0},
517 {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1},
518 {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
519 {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
520 {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700521 {'q', sizeof(long long), q_getitem, q_setitem, "q", 1, 1},
522 {'Q', sizeof(long long), QQ_getitem, QQ_setitem, "Q", 1, 0},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
524 {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
525 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000526};
Tim Petersbb307342000-09-10 05:22:54 +0000527
528/****************************************************************************
529Implementations of array object methods.
530****************************************************************************/
Brett Cannon1eb32c22014-10-10 16:26:45 -0400531/*[clinic input]
532class array.array "arrayobject *" "&Arraytype"
533[clinic start generated code]*/
534/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ad43d37e942a8854]*/
Guido van Rossum778983b1993-02-19 15:55:02 +0000535
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000536static PyObject *
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200537newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 arrayobject *op;
540 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 if (size < 0) {
543 PyErr_BadInternalCall();
544 return NULL;
545 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 /* Check for overflow */
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100548 if (size > PY_SSIZE_T_MAX / descr->itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 return PyErr_NoMemory();
550 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100551 nbytes = size * descr->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 op = (arrayobject *) type->tp_alloc(type, 0);
553 if (op == NULL) {
554 return NULL;
555 }
556 op->ob_descr = descr;
557 op->allocated = size;
558 op->weakreflist = NULL;
559 Py_SIZE(op) = size;
560 if (size <= 0) {
561 op->ob_item = NULL;
562 }
563 else {
564 op->ob_item = PyMem_NEW(char, nbytes);
565 if (op->ob_item == NULL) {
566 Py_DECREF(op);
567 return PyErr_NoMemory();
568 }
569 }
570 op->ob_exports = 0;
571 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000572}
573
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000574static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000575getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000576{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200577 arrayobject *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 assert(array_Check(op));
579 ap = (arrayobject *)op;
580 assert(i>=0 && i<Py_SIZE(ap));
581 return (*ap->ob_descr->getitem)(ap, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000582}
583
584static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000585ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 char *items;
588 Py_ssize_t n = Py_SIZE(self);
589 if (v == NULL) {
590 PyErr_BadInternalCall();
591 return -1;
592 }
593 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
594 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 if (array_resize(self, n+1) == -1)
597 return -1;
598 items = self->ob_item;
599 if (where < 0) {
600 where += n;
601 if (where < 0)
602 where = 0;
603 }
604 if (where > n)
605 where = n;
606 /* appends don't need to call memmove() */
607 if (where != n)
608 memmove(items + (where+1)*self->ob_descr->itemsize,
609 items + where*self->ob_descr->itemsize,
610 (n-where)*self->ob_descr->itemsize);
611 return (*self->ob_descr->setitem)(self, where, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000612}
613
Guido van Rossum778983b1993-02-19 15:55:02 +0000614/* Methods */
615
616static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000617array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 if (op->weakreflist != NULL)
620 PyObject_ClearWeakRefs((PyObject *) op);
621 if (op->ob_item != NULL)
622 PyMem_DEL(op->ob_item);
623 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000624}
625
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000626static PyObject *
627array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 arrayobject *va, *wa;
630 PyObject *vi = NULL;
631 PyObject *wi = NULL;
632 Py_ssize_t i, k;
633 PyObject *res;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000634
Brian Curtindfc80e32011-08-10 20:28:54 -0500635 if (!array_Check(v) || !array_Check(w))
636 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 va = (arrayobject *)v;
639 wa = (arrayobject *)w;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
642 /* Shortcut: if the lengths differ, the arrays differ */
643 if (op == Py_EQ)
644 res = Py_False;
645 else
646 res = Py_True;
647 Py_INCREF(res);
648 return res;
649 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 /* Search for the first index where items are different */
652 k = 1;
653 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
654 vi = getarrayitem(v, i);
655 wi = getarrayitem(w, i);
656 if (vi == NULL || wi == NULL) {
657 Py_XDECREF(vi);
658 Py_XDECREF(wi);
659 return NULL;
660 }
661 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
662 if (k == 0)
663 break; /* Keeping vi and wi alive! */
664 Py_DECREF(vi);
665 Py_DECREF(wi);
666 if (k < 0)
667 return NULL;
668 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 if (k) {
671 /* No more items to compare -- compare sizes */
672 Py_ssize_t vs = Py_SIZE(va);
673 Py_ssize_t ws = Py_SIZE(wa);
674 int cmp;
675 switch (op) {
676 case Py_LT: cmp = vs < ws; break;
677 case Py_LE: cmp = vs <= ws; break;
678 case Py_EQ: cmp = vs == ws; break;
679 case Py_NE: cmp = vs != ws; break;
680 case Py_GT: cmp = vs > ws; break;
681 case Py_GE: cmp = vs >= ws; break;
682 default: return NULL; /* cannot happen */
683 }
684 if (cmp)
685 res = Py_True;
686 else
687 res = Py_False;
688 Py_INCREF(res);
689 return res;
690 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 /* We have an item that differs. First, shortcuts for EQ/NE */
693 if (op == Py_EQ) {
694 Py_INCREF(Py_False);
695 res = Py_False;
696 }
697 else if (op == Py_NE) {
698 Py_INCREF(Py_True);
699 res = Py_True;
700 }
701 else {
702 /* Compare the final item again using the proper operator */
703 res = PyObject_RichCompare(vi, wi, op);
704 }
705 Py_DECREF(vi);
706 Py_DECREF(wi);
707 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000708}
709
Martin v. Löwis18e16552006-02-15 17:27:45 +0000710static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000711array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000714}
715
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000716static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000717array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 if (i < 0 || i >= Py_SIZE(a)) {
720 PyErr_SetString(PyExc_IndexError, "array index out of range");
721 return NULL;
722 }
723 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000724}
725
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000726static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000727array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 arrayobject *np;
730 if (ilow < 0)
731 ilow = 0;
732 else if (ilow > Py_SIZE(a))
733 ilow = Py_SIZE(a);
734 if (ihigh < 0)
735 ihigh = 0;
736 if (ihigh < ilow)
737 ihigh = ilow;
738 else if (ihigh > Py_SIZE(a))
739 ihigh = Py_SIZE(a);
740 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
741 if (np == NULL)
742 return NULL;
Martin Panterbe8da9c2016-09-07 11:04:41 +0000743 if (ihigh > ilow) {
744 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
745 (ihigh-ilow) * a->ob_descr->itemsize);
746 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000748}
749
Brett Cannon1eb32c22014-10-10 16:26:45 -0400750
751/*[clinic input]
752array.array.__copy__
753
754Return a copy of the array.
755[clinic start generated code]*/
756
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000757static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -0400758array_array___copy___impl(arrayobject *self)
759/*[clinic end generated code: output=dec7c3f925d9619e input=ad1ee5b086965f09]*/
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000760{
Brett Cannon1eb32c22014-10-10 16:26:45 -0400761 return array_slice(self, 0, Py_SIZE(self));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000762}
763
Brett Cannon1eb32c22014-10-10 16:26:45 -0400764/*[clinic input]
765array.array.__deepcopy__
766
767 unused: object
768 /
769
770Return a copy of the array.
771[clinic start generated code]*/
772
773static PyObject *
774array_array___deepcopy__(arrayobject *self, PyObject *unused)
775/*[clinic end generated code: output=1ec748d8e14a9faa input=2405ecb4933748c4]*/
776{
777 return array_array___copy___impl(self);
778}
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000779
780static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000781array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000782{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 Py_ssize_t size;
784 arrayobject *np;
785 if (!array_Check(bb)) {
786 PyErr_Format(PyExc_TypeError,
787 "can only append array (not \"%.200s\") to array",
788 Py_TYPE(bb)->tp_name);
789 return NULL;
790 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000791#define b ((arrayobject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 if (a->ob_descr != b->ob_descr) {
793 PyErr_BadArgument();
794 return NULL;
795 }
796 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
797 return PyErr_NoMemory();
798 }
799 size = Py_SIZE(a) + Py_SIZE(b);
800 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
801 if (np == NULL) {
802 return NULL;
803 }
Martin Panterbe8da9c2016-09-07 11:04:41 +0000804 if (Py_SIZE(a) > 0) {
805 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
806 }
807 if (Py_SIZE(b) > 0) {
808 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
809 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000812#undef b
813}
814
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000815static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000816array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 Py_ssize_t size;
819 arrayobject *np;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000820 Py_ssize_t oldbytes, newbytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 if (n < 0)
822 n = 0;
823 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
824 return PyErr_NoMemory();
825 }
826 size = Py_SIZE(a) * n;
827 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
828 if (np == NULL)
829 return NULL;
Martin Panterbe8da9c2016-09-07 11:04:41 +0000830 if (size == 0)
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000831 return (PyObject *)np;
832 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
833 newbytes = oldbytes * n;
834 /* this follows the code in unicode_repeat */
835 if (oldbytes == 1) {
836 memset(np->ob_item, a->ob_item[0], newbytes);
837 } else {
838 Py_ssize_t done = oldbytes;
Christian Heimesf051e432016-09-13 20:22:02 +0200839 memcpy(np->ob_item, a->ob_item, oldbytes);
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000840 while (done < newbytes) {
841 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
Christian Heimesf051e432016-09-13 20:22:02 +0200842 memcpy(np->ob_item+done, np->ob_item, ncopy);
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000843 done += ncopy;
844 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 }
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000846 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000847}
848
849static int
Martin Panter996d72b2016-07-25 02:21:14 +0000850array_del_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 char *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 Py_ssize_t d; /* Change in size */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 if (ilow < 0)
855 ilow = 0;
856 else if (ilow > Py_SIZE(a))
857 ilow = Py_SIZE(a);
858 if (ihigh < 0)
859 ihigh = 0;
860 if (ihigh < ilow)
861 ihigh = ilow;
862 else if (ihigh > Py_SIZE(a))
863 ihigh = Py_SIZE(a);
864 item = a->ob_item;
Martin Panter996d72b2016-07-25 02:21:14 +0000865 d = ihigh-ilow;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 /* Issue #4509: If the array has exported buffers and the slice
867 assignment would change the size of the array, fail early to make
868 sure we don't modify it. */
869 if (d != 0 && a->ob_exports > 0) {
870 PyErr_SetString(PyExc_BufferError,
871 "cannot resize an array that is exporting buffers");
872 return -1;
873 }
Martin Panter996d72b2016-07-25 02:21:14 +0000874 if (d > 0) { /* Delete d items */
875 memmove(item + (ihigh-d)*a->ob_descr->itemsize,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 item + ihigh*a->ob_descr->itemsize,
877 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Martin Panter996d72b2016-07-25 02:21:14 +0000878 if (array_resize(a, Py_SIZE(a) - d) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 return -1;
880 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000882}
883
884static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000885array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 if (i < 0 || i >= Py_SIZE(a)) {
888 PyErr_SetString(PyExc_IndexError,
889 "array assignment index out of range");
890 return -1;
891 }
892 if (v == NULL)
Martin Panter996d72b2016-07-25 02:21:14 +0000893 return array_del_slice(a, i, i+1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 return (*a->ob_descr->setitem)(a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000895}
896
897static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000898setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 assert(array_Check(a));
901 return array_ass_item((arrayobject *)a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000902}
903
Martin v. Löwis99866332002-03-01 10:27:01 +0000904static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000905array_iter_extend(arrayobject *self, PyObject *bb)
906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 PyObject *it, *v;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 it = PyObject_GetIter(bb);
910 if (it == NULL)
911 return -1;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 while ((v = PyIter_Next(it)) != NULL) {
Mark Dickinson346f0af2010-08-06 09:36:57 +0000914 if (ins1(self, Py_SIZE(self), v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 Py_DECREF(v);
916 Py_DECREF(it);
917 return -1;
918 }
919 Py_DECREF(v);
920 }
921 Py_DECREF(it);
922 if (PyErr_Occurred())
923 return -1;
924 return 0;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000925}
926
927static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000928array_do_extend(arrayobject *self, PyObject *bb)
929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 Py_ssize_t size, oldsize, bbsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 if (!array_Check(bb))
933 return array_iter_extend(self, bb);
934#define b ((arrayobject *)bb)
935 if (self->ob_descr != b->ob_descr) {
936 PyErr_SetString(PyExc_TypeError,
937 "can only extend with array of same kind");
938 return -1;
939 }
940 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
941 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
942 PyErr_NoMemory();
943 return -1;
944 }
945 oldsize = Py_SIZE(self);
946 /* Get the size of bb before resizing the array since bb could be self. */
947 bbsize = Py_SIZE(bb);
948 size = oldsize + Py_SIZE(b);
949 if (array_resize(self, size) == -1)
950 return -1;
Martin Panterbe8da9c2016-09-07 11:04:41 +0000951 if (bbsize > 0) {
952 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
953 b->ob_item, bbsize * b->ob_descr->itemsize);
954 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955
956 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000957#undef b
958}
959
960static PyObject *
961array_inplace_concat(arrayobject *self, PyObject *bb)
962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 if (!array_Check(bb)) {
964 PyErr_Format(PyExc_TypeError,
965 "can only extend array with array (not \"%.200s\")",
966 Py_TYPE(bb)->tp_name);
967 return NULL;
968 }
969 if (array_do_extend(self, bb) == -1)
970 return NULL;
971 Py_INCREF(self);
972 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000973}
974
975static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000976array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 char *items, *p;
979 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 if (Py_SIZE(self) > 0) {
982 if (n < 0)
983 n = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 if ((self->ob_descr->itemsize != 0) &&
985 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
986 return PyErr_NoMemory();
987 }
988 size = Py_SIZE(self) * self->ob_descr->itemsize;
989 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
990 return PyErr_NoMemory();
991 }
992 if (array_resize(self, n * Py_SIZE(self)) == -1)
993 return NULL;
994 items = p = self->ob_item;
995 for (i = 1; i < n; i++) {
996 p += size;
997 memcpy(p, items, size);
998 }
999 }
1000 Py_INCREF(self);
1001 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +00001002}
1003
1004
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001005static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001006ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 if (ins1(self, where, v) != 0)
1009 return NULL;
1010 Py_INCREF(Py_None);
1011 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001012}
1013
Brett Cannon1eb32c22014-10-10 16:26:45 -04001014/*[clinic input]
1015array.array.count
1016
1017 v: object
1018 /
1019
1020Return number of occurrences of v in the array.
1021[clinic start generated code]*/
1022
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001023static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001024array_array_count(arrayobject *self, PyObject *v)
1025/*[clinic end generated code: output=3dd3624bf7135a3a input=d9bce9d65e39d1f5]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 Py_ssize_t count = 0;
1028 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +02001031 PyObject *selfi;
1032 int cmp;
1033
1034 selfi = getarrayitem((PyObject *)self, i);
1035 if (selfi == NULL)
1036 return NULL;
1037 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 Py_DECREF(selfi);
1039 if (cmp > 0)
1040 count++;
1041 else if (cmp < 0)
1042 return NULL;
1043 }
1044 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001045}
1046
Brett Cannon1eb32c22014-10-10 16:26:45 -04001047
1048/*[clinic input]
1049array.array.index
1050
1051 v: object
1052 /
1053
1054Return index of first occurrence of v in the array.
1055[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001056
1057static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001058array_array_index(arrayobject *self, PyObject *v)
1059/*[clinic end generated code: output=d48498d325602167 input=cf619898c6649d08]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +02001064 PyObject *selfi;
1065 int cmp;
1066
1067 selfi = getarrayitem((PyObject *)self, i);
1068 if (selfi == NULL)
1069 return NULL;
1070 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 Py_DECREF(selfi);
1072 if (cmp > 0) {
1073 return PyLong_FromLong((long)i);
1074 }
1075 else if (cmp < 0)
1076 return NULL;
1077 }
1078 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
1079 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001080}
1081
Raymond Hettinger625812f2003-01-07 01:58:52 +00001082static int
1083array_contains(arrayobject *self, PyObject *v)
1084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 Py_ssize_t i;
1086 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1089 PyObject *selfi = getarrayitem((PyObject *)self, i);
Victor Stinner0b142e22013-07-17 23:01:30 +02001090 if (selfi == NULL)
Victor Stinner4755bea2013-07-18 01:12:35 +02001091 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1093 Py_DECREF(selfi);
1094 }
1095 return cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001096}
1097
Brett Cannon1eb32c22014-10-10 16:26:45 -04001098/*[clinic input]
1099array.array.remove
1100
1101 v: object
1102 /
1103
1104Remove the first occurrence of v in the array.
1105[clinic start generated code]*/
1106
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001107static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001108array_array_remove(arrayobject *self, PyObject *v)
1109/*[clinic end generated code: output=bef06be9fdf9dceb input=0b1e5aed25590027]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +02001114 PyObject *selfi;
1115 int cmp;
1116
1117 selfi = getarrayitem((PyObject *)self,i);
1118 if (selfi == NULL)
1119 return NULL;
1120 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 Py_DECREF(selfi);
1122 if (cmp > 0) {
Martin Panter996d72b2016-07-25 02:21:14 +00001123 if (array_del_slice(self, i, i+1) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 return NULL;
1125 Py_INCREF(Py_None);
1126 return Py_None;
1127 }
1128 else if (cmp < 0)
1129 return NULL;
1130 }
1131 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
1132 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001133}
1134
Brett Cannon1eb32c22014-10-10 16:26:45 -04001135/*[clinic input]
1136array.array.pop
1137
1138 i: Py_ssize_t = -1
1139 /
1140
1141Return the i-th element and delete it from the array.
1142
1143i defaults to -1.
1144[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001145
1146static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001147array_array_pop_impl(arrayobject *self, Py_ssize_t i)
1148/*[clinic end generated code: output=bc1f0c54fe5308e4 input=8e5feb4c1a11cd44]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 PyObject *v;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 if (Py_SIZE(self) == 0) {
1153 /* Special-case most common failure cause */
1154 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1155 return NULL;
1156 }
1157 if (i < 0)
1158 i += Py_SIZE(self);
1159 if (i < 0 || i >= Py_SIZE(self)) {
1160 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1161 return NULL;
1162 }
Victor Stinner0b142e22013-07-17 23:01:30 +02001163 v = getarrayitem((PyObject *)self, i);
1164 if (v == NULL)
1165 return NULL;
Martin Panter996d72b2016-07-25 02:21:14 +00001166 if (array_del_slice(self, i, i+1) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 Py_DECREF(v);
1168 return NULL;
1169 }
1170 return v;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001171}
1172
Brett Cannon1eb32c22014-10-10 16:26:45 -04001173/*[clinic input]
1174array.array.extend
1175
1176 bb: object
1177 /
1178
1179Append items to the end of the array.
1180[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001181
1182static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001183array_array_extend(arrayobject *self, PyObject *bb)
1184/*[clinic end generated code: output=bbddbc8e8bef871d input=43be86aba5c31e44]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 if (array_do_extend(self, bb) == -1)
1187 return NULL;
1188 Py_INCREF(Py_None);
1189 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001190}
1191
Brett Cannon1eb32c22014-10-10 16:26:45 -04001192/*[clinic input]
1193array.array.insert
1194
1195 i: Py_ssize_t
1196 v: object
1197 /
1198
1199Insert a new item v into the array before position i.
1200[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001201
1202static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001203array_array_insert_impl(arrayobject *self, Py_ssize_t i, PyObject *v)
1204/*[clinic end generated code: output=5a3648e278348564 input=5577d1b4383e9313]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 return ins(self, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001207}
1208
Brett Cannon1eb32c22014-10-10 16:26:45 -04001209/*[clinic input]
1210array.array.buffer_info
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001211
Brett Cannon1eb32c22014-10-10 16:26:45 -04001212Return a tuple (address, length) giving the current memory address and the length in items of the buffer used to hold array's contents.
1213
1214The length should be multiplied by the itemsize attribute to calculate
1215the buffer length in bytes.
1216[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001217
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001219array_array_buffer_info_impl(arrayobject *self)
1220/*[clinic end generated code: output=9b2a4ec3ae7e98e7 input=a58bae5c6e1ac6a6]*/
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001221{
Victor Stinner541067a2013-11-14 01:27:12 +01001222 PyObject *retval = NULL, *v;
1223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 retval = PyTuple_New(2);
1225 if (!retval)
1226 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001227
Victor Stinner541067a2013-11-14 01:27:12 +01001228 v = PyLong_FromVoidPtr(self->ob_item);
1229 if (v == NULL) {
1230 Py_DECREF(retval);
1231 return NULL;
1232 }
1233 PyTuple_SET_ITEM(retval, 0, v);
1234
Serhiy Storchaka9e941d62016-06-23 23:55:34 +03001235 v = PyLong_FromSsize_t(Py_SIZE(self));
Victor Stinner541067a2013-11-14 01:27:12 +01001236 if (v == NULL) {
1237 Py_DECREF(retval);
1238 return NULL;
1239 }
1240 PyTuple_SET_ITEM(retval, 1, v);
Fred Drake541dc3b2000-06-28 17:49:30 +00001241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001243}
1244
Brett Cannon1eb32c22014-10-10 16:26:45 -04001245/*[clinic input]
1246array.array.append
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001247
Brett Cannon1eb32c22014-10-10 16:26:45 -04001248 v: object
1249 /
1250
1251Append new value v to the end of the array.
1252[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001253
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001254static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001255array_array_append(arrayobject *self, PyObject *v)
1256/*[clinic end generated code: output=745a0669bf8db0e2 input=0b98d9d78e78f0fa]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001257{
Mark Dickinson346f0af2010-08-06 09:36:57 +00001258 return ins(self, Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001259}
1260
Brett Cannon1eb32c22014-10-10 16:26:45 -04001261/*[clinic input]
1262array.array.byteswap
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001263
Brett Cannon1eb32c22014-10-10 16:26:45 -04001264Byteswap all items of the array.
1265
1266If the items in the array are not 1, 2, 4, or 8 bytes in size, RuntimeError is
1267raised.
1268[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001269
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001270static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001271array_array_byteswap_impl(arrayobject *self)
1272/*[clinic end generated code: output=5f8236cbdf0d90b5 input=6a85591b950a0186]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 char *p;
1275 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 switch (self->ob_descr->itemsize) {
1278 case 1:
1279 break;
1280 case 2:
1281 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1282 char p0 = p[0];
1283 p[0] = p[1];
1284 p[1] = p0;
1285 }
1286 break;
1287 case 4:
1288 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1289 char p0 = p[0];
1290 char p1 = p[1];
1291 p[0] = p[3];
1292 p[1] = p[2];
1293 p[2] = p1;
1294 p[3] = p0;
1295 }
1296 break;
1297 case 8:
1298 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1299 char p0 = p[0];
1300 char p1 = p[1];
1301 char p2 = p[2];
1302 char p3 = p[3];
1303 p[0] = p[7];
1304 p[1] = p[6];
1305 p[2] = p[5];
1306 p[3] = p[4];
1307 p[4] = p3;
1308 p[5] = p2;
1309 p[6] = p1;
1310 p[7] = p0;
1311 }
1312 break;
1313 default:
1314 PyErr_SetString(PyExc_RuntimeError,
1315 "don't know how to byteswap this array type");
1316 return NULL;
1317 }
1318 Py_INCREF(Py_None);
1319 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001320}
1321
Brett Cannon1eb32c22014-10-10 16:26:45 -04001322/*[clinic input]
1323array.array.reverse
1324
1325Reverse the order of the items in the array.
1326[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001327
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001328static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001329array_array_reverse_impl(arrayobject *self)
1330/*[clinic end generated code: output=c04868b36f6f4089 input=cd904f01b27d966a]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001331{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001332 Py_ssize_t itemsize = self->ob_descr->itemsize;
1333 char *p, *q;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 /* little buffer to hold items while swapping */
1335 char tmp[256]; /* 8 is probably enough -- but why skimp */
1336 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 if (Py_SIZE(self) > 1) {
1339 for (p = self->ob_item,
1340 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1341 p < q;
1342 p += itemsize, q -= itemsize) {
1343 /* memory areas guaranteed disjoint, so memcpy
1344 * is safe (& memmove may be slower).
1345 */
1346 memcpy(tmp, p, itemsize);
1347 memcpy(p, q, itemsize);
1348 memcpy(q, tmp, itemsize);
1349 }
1350 }
Tim Petersbb307342000-09-10 05:22:54 +00001351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 Py_INCREF(Py_None);
1353 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001354}
Guido van Rossume77a7571993-11-03 15:01:26 +00001355
Brett Cannon1eb32c22014-10-10 16:26:45 -04001356/*[clinic input]
1357array.array.fromfile
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001358
Brett Cannon1eb32c22014-10-10 16:26:45 -04001359 f: object
1360 n: Py_ssize_t
1361 /
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001362
Brett Cannon1eb32c22014-10-10 16:26:45 -04001363Read n objects from the file object f and append them to the end of the array.
1364[clinic start generated code]*/
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001365
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001366static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001367array_array_fromfile_impl(arrayobject *self, PyObject *f, Py_ssize_t n)
1368/*[clinic end generated code: output=ec9f600e10f53510 input=e188afe8e58adf40]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001369{
Serhiy Storchaka04e6dba2015-04-04 17:06:55 +03001370 PyObject *b, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 Py_ssize_t itemsize = self->ob_descr->itemsize;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001372 Py_ssize_t nbytes;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001373 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001375
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001376 if (n < 0) {
1377 PyErr_SetString(PyExc_ValueError, "negative count");
1378 return NULL;
1379 }
1380 if (n > PY_SSIZE_T_MAX / itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 PyErr_NoMemory();
1382 return NULL;
1383 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001384 nbytes = n * itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001385
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001386 b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 if (b == NULL)
1388 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 if (!PyBytes_Check(b)) {
1391 PyErr_SetString(PyExc_TypeError,
1392 "read() didn't return bytes");
1393 Py_DECREF(b);
1394 return NULL;
1395 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001398
Serhiy Storchaka04e6dba2015-04-04 17:06:55 +03001399 res = array_array_frombytes(self, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 Py_DECREF(b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 if (res == NULL)
1402 return NULL;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 if (not_enough_bytes) {
1405 PyErr_SetString(PyExc_EOFError,
1406 "read() didn't return enough bytes");
1407 Py_DECREF(res);
1408 return NULL;
1409 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001412}
1413
Brett Cannon1eb32c22014-10-10 16:26:45 -04001414/*[clinic input]
1415array.array.tofile
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001416
Brett Cannon1eb32c22014-10-10 16:26:45 -04001417 f: object
1418 /
1419
1420Write all items (as machine values) to the file object f.
1421[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001422
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001423static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001424array_array_tofile(arrayobject *self, PyObject *f)
1425/*[clinic end generated code: output=3a2cfa8128df0777 input=b0669a484aab0831]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1428 /* Write 64K blocks at a time */
1429 /* XXX Make the block size settable */
1430 int BLOCKSIZE = 64*1024;
1431 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1432 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 if (Py_SIZE(self) == 0)
1435 goto done;
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 for (i = 0; i < nblocks; i++) {
1438 char* ptr = self->ob_item + i*BLOCKSIZE;
1439 Py_ssize_t size = BLOCKSIZE;
1440 PyObject *bytes, *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001441 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 if (i*BLOCKSIZE + size > nbytes)
1444 size = nbytes - i*BLOCKSIZE;
1445 bytes = PyBytes_FromStringAndSize(ptr, size);
1446 if (bytes == NULL)
1447 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001448 res = _PyObject_CallMethodId(f, &PyId_write, "O", bytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 Py_DECREF(bytes);
1450 if (res == NULL)
1451 return NULL;
1452 Py_DECREF(res); /* drop write result */
1453 }
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001454
1455 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 Py_INCREF(Py_None);
1457 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001458}
1459
Brett Cannon1eb32c22014-10-10 16:26:45 -04001460/*[clinic input]
1461array.array.fromlist
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001462
Brett Cannon1eb32c22014-10-10 16:26:45 -04001463 list: object
1464 /
1465
1466Append items to array from list.
1467[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001468
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001469static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001470array_array_fromlist(arrayobject *self, PyObject *list)
1471/*[clinic end generated code: output=26411c2d228a3e3f input=be2605a96c49680f]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 if (!PyList_Check(list)) {
1476 PyErr_SetString(PyExc_TypeError, "arg must be list");
1477 return NULL;
1478 }
1479 n = PyList_Size(list);
1480 if (n > 0) {
1481 Py_ssize_t i, old_size;
1482 old_size = Py_SIZE(self);
1483 if (array_resize(self, old_size + n) == -1)
1484 return NULL;
1485 for (i = 0; i < n; i++) {
1486 PyObject *v = PyList_GetItem(list, i);
1487 if ((*self->ob_descr->setitem)(self,
1488 Py_SIZE(self) - n + i, v) != 0) {
1489 array_resize(self, old_size);
1490 return NULL;
1491 }
1492 }
1493 }
1494 Py_INCREF(Py_None);
1495 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001496}
1497
Brett Cannon1eb32c22014-10-10 16:26:45 -04001498/*[clinic input]
1499array.array.tolist
1500
1501Convert array to an ordinary list with the same items.
1502[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001503
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001504static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001505array_array_tolist_impl(arrayobject *self)
1506/*[clinic end generated code: output=00b60cc9eab8ef89 input=a8d7784a94f86b53]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 PyObject *list = PyList_New(Py_SIZE(self));
1509 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 if (list == NULL)
1512 return NULL;
1513 for (i = 0; i < Py_SIZE(self); i++) {
1514 PyObject *v = getarrayitem((PyObject *)self, i);
Victor Stinner4755bea2013-07-18 01:12:35 +02001515 if (v == NULL)
1516 goto error;
1517 if (PyList_SetItem(list, i, v) < 0)
1518 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 }
1520 return list;
Victor Stinner4755bea2013-07-18 01:12:35 +02001521
1522error:
1523 Py_DECREF(list);
1524 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001525}
1526
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001527static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001528frombytes(arrayobject *self, Py_buffer *buffer)
Guido van Rossum778983b1993-02-19 15:55:02 +00001529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 int itemsize = self->ob_descr->itemsize;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001531 Py_ssize_t n;
1532 if (buffer->itemsize != 1) {
1533 PyBuffer_Release(buffer);
Serhiy Storchakab757c832014-12-05 22:25:22 +02001534 PyErr_SetString(PyExc_TypeError, "a bytes-like object is required");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001536 }
1537 n = buffer->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 if (n % itemsize != 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001539 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 PyErr_SetString(PyExc_ValueError,
Serhiy Storchakab757c832014-12-05 22:25:22 +02001541 "bytes length not a multiple of item size");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 return NULL;
1543 }
1544 n = n / itemsize;
1545 if (n > 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001546 Py_ssize_t old_size = Py_SIZE(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 if ((n > PY_SSIZE_T_MAX - old_size) ||
1548 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001549 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 return PyErr_NoMemory();
1551 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001552 if (array_resize(self, old_size + n) == -1) {
1553 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001555 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 memcpy(self->ob_item + old_size * itemsize,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001557 buffer->buf, n * itemsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001559 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 Py_INCREF(Py_None);
1561 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001562}
1563
Brett Cannon1eb32c22014-10-10 16:26:45 -04001564/*[clinic input]
1565array.array.fromstring
1566
Larry Hastingsdbfdc382015-05-04 06:59:46 -07001567 buffer: Py_buffer(accept={str, buffer})
Brett Cannon1eb32c22014-10-10 16:26:45 -04001568 /
1569
1570Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method).
1571
1572This method is deprecated. Use frombytes instead.
1573[clinic start generated code]*/
1574
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001575static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001576array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer)
Larry Hastingsdbfdc382015-05-04 06:59:46 -07001577/*[clinic end generated code: output=31c4baa779df84ce input=a3341a512e11d773]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001578{
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001579 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1580 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
1581 return NULL;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001582 return frombytes(self, buffer);
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001583}
1584
Brett Cannon1eb32c22014-10-10 16:26:45 -04001585/*[clinic input]
1586array.array.frombytes
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001587
Brett Cannon1eb32c22014-10-10 16:26:45 -04001588 buffer: Py_buffer
1589 /
1590
1591Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method).
1592[clinic start generated code]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001593
1594static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001595array_array_frombytes_impl(arrayobject *self, Py_buffer *buffer)
1596/*[clinic end generated code: output=d9842c8f7510a516 input=2bbf2b53ebfcc988]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001597{
Brett Cannon1eb32c22014-10-10 16:26:45 -04001598 return frombytes(self, buffer);
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001599}
1600
Brett Cannon1eb32c22014-10-10 16:26:45 -04001601/*[clinic input]
1602array.array.tobytes
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001603
Brett Cannon1eb32c22014-10-10 16:26:45 -04001604Convert the array to an array of machine values and return the bytes representation.
1605[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001606
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001607static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001608array_array_tobytes_impl(arrayobject *self)
1609/*[clinic end generated code: output=87318e4edcdc2bb6 input=90ee495f96de34f5]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1612 return PyBytes_FromStringAndSize(self->ob_item,
1613 Py_SIZE(self) * self->ob_descr->itemsize);
1614 } else {
1615 return PyErr_NoMemory();
1616 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001617}
1618
Brett Cannon1eb32c22014-10-10 16:26:45 -04001619/*[clinic input]
1620array.array.tostring
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001621
Brett Cannon1eb32c22014-10-10 16:26:45 -04001622Convert the array to an array of machine values and return the bytes representation.
1623
1624This method is deprecated. Use tobytes instead.
1625[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001626
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001627static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001628array_array_tostring_impl(arrayobject *self)
1629/*[clinic end generated code: output=7d6bd92745a2c8f3 input=b6c0ddee7b30457e]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001630{
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001631 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001632 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
1633 return NULL;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001634 return array_array_tobytes_impl(self);
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001635}
1636
Brett Cannon1eb32c22014-10-10 16:26:45 -04001637/*[clinic input]
1638array.array.fromunicode
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001639
Larry Hastings38337d12015-05-07 23:30:09 -07001640 ustr: Py_UNICODE(zeroes=True)
Brett Cannon1eb32c22014-10-10 16:26:45 -04001641 /
1642
1643Extends this array with data from the unicode string ustr.
1644
1645The array must be a unicode type array; otherwise a ValueError is raised.
1646Use array.frombytes(ustr.encode(...)) to append Unicode data to an array of
1647some other type.
1648[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001649
Martin v. Löwis99866332002-03-01 10:27:01 +00001650static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001651array_array_fromunicode_impl(arrayobject *self, Py_UNICODE *ustr,
1652 Py_ssize_clean_t ustr_length)
Larry Hastings38337d12015-05-07 23:30:09 -07001653/*[clinic end generated code: output=ebb72fc16975e06d input=150f00566ffbca6e]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001654{
Victor Stinner62bb3942012-08-06 00:46:05 +02001655 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001656
Victor Stinner62bb3942012-08-06 00:46:05 +02001657 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001658 if (typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 PyErr_SetString(PyExc_ValueError,
1660 "fromunicode() may only be called on "
1661 "unicode type arrays");
1662 return NULL;
1663 }
Brett Cannon1eb32c22014-10-10 16:26:45 -04001664 if (ustr_length > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 Py_ssize_t old_size = Py_SIZE(self);
Brett Cannon1eb32c22014-10-10 16:26:45 -04001666 if (array_resize(self, old_size + ustr_length) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 return NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02001668 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
Brett Cannon1eb32c22014-10-10 16:26:45 -04001669 ustr, ustr_length * sizeof(Py_UNICODE));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001671
Brett Cannon1eb32c22014-10-10 16:26:45 -04001672 Py_RETURN_NONE;
Martin v. Löwis99866332002-03-01 10:27:01 +00001673}
1674
Brett Cannon1eb32c22014-10-10 16:26:45 -04001675/*[clinic input]
1676array.array.tounicode
Martin v. Löwis99866332002-03-01 10:27:01 +00001677
Brett Cannon1eb32c22014-10-10 16:26:45 -04001678Extends this array with data from the unicode string ustr.
1679
1680Convert the array to a unicode string. The array must be a unicode type array;
1681otherwise a ValueError is raised. Use array.tobytes().decode() to obtain a
1682unicode string from an array of some other type.
1683[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001684
1685static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001686array_array_tounicode_impl(arrayobject *self)
1687/*[clinic end generated code: output=08e442378336e1ef input=127242eebe70b66d]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001688{
Victor Stinner62bb3942012-08-06 00:46:05 +02001689 char typecode;
1690 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001691 if (typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 PyErr_SetString(PyExc_ValueError,
1693 "tounicode() may only be called on unicode type arrays");
1694 return NULL;
1695 }
Victor Stinner62bb3942012-08-06 00:46:05 +02001696 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001697}
1698
Brett Cannon1eb32c22014-10-10 16:26:45 -04001699/*[clinic input]
1700array.array.__sizeof__
Martin v. Löwis99866332002-03-01 10:27:01 +00001701
Brett Cannon1eb32c22014-10-10 16:26:45 -04001702Size of the array in memory, in bytes.
1703[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001704
Meador Inge03b4d502012-08-10 22:35:45 -05001705static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001706array_array___sizeof___impl(arrayobject *self)
1707/*[clinic end generated code: output=d8e1c61ebbe3eaed input=805586565bf2b3c6]*/
Meador Inge03b4d502012-08-10 22:35:45 -05001708{
1709 Py_ssize_t res;
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001710 res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * self->ob_descr->itemsize;
Meador Inge03b4d502012-08-10 22:35:45 -05001711 return PyLong_FromSsize_t(res);
1712}
1713
Martin v. Löwis99866332002-03-01 10:27:01 +00001714
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001715/*********************** Pickling support ************************/
1716
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001717static const struct mformatdescr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 size_t size;
1719 int is_signed;
1720 int is_big_endian;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001721} mformat_descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1723 {1, 1, 0}, /* 1: SIGNED_INT8 */
1724 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1725 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1726 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1727 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1728 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1729 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1730 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1731 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1732 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1733 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1734 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1735 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1736 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1737 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1738 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1739 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1740 {4, 0, 0}, /* 18: UTF16_LE */
1741 {4, 0, 1}, /* 19: UTF16_BE */
1742 {8, 0, 0}, /* 20: UTF32_LE */
1743 {8, 0, 1} /* 21: UTF32_BE */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001744};
1745
1746
1747/*
1748 * Internal: This function is used to find the machine format of a given
1749 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1750 * be found.
1751 */
1752static enum machine_format_code
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001753typecode_to_mformat_code(char typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001754{
Christian Heimes743e0cd2012-10-17 23:52:17 +02001755 const int is_big_endian = PY_BIG_ENDIAN;
1756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 size_t intsize;
1758 int is_signed;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 switch (typecode) {
1761 case 'b':
1762 return SIGNED_INT8;
1763 case 'B':
1764 return UNSIGNED_INT8;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 case 'u':
Victor Stinner62bb3942012-08-06 00:46:05 +02001767 if (sizeof(Py_UNICODE) == 2) {
1768 return UTF16_LE + is_big_endian;
1769 }
1770 if (sizeof(Py_UNICODE) == 4) {
1771 return UTF32_LE + is_big_endian;
1772 }
1773 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 case 'f':
1776 if (sizeof(float) == 4) {
1777 const float y = 16711938.0;
1778 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1779 return IEEE_754_FLOAT_BE;
1780 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1781 return IEEE_754_FLOAT_LE;
1782 }
1783 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 case 'd':
1786 if (sizeof(double) == 8) {
1787 const double x = 9006104071832581.0;
1788 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1789 return IEEE_754_DOUBLE_BE;
1790 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1791 return IEEE_754_DOUBLE_LE;
1792 }
1793 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 /* Integers */
1796 case 'h':
1797 intsize = sizeof(short);
1798 is_signed = 1;
1799 break;
1800 case 'H':
1801 intsize = sizeof(short);
1802 is_signed = 0;
1803 break;
1804 case 'i':
1805 intsize = sizeof(int);
1806 is_signed = 1;
1807 break;
1808 case 'I':
1809 intsize = sizeof(int);
1810 is_signed = 0;
1811 break;
1812 case 'l':
1813 intsize = sizeof(long);
1814 is_signed = 1;
1815 break;
1816 case 'L':
1817 intsize = sizeof(long);
1818 is_signed = 0;
1819 break;
Meador Inge1c9f0c92011-09-20 19:55:51 -05001820 case 'q':
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001821 intsize = sizeof(long long);
Meador Inge1c9f0c92011-09-20 19:55:51 -05001822 is_signed = 1;
1823 break;
1824 case 'Q':
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001825 intsize = sizeof(long long);
Meador Inge1c9f0c92011-09-20 19:55:51 -05001826 is_signed = 0;
1827 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 default:
1829 return UNKNOWN_FORMAT;
1830 }
1831 switch (intsize) {
1832 case 2:
1833 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1834 case 4:
1835 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1836 case 8:
1837 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1838 default:
1839 return UNKNOWN_FORMAT;
1840 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001841}
1842
1843/* Forward declaration. */
1844static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1845
1846/*
1847 * Internal: This function wraps the array constructor--i.e., array_new()--to
1848 * allow the creation of array objects from C code without having to deal
1849 * directly the tuple argument of array_new(). The typecode argument is a
1850 * Unicode character value, like 'i' or 'f' for example, representing an array
1851 * type code. The items argument is a bytes or a list object from which
1852 * contains the initial value of the array.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 *
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001854 * On success, this functions returns the array object created. Otherwise,
1855 * NULL is returned to indicate a failure.
1856 */
1857static PyObject *
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001858make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 PyObject *new_args;
1861 PyObject *array_obj;
1862 PyObject *typecode_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 assert(arraytype != NULL);
1865 assert(items != NULL);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001866
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001867 typecode_obj = PyUnicode_FromOrdinal(typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 if (typecode_obj == NULL)
1869 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 new_args = PyTuple_New(2);
1872 if (new_args == NULL)
1873 return NULL;
1874 Py_INCREF(items);
1875 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1876 PyTuple_SET_ITEM(new_args, 1, items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 array_obj = array_new(arraytype, new_args, NULL);
1879 Py_DECREF(new_args);
1880 if (array_obj == NULL)
1881 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 return array_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001884}
1885
1886/*
1887 * This functions is a special constructor used when unpickling an array. It
1888 * provides a portable way to rebuild an array from its memory representation.
1889 */
Brett Cannon1eb32c22014-10-10 16:26:45 -04001890/*[clinic input]
1891array._array_reconstructor
1892
1893 arraytype: object(type="PyTypeObject *")
Larry Hastingsdbfdc382015-05-04 06:59:46 -07001894 typecode: int(accept={str})
Brett Cannon1eb32c22014-10-10 16:26:45 -04001895 mformat_code: int(type="enum machine_format_code")
1896 items: object
1897 /
1898
1899Internal. Used for pickling support.
1900[clinic start generated code]*/
1901
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001902static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001903array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype,
Larry Hastings89964c42015-04-14 18:07:59 -04001904 int typecode,
1905 enum machine_format_code mformat_code,
1906 PyObject *items)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001907/*[clinic end generated code: output=e05263141ba28365 input=2464dc8f4c7736b5]*/
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 PyObject *converted_items;
1910 PyObject *result;
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001911 const struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 if (!PyType_Check(arraytype)) {
1914 PyErr_Format(PyExc_TypeError,
1915 "first argument must a type object, not %.200s",
1916 Py_TYPE(arraytype)->tp_name);
1917 return NULL;
1918 }
1919 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1920 PyErr_Format(PyExc_TypeError,
1921 "%.200s is not a subtype of %.200s",
1922 arraytype->tp_name, Arraytype.tp_name);
1923 return NULL;
1924 }
1925 for (descr = descriptors; descr->typecode != '\0'; descr++) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001926 if ((int)descr->typecode == typecode)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 break;
1928 }
1929 if (descr->typecode == '\0') {
1930 PyErr_SetString(PyExc_ValueError,
1931 "second argument must be a valid type code");
1932 return NULL;
1933 }
Larry Hastingsdfbeb162014-10-13 10:39:41 +01001934 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
1935 mformat_code > MACHINE_FORMAT_CODE_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 PyErr_SetString(PyExc_ValueError,
1937 "third argument must be a valid machine format code.");
1938 return NULL;
1939 }
1940 if (!PyBytes_Check(items)) {
1941 PyErr_Format(PyExc_TypeError,
1942 "fourth argument should be bytes, not %.200s",
1943 Py_TYPE(items)->tp_name);
1944 return NULL;
1945 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 /* Fast path: No decoding has to be done. */
Larry Hastingsdfbeb162014-10-13 10:39:41 +01001948 if (mformat_code == typecode_to_mformat_code((char)typecode) ||
1949 mformat_code == UNKNOWN_FORMAT) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001950 return make_array(arraytype, (char)typecode, items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 /* Slow path: Decode the byte string according to the given machine
1954 * format code. This occurs when the computer unpickling the array
1955 * object is architecturally different from the one that pickled the
1956 * array.
1957 */
Larry Hastingsdfbeb162014-10-13 10:39:41 +01001958 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 PyErr_SetString(PyExc_ValueError,
1960 "string length not a multiple of item size");
1961 return NULL;
1962 }
Larry Hastingsdfbeb162014-10-13 10:39:41 +01001963 switch (mformat_code) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 case IEEE_754_FLOAT_LE:
1965 case IEEE_754_FLOAT_BE: {
1966 int i;
Larry Hastingsdfbeb162014-10-13 10:39:41 +01001967 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 Py_ssize_t itemcount = Py_SIZE(items) / 4;
1969 const unsigned char *memstr =
1970 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 converted_items = PyList_New(itemcount);
1973 if (converted_items == NULL)
1974 return NULL;
1975 for (i = 0; i < itemcount; i++) {
1976 PyObject *pyfloat = PyFloat_FromDouble(
1977 _PyFloat_Unpack4(&memstr[i * 4], le));
1978 if (pyfloat == NULL) {
1979 Py_DECREF(converted_items);
1980 return NULL;
1981 }
1982 PyList_SET_ITEM(converted_items, i, pyfloat);
1983 }
1984 break;
1985 }
1986 case IEEE_754_DOUBLE_LE:
1987 case IEEE_754_DOUBLE_BE: {
1988 int i;
Larry Hastingsdfbeb162014-10-13 10:39:41 +01001989 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 Py_ssize_t itemcount = Py_SIZE(items) / 8;
1991 const unsigned char *memstr =
1992 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 converted_items = PyList_New(itemcount);
1995 if (converted_items == NULL)
1996 return NULL;
1997 for (i = 0; i < itemcount; i++) {
1998 PyObject *pyfloat = PyFloat_FromDouble(
1999 _PyFloat_Unpack8(&memstr[i * 8], le));
2000 if (pyfloat == NULL) {
2001 Py_DECREF(converted_items);
2002 return NULL;
2003 }
2004 PyList_SET_ITEM(converted_items, i, pyfloat);
2005 }
2006 break;
2007 }
2008 case UTF16_LE:
2009 case UTF16_BE: {
Larry Hastingsdfbeb162014-10-13 10:39:41 +01002010 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 converted_items = PyUnicode_DecodeUTF16(
2012 PyBytes_AS_STRING(items), Py_SIZE(items),
2013 "strict", &byteorder);
2014 if (converted_items == NULL)
2015 return NULL;
2016 break;
2017 }
2018 case UTF32_LE:
2019 case UTF32_BE: {
Larry Hastingsdfbeb162014-10-13 10:39:41 +01002020 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 converted_items = PyUnicode_DecodeUTF32(
2022 PyBytes_AS_STRING(items), Py_SIZE(items),
2023 "strict", &byteorder);
2024 if (converted_items == NULL)
2025 return NULL;
2026 break;
2027 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 case UNSIGNED_INT8:
2030 case SIGNED_INT8:
2031 case UNSIGNED_INT16_LE:
2032 case UNSIGNED_INT16_BE:
2033 case SIGNED_INT16_LE:
2034 case SIGNED_INT16_BE:
2035 case UNSIGNED_INT32_LE:
2036 case UNSIGNED_INT32_BE:
2037 case SIGNED_INT32_LE:
2038 case SIGNED_INT32_BE:
2039 case UNSIGNED_INT64_LE:
2040 case UNSIGNED_INT64_BE:
2041 case SIGNED_INT64_LE:
2042 case SIGNED_INT64_BE: {
2043 int i;
2044 const struct mformatdescr mf_descr =
Larry Hastingsdfbeb162014-10-13 10:39:41 +01002045 mformat_descriptors[mformat_code];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
2047 const unsigned char *memstr =
2048 (unsigned char *)PyBytes_AS_STRING(items);
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02002049 const struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 /* If possible, try to pack array's items using a data type
2052 * that fits better. This may result in an array with narrower
2053 * or wider elements.
2054 *
Martin Panter4c359642016-05-08 13:53:41 +00002055 * For example, if a 32-bit machine pickles an L-code array of
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 * unsigned longs, then the array will be unpickled by 64-bit
2057 * machine as an I-code array of unsigned ints.
2058 *
2059 * XXX: Is it possible to write a unit test for this?
2060 */
2061 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2062 if (descr->is_integer_type &&
Victor Stinner706768c2014-08-16 01:03:39 +02002063 (size_t)descr->itemsize == mf_descr.size &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 descr->is_signed == mf_descr.is_signed)
2065 typecode = descr->typecode;
2066 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 converted_items = PyList_New(itemcount);
2069 if (converted_items == NULL)
2070 return NULL;
2071 for (i = 0; i < itemcount; i++) {
2072 PyObject *pylong;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 pylong = _PyLong_FromByteArray(
2075 &memstr[i * mf_descr.size],
2076 mf_descr.size,
2077 !mf_descr.is_big_endian,
2078 mf_descr.is_signed);
2079 if (pylong == NULL) {
2080 Py_DECREF(converted_items);
2081 return NULL;
2082 }
2083 PyList_SET_ITEM(converted_items, i, pylong);
2084 }
2085 break;
2086 }
2087 case UNKNOWN_FORMAT:
2088 /* Impossible, but needed to shut up GCC about the unhandled
2089 * enumeration value.
2090 */
2091 default:
2092 PyErr_BadArgument();
2093 return NULL;
2094 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002095
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002096 result = make_array(arraytype, (char)typecode, converted_items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 Py_DECREF(converted_items);
2098 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002099}
2100
Brett Cannon1eb32c22014-10-10 16:26:45 -04002101/*[clinic input]
2102array.array.__reduce_ex__
2103
2104 value: object
2105 /
2106
2107Return state information for pickling.
2108[clinic start generated code]*/
2109
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002110static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04002111array_array___reduce_ex__(arrayobject *self, PyObject *value)
2112/*[clinic end generated code: output=051e0a6175d0eddb input=c36c3f85de7df6cd]*/
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 PyObject *dict;
2115 PyObject *result;
2116 PyObject *array_str;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002117 int typecode = self->ob_descr->typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 int mformat_code;
2119 static PyObject *array_reconstructor = NULL;
2120 long protocol;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002121 _Py_IDENTIFIER(_array_reconstructor);
2122 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 if (array_reconstructor == NULL) {
2125 PyObject *array_module = PyImport_ImportModule("array");
2126 if (array_module == NULL)
2127 return NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002128 array_reconstructor = _PyObject_GetAttrId(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 array_module,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002130 &PyId__array_reconstructor);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 Py_DECREF(array_module);
2132 if (array_reconstructor == NULL)
2133 return NULL;
2134 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 if (!PyLong_Check(value)) {
2137 PyErr_SetString(PyExc_TypeError,
2138 "__reduce_ex__ argument should an integer");
2139 return NULL;
2140 }
2141 protocol = PyLong_AsLong(value);
2142 if (protocol == -1 && PyErr_Occurred())
2143 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002144
Brett Cannon1eb32c22014-10-10 16:26:45 -04002145 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 if (dict == NULL) {
2147 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2148 return NULL;
2149 PyErr_Clear();
2150 dict = Py_None;
2151 Py_INCREF(dict);
2152 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 mformat_code = typecode_to_mformat_code(typecode);
2155 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
2156 /* Convert the array to a list if we got something weird
2157 * (e.g., non-IEEE floats), or we are pickling the array using
2158 * a Python 2.x compatible protocol.
2159 *
2160 * It is necessary to use a list representation for Python 2.x
2161 * compatible pickle protocol, since Python 2's str objects
2162 * are unpickled as unicode by Python 3. Thus it is impossible
2163 * to make arrays unpicklable by Python 3 by using their memory
2164 * representation, unless we resort to ugly hacks such as
2165 * coercing unicode objects to bytes in array_reconstructor.
2166 */
2167 PyObject *list;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002168 list = array_array_tolist_impl(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 if (list == NULL) {
2170 Py_DECREF(dict);
2171 return NULL;
2172 }
2173 result = Py_BuildValue(
Brett Cannon1eb32c22014-10-10 16:26:45 -04002174 "O(CO)O", Py_TYPE(self), typecode, list, dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 Py_DECREF(list);
2176 Py_DECREF(dict);
2177 return result;
2178 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002179
Brett Cannon1eb32c22014-10-10 16:26:45 -04002180 array_str = array_array_tobytes_impl(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 if (array_str == NULL) {
2182 Py_DECREF(dict);
2183 return NULL;
2184 }
2185 result = Py_BuildValue(
Brett Cannon1eb32c22014-10-10 16:26:45 -04002186 "O(OCiN)O", array_reconstructor, Py_TYPE(self), typecode,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 mformat_code, array_str, dict);
2188 Py_DECREF(dict);
2189 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002190}
2191
Martin v. Löwis99866332002-03-01 10:27:01 +00002192static PyObject *
2193array_get_typecode(arrayobject *a, void *closure)
2194{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002195 char typecode = a->ob_descr->typecode;
2196 return PyUnicode_FromOrdinal(typecode);
Martin v. Löwis99866332002-03-01 10:27:01 +00002197}
2198
2199static PyObject *
2200array_get_itemsize(arrayobject *a, void *closure)
2201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00002203}
2204
2205static PyGetSetDef array_getsets [] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 {"typecode", (getter) array_get_typecode, NULL,
2207 "the typecode character used to create the array"},
2208 {"itemsize", (getter) array_get_itemsize, NULL,
2209 "the size, in bytes, of one array item"},
2210 {NULL}
Martin v. Löwis99866332002-03-01 10:27:01 +00002211};
2212
Martin v. Löwis59683e82008-06-13 07:50:45 +00002213static PyMethodDef array_methods[] = {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002214 ARRAY_ARRAY_APPEND_METHODDEF
2215 ARRAY_ARRAY_BUFFER_INFO_METHODDEF
2216 ARRAY_ARRAY_BYTESWAP_METHODDEF
2217 ARRAY_ARRAY___COPY___METHODDEF
2218 ARRAY_ARRAY_COUNT_METHODDEF
2219 ARRAY_ARRAY___DEEPCOPY___METHODDEF
2220 ARRAY_ARRAY_EXTEND_METHODDEF
2221 ARRAY_ARRAY_FROMFILE_METHODDEF
2222 ARRAY_ARRAY_FROMLIST_METHODDEF
2223 ARRAY_ARRAY_FROMSTRING_METHODDEF
2224 ARRAY_ARRAY_FROMBYTES_METHODDEF
2225 ARRAY_ARRAY_FROMUNICODE_METHODDEF
2226 ARRAY_ARRAY_INDEX_METHODDEF
2227 ARRAY_ARRAY_INSERT_METHODDEF
2228 ARRAY_ARRAY_POP_METHODDEF
2229 ARRAY_ARRAY___REDUCE_EX___METHODDEF
2230 ARRAY_ARRAY_REMOVE_METHODDEF
2231 ARRAY_ARRAY_REVERSE_METHODDEF
2232 ARRAY_ARRAY_TOFILE_METHODDEF
2233 ARRAY_ARRAY_TOLIST_METHODDEF
2234 ARRAY_ARRAY_TOSTRING_METHODDEF
2235 ARRAY_ARRAY_TOBYTES_METHODDEF
2236 ARRAY_ARRAY_TOUNICODE_METHODDEF
2237 ARRAY_ARRAY___SIZEOF___METHODDEF
2238 {NULL, NULL} /* sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +00002239};
2240
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002241static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002242array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002243{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002244 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 PyObject *s, *v = NULL;
2246 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 len = Py_SIZE(a);
2249 typecode = a->ob_descr->typecode;
2250 if (len == 0) {
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002251 return PyUnicode_FromFormat("array('%c')", (int)typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 }
Gregory P. Smith9504b132012-12-10 20:20:20 -08002253 if (typecode == 'u') {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002254 v = array_array_tounicode_impl(a);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002255 } else {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002256 v = array_array_tolist_impl(a);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002257 }
Victor Stinner29ec5952013-02-26 00:27:38 +01002258 if (v == NULL)
2259 return NULL;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002260
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002261 s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 Py_DECREF(v);
2263 return s;
Guido van Rossum778983b1993-02-19 15:55:02 +00002264}
2265
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002266static PyObject*
2267array_subscr(arrayobject* self, PyObject* item)
2268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 if (PyIndex_Check(item)) {
2270 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2271 if (i==-1 && PyErr_Occurred()) {
2272 return NULL;
2273 }
2274 if (i < 0)
2275 i += Py_SIZE(self);
2276 return array_item(self, i);
2277 }
2278 else if (PySlice_Check(item)) {
2279 Py_ssize_t start, stop, step, slicelength, cur, i;
2280 PyObject* result;
2281 arrayobject* ar;
2282 int itemsize = self->ob_descr->itemsize;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002283
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002284 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 &start, &stop, &step, &slicelength) < 0) {
2286 return NULL;
2287 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 if (slicelength <= 0) {
2290 return newarrayobject(&Arraytype, 0, self->ob_descr);
2291 }
2292 else if (step == 1) {
2293 PyObject *result = newarrayobject(&Arraytype,
2294 slicelength, self->ob_descr);
2295 if (result == NULL)
2296 return NULL;
2297 memcpy(((arrayobject *)result)->ob_item,
2298 self->ob_item + start * itemsize,
2299 slicelength * itemsize);
2300 return result;
2301 }
2302 else {
2303 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2304 if (!result) return NULL;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 ar = (arrayobject*)result;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 for (cur = start, i = 0; i < slicelength;
2309 cur += step, i++) {
2310 memcpy(ar->ob_item + i*itemsize,
2311 self->ob_item + cur*itemsize,
2312 itemsize);
2313 }
2314
2315 return result;
2316 }
2317 }
2318 else {
2319 PyErr_SetString(PyExc_TypeError,
2320 "array indices must be integers");
2321 return NULL;
2322 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002323}
2324
2325static int
2326array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 Py_ssize_t start, stop, step, slicelength, needed;
2329 arrayobject* other;
2330 int itemsize;
Thomas Woutersed03b412007-08-28 21:37:11 +00002331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 if (PyIndex_Check(item)) {
2333 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 if (i == -1 && PyErr_Occurred())
2336 return -1;
2337 if (i < 0)
2338 i += Py_SIZE(self);
2339 if (i < 0 || i >= Py_SIZE(self)) {
2340 PyErr_SetString(PyExc_IndexError,
2341 "array assignment index out of range");
2342 return -1;
2343 }
2344 if (value == NULL) {
2345 /* Fall through to slice assignment */
2346 start = i;
2347 stop = i + 1;
2348 step = 1;
2349 slicelength = 1;
2350 }
2351 else
2352 return (*self->ob_descr->setitem)(self, i, value);
2353 }
2354 else if (PySlice_Check(item)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002355 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 Py_SIZE(self), &start, &stop,
2357 &step, &slicelength) < 0) {
2358 return -1;
2359 }
2360 }
2361 else {
2362 PyErr_SetString(PyExc_TypeError,
2363 "array indices must be integer");
2364 return -1;
2365 }
2366 if (value == NULL) {
2367 other = NULL;
2368 needed = 0;
2369 }
2370 else if (array_Check(value)) {
2371 other = (arrayobject *)value;
2372 needed = Py_SIZE(other);
2373 if (self == other) {
2374 /* Special case "self[i:j] = self" -- copy self first */
2375 int ret;
2376 value = array_slice(other, 0, needed);
2377 if (value == NULL)
2378 return -1;
2379 ret = array_ass_subscr(self, item, value);
2380 Py_DECREF(value);
2381 return ret;
2382 }
2383 if (other->ob_descr != self->ob_descr) {
2384 PyErr_BadArgument();
2385 return -1;
2386 }
2387 }
2388 else {
2389 PyErr_Format(PyExc_TypeError,
2390 "can only assign array (not \"%.200s\") to array slice",
2391 Py_TYPE(value)->tp_name);
2392 return -1;
2393 }
2394 itemsize = self->ob_descr->itemsize;
2395 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2396 if ((step > 0 && stop < start) ||
2397 (step < 0 && stop > start))
2398 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 /* Issue #4509: If the array has exported buffers and the slice
2401 assignment would change the size of the array, fail early to make
2402 sure we don't modify it. */
2403 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2404 PyErr_SetString(PyExc_BufferError,
2405 "cannot resize an array that is exporting buffers");
2406 return -1;
2407 }
Mark Dickinsonbc099642010-01-29 17:27:24 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 if (step == 1) {
2410 if (slicelength > needed) {
2411 memmove(self->ob_item + (start + needed) * itemsize,
2412 self->ob_item + stop * itemsize,
2413 (Py_SIZE(self) - stop) * itemsize);
2414 if (array_resize(self, Py_SIZE(self) +
2415 needed - slicelength) < 0)
2416 return -1;
2417 }
2418 else if (slicelength < needed) {
2419 if (array_resize(self, Py_SIZE(self) +
2420 needed - slicelength) < 0)
2421 return -1;
2422 memmove(self->ob_item + (start + needed) * itemsize,
2423 self->ob_item + stop * itemsize,
2424 (Py_SIZE(self) - start - needed) * itemsize);
2425 }
2426 if (needed > 0)
2427 memcpy(self->ob_item + start * itemsize,
2428 other->ob_item, needed * itemsize);
2429 return 0;
2430 }
2431 else if (needed == 0) {
2432 /* Delete slice */
2433 size_t cur;
2434 Py_ssize_t i;
Thomas Woutersed03b412007-08-28 21:37:11 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 if (step < 0) {
2437 stop = start + 1;
2438 start = stop + step * (slicelength - 1) - 1;
2439 step = -step;
2440 }
2441 for (cur = start, i = 0; i < slicelength;
2442 cur += step, i++) {
2443 Py_ssize_t lim = step - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 if (cur + step >= (size_t)Py_SIZE(self))
2446 lim = Py_SIZE(self) - cur - 1;
2447 memmove(self->ob_item + (cur - i) * itemsize,
2448 self->ob_item + (cur + 1) * itemsize,
2449 lim * itemsize);
2450 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002451 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 if (cur < (size_t)Py_SIZE(self)) {
2453 memmove(self->ob_item + (cur-slicelength) * itemsize,
2454 self->ob_item + cur * itemsize,
2455 (Py_SIZE(self) - cur) * itemsize);
2456 }
2457 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2458 return -1;
2459 return 0;
2460 }
2461 else {
2462 Py_ssize_t cur, i;
2463
2464 if (needed != slicelength) {
2465 PyErr_Format(PyExc_ValueError,
2466 "attempt to assign array of size %zd "
2467 "to extended slice of size %zd",
2468 needed, slicelength);
2469 return -1;
2470 }
2471 for (cur = start, i = 0; i < slicelength;
2472 cur += step, i++) {
2473 memcpy(self->ob_item + cur * itemsize,
2474 other->ob_item + i * itemsize,
2475 itemsize);
2476 }
2477 return 0;
2478 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002479}
2480
2481static PyMappingMethods array_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 (lenfunc)array_length,
2483 (binaryfunc)array_subscr,
2484 (objobjargproc)array_ass_subscr
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002485};
2486
Guido van Rossumd8faa362007-04-27 19:54:29 +00002487static const void *emptybuf = "";
2488
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002489
2490static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002491array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002492{
Stefan Krah650c1e82015-02-03 21:43:23 +01002493 if (view == NULL) {
2494 PyErr_SetString(PyExc_BufferError,
2495 "array_buffer_getbuf: view==NULL argument is obsolete");
2496 return -1;
2497 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 view->buf = (void *)self->ob_item;
2500 view->obj = (PyObject*)self;
2501 Py_INCREF(self);
2502 if (view->buf == NULL)
2503 view->buf = (void *)emptybuf;
2504 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
2505 view->readonly = 0;
2506 view->ndim = 1;
2507 view->itemsize = self->ob_descr->itemsize;
2508 view->suboffsets = NULL;
2509 view->shape = NULL;
2510 if ((flags & PyBUF_ND)==PyBUF_ND) {
2511 view->shape = &((Py_SIZE(self)));
2512 }
2513 view->strides = NULL;
2514 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2515 view->strides = &(view->itemsize);
2516 view->format = NULL;
2517 view->internal = NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02002518 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02002519 view->format = (char *)self->ob_descr->formats;
Victor Stinner62bb3942012-08-06 00:46:05 +02002520#ifdef Py_UNICODE_WIDE
2521 if (self->ob_descr->typecode == 'u') {
2522 view->format = "w";
2523 }
2524#endif
2525 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 self->ob_exports++;
2528 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002529}
2530
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002531static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002532array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002535}
2536
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002537static PySequenceMethods array_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 (lenfunc)array_length, /*sq_length*/
2539 (binaryfunc)array_concat, /*sq_concat*/
2540 (ssizeargfunc)array_repeat, /*sq_repeat*/
2541 (ssizeargfunc)array_item, /*sq_item*/
2542 0, /*sq_slice*/
2543 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
2544 0, /*sq_ass_slice*/
2545 (objobjproc)array_contains, /*sq_contains*/
2546 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
2547 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002548};
2549
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002550static PyBufferProcs array_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 (getbufferproc)array_buffer_getbuf,
2552 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002553};
2554
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002555static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002556array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 int c;
2559 PyObject *initial = NULL, *it = NULL;
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02002560 const struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
2563 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2566 return NULL;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002567
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08002568 if (initial && c != 'u') {
2569 if (PyUnicode_Check(initial)) {
2570 PyErr_Format(PyExc_TypeError, "cannot use a str to initialize "
2571 "an array with typecode '%c'", c);
2572 return NULL;
2573 }
2574 else if (array_Check(initial) &&
2575 ((arrayobject*)initial)->ob_descr->typecode == 'u') {
2576 PyErr_Format(PyExc_TypeError, "cannot use a unicode array to "
2577 "initialize an array with typecode '%c'", c);
2578 return NULL;
2579 }
2580 }
2581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 if (!(initial == NULL || PyList_Check(initial)
2583 || PyByteArray_Check(initial)
2584 || PyBytes_Check(initial)
2585 || PyTuple_Check(initial)
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002586 || ((c=='u') && PyUnicode_Check(initial))
2587 || (array_Check(initial)
2588 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 it = PyObject_GetIter(initial);
2590 if (it == NULL)
2591 return NULL;
2592 /* We set initial to NULL so that the subsequent code
2593 will create an empty array of the appropriate type
2594 and afterwards we can use array_iter_extend to populate
2595 the array.
2596 */
2597 initial = NULL;
2598 }
2599 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2600 if (descr->typecode == c) {
2601 PyObject *a;
2602 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002603
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002604 if (initial == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 len = 0;
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002606 else if (PyList_Check(initial))
2607 len = PyList_GET_SIZE(initial);
2608 else if (PyTuple_Check(initial) || array_Check(initial))
2609 len = Py_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 else
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002611 len = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +00002612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 a = newarrayobject(type, len, descr);
2614 if (a == NULL)
2615 return NULL;
2616
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002617 if (len > 0 && !array_Check(initial)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 Py_ssize_t i;
2619 for (i = 0; i < len; i++) {
2620 PyObject *v =
2621 PySequence_GetItem(initial, i);
2622 if (v == NULL) {
2623 Py_DECREF(a);
2624 return NULL;
2625 }
2626 if (setarrayitem(a, i, v) != 0) {
2627 Py_DECREF(v);
2628 Py_DECREF(a);
2629 return NULL;
2630 }
2631 Py_DECREF(v);
2632 }
2633 }
2634 else if (initial != NULL && (PyByteArray_Check(initial) ||
2635 PyBytes_Check(initial))) {
Serhiy Storchaka04e6dba2015-04-04 17:06:55 +03002636 PyObject *v;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002637 v = array_array_frombytes((arrayobject *)a,
Serhiy Storchaka04e6dba2015-04-04 17:06:55 +03002638 initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 if (v == NULL) {
2640 Py_DECREF(a);
2641 return NULL;
2642 }
2643 Py_DECREF(v);
2644 }
2645 else if (initial != NULL && PyUnicode_Check(initial)) {
Victor Stinner62bb3942012-08-06 00:46:05 +02002646 Py_UNICODE *ustr;
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002647 Py_ssize_t n;
Victor Stinner62bb3942012-08-06 00:46:05 +02002648
2649 ustr = PyUnicode_AsUnicode(initial);
2650 if (ustr == NULL) {
2651 PyErr_NoMemory();
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002652 Py_DECREF(a);
2653 return NULL;
2654 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002655
2656 n = PyUnicode_GET_DATA_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 if (n > 0) {
2658 arrayobject *self = (arrayobject *)a;
Victor Stinner62bb3942012-08-06 00:46:05 +02002659 char *item = self->ob_item;
2660 item = (char *)PyMem_Realloc(item, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 if (item == NULL) {
2662 PyErr_NoMemory();
2663 Py_DECREF(a);
2664 return NULL;
2665 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002666 self->ob_item = item;
2667 Py_SIZE(self) = n / sizeof(Py_UNICODE);
2668 memcpy(item, ustr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 self->allocated = Py_SIZE(self);
2670 }
2671 }
Benjamin Peterson682124c2014-10-10 20:58:30 -04002672 else if (initial != NULL && array_Check(initial) && len > 0) {
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002673 arrayobject *self = (arrayobject *)a;
2674 arrayobject *other = (arrayobject *)initial;
2675 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2676 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 if (it != NULL) {
2678 if (array_iter_extend((arrayobject *)a, it) == -1) {
2679 Py_DECREF(it);
2680 Py_DECREF(a);
2681 return NULL;
2682 }
2683 Py_DECREF(it);
2684 }
2685 return a;
2686 }
2687 }
2688 PyErr_SetString(PyExc_ValueError,
Meador Inge1c9f0c92011-09-20 19:55:51 -05002689 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002691}
2692
Guido van Rossum778983b1993-02-19 15:55:02 +00002693
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002694PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002695"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002696an array of basic values: characters, integers, floating point\n\
2697numbers. Arrays are sequence types and behave very much like lists,\n\
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08002698except that the type of objects stored in them is constrained.\n");
2699
2700PyDoc_STRVAR(arraytype_doc,
2701"array(typecode [, initializer]) -> array\n\
2702\n\
2703Return a new array whose items are restricted by typecode, and\n\
2704initialized from the optional initializer value, which must be a list,\n\
2705string or iterable over elements of the appropriate type.\n\
2706\n\
2707Arrays represent basic values and behave very much like lists, except\n\
2708the type of objects stored in them is constrained. The type is specified\n\
2709at object creation time by using a type code, which is a single character.\n\
2710The following type codes are defined:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002711\n\
2712 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002713 'b' signed integer 1 \n\
2714 'B' unsigned integer 1 \n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002715 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002716 'h' signed integer 2 \n\
2717 'H' unsigned integer 2 \n\
2718 'i' signed integer 2 \n\
2719 'I' unsigned integer 2 \n\
2720 'l' signed integer 4 \n\
2721 'L' unsigned integer 4 \n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002722 'q' signed integer 8 (see note) \n\
2723 'Q' unsigned integer 8 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002724 'f' floating point 4 \n\
2725 'd' floating point 8 \n\
2726\n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002727NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2728narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2729\n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002730NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
2731C compiler used to build Python supports 'long long', or, on Windows, \n\
2732'__int64'.\n\
2733\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002734Methods:\n\
2735\n\
2736append() -- append a new item to the end of the array\n\
2737buffer_info() -- return information giving the current memory info\n\
2738byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002739count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002740extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002741fromfile() -- read items from a file object\n\
2742fromlist() -- append items from the list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002743frombytes() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002744index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002745insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002746pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002747remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002748reverse() -- reverse the order of the items in the array\n\
2749tofile() -- write all items to a file object\n\
2750tolist() -- return the array converted to an ordinary list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002751tobytes() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002752\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002753Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002754\n\
2755typecode -- the typecode character used to create the array\n\
2756itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002757");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002758
Raymond Hettinger625812f2003-01-07 01:58:52 +00002759static PyObject *array_iter(arrayobject *ao);
2760
Tim Peters0c322792002-07-17 16:49:03 +00002761static PyTypeObject Arraytype = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 PyVarObject_HEAD_INIT(NULL, 0)
2763 "array.array",
2764 sizeof(arrayobject),
2765 0,
2766 (destructor)array_dealloc, /* tp_dealloc */
2767 0, /* tp_print */
2768 0, /* tp_getattr */
2769 0, /* tp_setattr */
2770 0, /* tp_reserved */
2771 (reprfunc)array_repr, /* tp_repr */
2772 0, /* tp_as_number*/
2773 &array_as_sequence, /* tp_as_sequence*/
2774 &array_as_mapping, /* tp_as_mapping*/
2775 0, /* tp_hash */
2776 0, /* tp_call */
2777 0, /* tp_str */
2778 PyObject_GenericGetAttr, /* tp_getattro */
2779 0, /* tp_setattro */
2780 &array_as_buffer, /* tp_as_buffer*/
2781 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2782 arraytype_doc, /* tp_doc */
2783 0, /* tp_traverse */
2784 0, /* tp_clear */
2785 array_richcompare, /* tp_richcompare */
2786 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
2787 (getiterfunc)array_iter, /* tp_iter */
2788 0, /* tp_iternext */
2789 array_methods, /* tp_methods */
2790 0, /* tp_members */
2791 array_getsets, /* tp_getset */
2792 0, /* tp_base */
2793 0, /* tp_dict */
2794 0, /* tp_descr_get */
2795 0, /* tp_descr_set */
2796 0, /* tp_dictoffset */
2797 0, /* tp_init */
2798 PyType_GenericAlloc, /* tp_alloc */
2799 array_new, /* tp_new */
2800 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002801};
2802
Raymond Hettinger625812f2003-01-07 01:58:52 +00002803
2804/*********************** Array Iterator **************************/
2805
Brett Cannon1eb32c22014-10-10 16:26:45 -04002806/*[clinic input]
2807class array.arrayiterator "arrayiterobject *" "&PyArrayIter_Type"
2808[clinic start generated code]*/
2809/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5aefd2d74d8c8e30]*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00002810
2811static PyObject *
2812array_iter(arrayobject *ao)
2813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 arrayiterobject *it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 if (!array_Check(ao)) {
2817 PyErr_BadInternalCall();
2818 return NULL;
2819 }
Raymond Hettinger625812f2003-01-07 01:58:52 +00002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2822 if (it == NULL)
2823 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 Py_INCREF(ao);
2826 it->ao = ao;
2827 it->index = 0;
2828 it->getitem = ao->ob_descr->getitem;
2829 PyObject_GC_Track(it);
2830 return (PyObject *)it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002831}
2832
2833static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002834arrayiter_next(arrayiterobject *it)
2835{
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03002836 arrayobject *ao;
2837
2838 assert(it != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 assert(PyArrayIter_Check(it));
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03002840 ao = it->ao;
2841 if (ao == NULL) {
2842 return NULL;
2843 }
2844 assert(array_Check(ao));
2845 if (it->index < Py_SIZE(ao)) {
2846 return (*it->getitem)(ao, it->index++);
2847 }
2848 it->ao = NULL;
2849 Py_DECREF(ao);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002851}
2852
2853static void
2854arrayiter_dealloc(arrayiterobject *it)
2855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 PyObject_GC_UnTrack(it);
2857 Py_XDECREF(it->ao);
2858 PyObject_GC_Del(it);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002859}
2860
2861static int
2862arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 Py_VISIT(it->ao);
2865 return 0;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002866}
2867
Brett Cannon1eb32c22014-10-10 16:26:45 -04002868/*[clinic input]
2869array.arrayiterator.__reduce__
2870
2871Return state information for pickling.
2872[clinic start generated code]*/
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002873
2874static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04002875array_arrayiterator___reduce___impl(arrayiterobject *self)
2876/*[clinic end generated code: output=7898a52e8e66e016 input=a062ea1e9951417a]*/
2877{
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03002878 PyObject *func = _PyObject_GetBuiltin("iter");
2879 if (self->ao == NULL) {
2880 return Py_BuildValue("N(())", func);
2881 }
2882 return Py_BuildValue("N(O)n", func, self->ao, self->index);
Brett Cannon1eb32c22014-10-10 16:26:45 -04002883}
2884
2885/*[clinic input]
2886array.arrayiterator.__setstate__
2887
2888 state: object
2889 /
2890
2891Set state information for unpickling.
2892[clinic start generated code]*/
2893
2894static PyObject *
2895array_arrayiterator___setstate__(arrayiterobject *self, PyObject *state)
2896/*[clinic end generated code: output=397da9904e443cbe input=f47d5ceda19e787b]*/
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002897{
2898 Py_ssize_t index = PyLong_AsSsize_t(state);
2899 if (index == -1 && PyErr_Occurred())
2900 return NULL;
2901 if (index < 0)
2902 index = 0;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002903 else if (index > Py_SIZE(self->ao))
2904 index = Py_SIZE(self->ao); /* iterator exhausted */
2905 self->index = index;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002906 Py_RETURN_NONE;
2907}
2908
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002909static PyMethodDef arrayiter_methods[] = {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002910 ARRAY_ARRAYITERATOR___REDUCE___METHODDEF
2911 ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002912 {NULL, NULL} /* sentinel */
2913};
2914
Raymond Hettinger625812f2003-01-07 01:58:52 +00002915static PyTypeObject PyArrayIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 PyVarObject_HEAD_INIT(NULL, 0)
2917 "arrayiterator", /* tp_name */
2918 sizeof(arrayiterobject), /* tp_basicsize */
2919 0, /* tp_itemsize */
2920 /* methods */
2921 (destructor)arrayiter_dealloc, /* tp_dealloc */
2922 0, /* tp_print */
2923 0, /* tp_getattr */
2924 0, /* tp_setattr */
2925 0, /* tp_reserved */
2926 0, /* tp_repr */
2927 0, /* tp_as_number */
2928 0, /* tp_as_sequence */
2929 0, /* tp_as_mapping */
2930 0, /* tp_hash */
2931 0, /* tp_call */
2932 0, /* tp_str */
2933 PyObject_GenericGetAttr, /* tp_getattro */
2934 0, /* tp_setattro */
2935 0, /* tp_as_buffer */
2936 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2937 0, /* tp_doc */
2938 (traverseproc)arrayiter_traverse, /* tp_traverse */
2939 0, /* tp_clear */
2940 0, /* tp_richcompare */
2941 0, /* tp_weaklistoffset */
2942 PyObject_SelfIter, /* tp_iter */
2943 (iternextfunc)arrayiter_next, /* tp_iternext */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002944 arrayiter_methods, /* tp_methods */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002945};
2946
2947
2948/*********************** Install Module **************************/
2949
Martin v. Löwis99866332002-03-01 10:27:01 +00002950/* No functions in array module. */
2951static PyMethodDef a_methods[] = {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002952 ARRAY__ARRAY_RECONSTRUCTOR_METHODDEF
Martin v. Löwis99866332002-03-01 10:27:01 +00002953 {NULL, NULL, 0, NULL} /* Sentinel */
2954};
2955
Nick Coghland5cacbb2015-05-23 22:24:10 +10002956static int
2957array_modexec(PyObject *m)
Guido van Rossum778983b1993-02-19 15:55:02 +00002958{
Georg Brandl4cb0de22011-09-28 21:49:49 +02002959 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 PyObject *typecodes;
2961 Py_ssize_t size = 0;
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02002962 const struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 if (PyType_Ready(&Arraytype) < 0)
Nick Coghland5cacbb2015-05-23 22:24:10 +10002965 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002966 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Fred Drakef4e34842002-04-01 03:45:06 +00002967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 Py_INCREF((PyObject *)&Arraytype);
2969 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2970 Py_INCREF((PyObject *)&Arraytype);
2971 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2974 size++;
2975 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002976
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002977 p = buffer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2979 *p++ = (char)descr->typecode;
2980 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002981 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002983 PyModule_AddObject(m, "typecodes", typecodes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984
2985 if (PyErr_Occurred()) {
2986 Py_DECREF(m);
2987 m = NULL;
2988 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10002989 return 0;
2990}
2991
2992static PyModuleDef_Slot arrayslots[] = {
2993 {Py_mod_exec, array_modexec},
2994 {0, NULL}
2995};
2996
2997
2998static struct PyModuleDef arraymodule = {
2999 PyModuleDef_HEAD_INIT,
3000 "array",
3001 module_doc,
3002 0,
3003 a_methods,
3004 arrayslots,
3005 NULL,
3006 NULL,
3007 NULL
3008};
3009
3010
3011PyMODINIT_FUNC
3012PyInit_array(void)
3013{
3014 return PyModuleDef_Init(&arraymodule);
Guido van Rossum778983b1993-02-19 15:55:02 +00003015}