1 /* 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
6 #define PY_SSIZE_T_CLEAN
7 #include "Python.h"
8 #include "structmember.h"
9
10 #ifdef STDC_HEADERS
11 #include <stddef.h>
12 #else /* !STDC_HEADERS */
13 #ifdef HAVE_SYS_TYPES_H
14 #include <sys/types.h> /* For size_t */
15 #endif /* HAVE_SYS_TYPES_H */
16 #endif /* !STDC_HEADERS */
17
18 /*[clinic input]
19 module array
20 [clinic start generated code]*/
21 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=7d1b8d7f5958fd83]*/
22
23 struct arrayobject; /* Forward */
24
25 /* 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 */
29 struct arraydescr {
30 char typecode;
31 int itemsize;
32 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
33 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
34 int (*compareitems)(const void *, const void *, Py_ssize_t);
35 const char *formats;
36 int is_integer_type;
37 int is_signed;
38 };
39
40 typedef struct arrayobject {
41 PyObject_VAR_HEAD
42 char *ob_item;
43 Py_ssize_t allocated;
44 const struct arraydescr *ob_descr;
45 PyObject *weakreflist; /* List of weak references */
46 int ob_exports; /* Number of exported buffers */
47 } arrayobject;
48
49 static PyTypeObject Arraytype;
50
51 typedef struct {
52 PyObject_HEAD
53 Py_ssize_t index;
54 arrayobject *ao;
55 PyObject* (*getitem)(struct arrayobject *, Py_ssize_t);
56 } arrayiterobject;
57
58 static PyTypeObject PyArrayIter_Type;
59
60 #define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
61
62 enum machine_format_code {
63 UNKNOWN_FORMAT = -1,
64 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
65 * array type code cannot be interpreted. When this occurs, a list of
66 * Python objects is used to represent the content of the array
67 * instead of using the memory content of the array directly. In that
68 * case, the array_reconstructor mechanism is bypassed completely, and
69 * the standard array constructor is used instead.
70 *
71 * This is will most likely occur when the machine doesn't use IEEE
72 * floating-point numbers.
73 */
74
75 UNSIGNED_INT8 = 0,
76 SIGNED_INT8 = 1,
77 UNSIGNED_INT16_LE = 2,
78 UNSIGNED_INT16_BE = 3,
79 SIGNED_INT16_LE = 4,
80 SIGNED_INT16_BE = 5,
81 UNSIGNED_INT32_LE = 6,
82 UNSIGNED_INT32_BE = 7,
83 SIGNED_INT32_LE = 8,
84 SIGNED_INT32_BE = 9,
85 UNSIGNED_INT64_LE = 10,
86 UNSIGNED_INT64_BE = 11,
87 SIGNED_INT64_LE = 12,
88 SIGNED_INT64_BE = 13,
89 IEEE_754_FLOAT_LE = 14,
90 IEEE_754_FLOAT_BE = 15,
91 IEEE_754_DOUBLE_LE = 16,
92 IEEE_754_DOUBLE_BE = 17,
93 UTF16_LE = 18,
94 UTF16_BE = 19,
95 UTF32_LE = 20,
96 UTF32_BE = 21
97 };
98 #define MACHINE_FORMAT_CODE_MIN 0
99 #define MACHINE_FORMAT_CODE_MAX 21
100
101
102 /*
103 * Must come after arrayobject, arrayiterobject,
104 * and enum machine_code_type definitions.
105 */
106 #include "clinic/arraymodule.c.h"
107
108 #define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
109 #define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
110
111 static int
array_resize(arrayobject * self,Py_ssize_t newsize)112 array_resize(arrayobject *self, Py_ssize_t newsize)
113 {
114 char *items;
115 size_t _new_size;
116
117 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
118 PyErr_SetString(PyExc_BufferError,
119 "cannot resize an array that is exporting buffers");
120 return -1;
121 }
122
123 /* Bypass realloc() when a previous overallocation is large enough
124 to accommodate the newsize. If the newsize is 16 smaller than the
125 current size, then proceed with the realloc() to shrink the array.
126 */
127
128 if (self->allocated >= newsize &&
129 Py_SIZE(self) < newsize + 16 &&
130 self->ob_item != NULL) {
131 Py_SIZE(self) = newsize;
132 return 0;
133 }
134
135 if (newsize == 0) {
136 PyMem_FREE(self->ob_item);
137 self->ob_item = NULL;
138 Py_SIZE(self) = 0;
139 self->allocated = 0;
140 return 0;
141 }
142
143 /* This over-allocates proportional to the array size, making room
144 * for additional growth. The over-allocation is mild, but is
145 * enough to give linear-time amortized behavior over a long
146 * sequence of appends() in the presence of a poorly-performing
147 * system realloc().
148 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
149 * Note, the pattern starts out the same as for lists but then
150 * grows at a smaller rate so that larger arrays only overallocate
151 * by about 1/16th -- this is done because arrays are presumed to be more
152 * memory critical.
153 */
154
155 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
156 items = self->ob_item;
157 /* XXX The following multiplication and division does not optimize away
158 like it does for lists since the size is not known at compile time */
159 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
160 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
161 else
162 items = NULL;
163 if (items == NULL) {
164 PyErr_NoMemory();
165 return -1;
166 }
167 self->ob_item = items;
168 Py_SIZE(self) = newsize;
169 self->allocated = _new_size;
170 return 0;
171 }
172
173 /****************************************************************************
174 Get and Set functions for each type.
175 A Get function takes an arrayobject* and an integer index, returning the
176 array value at that index wrapped in an appropriate PyObject*.
177 A Set function takes an arrayobject, integer index, and PyObject*; sets
178 the array value at that index to the raw C data extracted from the PyObject*,
179 and returns 0 if successful, else nonzero on failure (PyObject* not of an
180 appropriate type or value).
181 Note that the basic Get and Set functions do NOT check that the index is
182 in bounds; that's the responsibility of the caller.
183 ****************************************************************************/
184
185 static PyObject *
b_getitem(arrayobject * ap,Py_ssize_t i)186 b_getitem(arrayobject *ap, Py_ssize_t i)
187 {
188 long x = ((char *)ap->ob_item)[i];
189 if (x >= 128)
190 x -= 256;
191 return PyLong_FromLong(x);
192 }
193
194 static int
b_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)195 b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
196 {
197 short x;
198 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
199 must use the next size up that is signed ('h') and manually do
200 the overflow checking */
201 if (!PyArg_Parse(v, "h;array item must be integer", &x))
202 return -1;
203 else if (x < -128) {
204 PyErr_SetString(PyExc_OverflowError,
205 "signed char is less than minimum");
206 return -1;
207 }
208 else if (x > 127) {
209 PyErr_SetString(PyExc_OverflowError,
210 "signed char is greater than maximum");
211 return -1;
212 }
213 if (i >= 0)
214 ((char *)ap->ob_item)[i] = (char)x;
215 return 0;
216 }
217
218 static PyObject *
BB_getitem(arrayobject * ap,Py_ssize_t i)219 BB_getitem(arrayobject *ap, Py_ssize_t i)
220 {
221 long x = ((unsigned char *)ap->ob_item)[i];
222 return PyLong_FromLong(x);
223 }
224
225 static int
BB_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)226 BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
227 {
228 unsigned char x;
229 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
230 if (!PyArg_Parse(v, "b;array item must be integer", &x))
231 return -1;
232 if (i >= 0)
233 ((char *)ap->ob_item)[i] = x;
234 return 0;
235 }
236
237 static PyObject *
u_getitem(arrayobject * ap,Py_ssize_t i)238 u_getitem(arrayobject *ap, Py_ssize_t i)
239 {
240 return PyUnicode_FromOrdinal(((Py_UNICODE *) ap->ob_item)[i]);
241 }
242
243 static int
u_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)244 u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
245 {
246 Py_UNICODE *p;
247 Py_ssize_t len;
248
249 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
250 return -1;
251 if (len != 1) {
252 PyErr_SetString(PyExc_TypeError,
253 "array item must be unicode character");
254 return -1;
255 }
256 if (i >= 0)
257 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
258 return 0;
259 }
260
261
262 static PyObject *
h_getitem(arrayobject * ap,Py_ssize_t i)263 h_getitem(arrayobject *ap, Py_ssize_t i)
264 {
265 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
266 }
267
268
269 static int
h_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)270 h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
271 {
272 short x;
273 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
274 if (!PyArg_Parse(v, "h;array item must be integer", &x))
275 return -1;
276 if (i >= 0)
277 ((short *)ap->ob_item)[i] = x;
278 return 0;
279 }
280
281 static PyObject *
HH_getitem(arrayobject * ap,Py_ssize_t i)282 HH_getitem(arrayobject *ap, Py_ssize_t i)
283 {
284 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
285 }
286
287 static int
HH_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)288 HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
289 {
290 int x;
291 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
292 must use the next size up and manually do the overflow checking */
293 if (!PyArg_Parse(v, "i;array item must be integer", &x))
294 return -1;
295 else if (x < 0) {
296 PyErr_SetString(PyExc_OverflowError,
297 "unsigned short is less than minimum");
298 return -1;
299 }
300 else if (x > USHRT_MAX) {
301 PyErr_SetString(PyExc_OverflowError,
302 "unsigned short is greater than maximum");
303 return -1;
304 }
305 if (i >= 0)
306 ((short *)ap->ob_item)[i] = (short)x;
307 return 0;
308 }
309
310 static PyObject *
i_getitem(arrayobject * ap,Py_ssize_t i)311 i_getitem(arrayobject *ap, Py_ssize_t i)
312 {
313 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
314 }
315
316 static int
i_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)317 i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
318 {
319 int x;
320 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
321 if (!PyArg_Parse(v, "i;array item must be integer", &x))
322 return -1;
323 if (i >= 0)
324 ((int *)ap->ob_item)[i] = x;
325 return 0;
326 }
327
328 static PyObject *
II_getitem(arrayobject * ap,Py_ssize_t i)329 II_getitem(arrayobject *ap, Py_ssize_t i)
330 {
331 return PyLong_FromUnsignedLong(
332 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
333 }
334
335 static PyObject *
get_int_unless_float(PyObject * v)336 get_int_unless_float(PyObject *v)
337 {
338 if (PyFloat_Check(v)) {
339 PyErr_SetString(PyExc_TypeError,
340 "array item must be integer");
341 return NULL;
342 }
343 return _PyLong_FromNbIndexOrNbInt(v);
344 }
345
346 static int
II_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)347 II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
348 {
349 unsigned long x;
350 int do_decref = 0; /* if nb_int was called */
351
352 if (!PyLong_Check(v)) {
353 v = get_int_unless_float(v);
354 if (NULL == v) {
355 return -1;
356 }
357 do_decref = 1;
358 }
359 x = PyLong_AsUnsignedLong(v);
360 if (x == (unsigned long)-1 && PyErr_Occurred()) {
361 if (do_decref) {
362 Py_DECREF(v);
363 }
364 return -1;
365 }
366 if (x > UINT_MAX) {
367 PyErr_SetString(PyExc_OverflowError,
368 "unsigned int is greater than maximum");
369 if (do_decref) {
370 Py_DECREF(v);
371 }
372 return -1;
373 }
374 if (i >= 0)
375 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
376
377 if (do_decref) {
378 Py_DECREF(v);
379 }
380 return 0;
381 }
382
383 static PyObject *
l_getitem(arrayobject * ap,Py_ssize_t i)384 l_getitem(arrayobject *ap, Py_ssize_t i)
385 {
386 return PyLong_FromLong(((long *)ap->ob_item)[i]);
387 }
388
389 static int
l_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)390 l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
391 {
392 long x;
393 if (!PyArg_Parse(v, "l;array item must be integer", &x))
394 return -1;
395 if (i >= 0)
396 ((long *)ap->ob_item)[i] = x;
397 return 0;
398 }
399
400 static PyObject *
LL_getitem(arrayobject * ap,Py_ssize_t i)401 LL_getitem(arrayobject *ap, Py_ssize_t i)
402 {
403 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
404 }
405
406 static int
LL_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)407 LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
408 {
409 unsigned long x;
410 int do_decref = 0; /* if nb_int was called */
411
412 if (!PyLong_Check(v)) {
413 v = get_int_unless_float(v);
414 if (NULL == v) {
415 return -1;
416 }
417 do_decref = 1;
418 }
419 x = PyLong_AsUnsignedLong(v);
420 if (x == (unsigned long)-1 && PyErr_Occurred()) {
421 if (do_decref) {
422 Py_DECREF(v);
423 }
424 return -1;
425 }
426 if (i >= 0)
427 ((unsigned long *)ap->ob_item)[i] = x;
428
429 if (do_decref) {
430 Py_DECREF(v);
431 }
432 return 0;
433 }
434
435 static PyObject *
q_getitem(arrayobject * ap,Py_ssize_t i)436 q_getitem(arrayobject *ap, Py_ssize_t i)
437 {
438 return PyLong_FromLongLong(((long long *)ap->ob_item)[i]);
439 }
440
441 static int
q_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)442 q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
443 {
444 long long x;
445 if (!PyArg_Parse(v, "L;array item must be integer", &x))
446 return -1;
447 if (i >= 0)
448 ((long long *)ap->ob_item)[i] = x;
449 return 0;
450 }
451
452 static PyObject *
QQ_getitem(arrayobject * ap,Py_ssize_t i)453 QQ_getitem(arrayobject *ap, Py_ssize_t i)
454 {
455 return PyLong_FromUnsignedLongLong(
456 ((unsigned long long *)ap->ob_item)[i]);
457 }
458
459 static int
QQ_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)460 QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
461 {
462 unsigned long long x;
463 int do_decref = 0; /* if nb_int was called */
464
465 if (!PyLong_Check(v)) {
466 v = get_int_unless_float(v);
467 if (NULL == v) {
468 return -1;
469 }
470 do_decref = 1;
471 }
472 x = PyLong_AsUnsignedLongLong(v);
473 if (x == (unsigned long long)-1 && PyErr_Occurred()) {
474 if (do_decref) {
475 Py_DECREF(v);
476 }
477 return -1;
478 }
479 if (i >= 0)
480 ((unsigned long long *)ap->ob_item)[i] = x;
481
482 if (do_decref) {
483 Py_DECREF(v);
484 }
485 return 0;
486 }
487
488 static PyObject *
f_getitem(arrayobject * ap,Py_ssize_t i)489 f_getitem(arrayobject *ap, Py_ssize_t i)
490 {
491 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
492 }
493
494 static int
f_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)495 f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
496 {
497 float x;
498 if (!PyArg_Parse(v, "f;array item must be float", &x))
499 return -1;
500 if (i >= 0)
501 ((float *)ap->ob_item)[i] = x;
502 return 0;
503 }
504
505 static PyObject *
d_getitem(arrayobject * ap,Py_ssize_t i)506 d_getitem(arrayobject *ap, Py_ssize_t i)
507 {
508 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
509 }
510
511 static int
d_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)512 d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
513 {
514 double x;
515 if (!PyArg_Parse(v, "d;array item must be float", &x))
516 return -1;
517 if (i >= 0)
518 ((double *)ap->ob_item)[i] = x;
519 return 0;
520 }
521
522 #define DEFINE_COMPAREITEMS(code, type) \
523 static int \
524 code##_compareitems(const void *lhs, const void *rhs, Py_ssize_t length) \
525 { \
526 const type *a = lhs, *b = rhs; \
527 for (Py_ssize_t i = 0; i < length; ++i) \
528 if (a[i] != b[i]) \
529 return a[i] < b[i] ? -1 : 1; \
530 return 0; \
531 }
532
533 DEFINE_COMPAREITEMS(b, signed char)
534 DEFINE_COMPAREITEMS(BB, unsigned char)
535 DEFINE_COMPAREITEMS(u, Py_UNICODE)
536 DEFINE_COMPAREITEMS(h, short)
537 DEFINE_COMPAREITEMS(HH, unsigned short)
538 DEFINE_COMPAREITEMS(i, int)
539 DEFINE_COMPAREITEMS(II, unsigned int)
540 DEFINE_COMPAREITEMS(l, long)
541 DEFINE_COMPAREITEMS(LL, unsigned long)
542 DEFINE_COMPAREITEMS(q, long long)
543 DEFINE_COMPAREITEMS(QQ, unsigned long long)
544
545 /* Description of types.
546 *
547 * Don't forget to update typecode_to_mformat_code() if you add a new
548 * typecode.
549 */
550 static const struct arraydescr descriptors[] = {
551 {'b', 1, b_getitem, b_setitem, b_compareitems, "b", 1, 1},
552 {'B', 1, BB_getitem, BB_setitem, BB_compareitems, "B", 1, 0},
553 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, u_compareitems, "u", 0, 0},
554 {'h', sizeof(short), h_getitem, h_setitem, h_compareitems, "h", 1, 1},
555 {'H', sizeof(short), HH_getitem, HH_setitem, HH_compareitems, "H", 1, 0},
556 {'i', sizeof(int), i_getitem, i_setitem, i_compareitems, "i", 1, 1},
557 {'I', sizeof(int), II_getitem, II_setitem, II_compareitems, "I", 1, 0},
558 {'l', sizeof(long), l_getitem, l_setitem, l_compareitems, "l", 1, 1},
559 {'L', sizeof(long), LL_getitem, LL_setitem, LL_compareitems, "L", 1, 0},
560 {'q', sizeof(long long), q_getitem, q_setitem, q_compareitems, "q", 1, 1},
561 {'Q', sizeof(long long), QQ_getitem, QQ_setitem, QQ_compareitems, "Q", 1, 0},
562 {'f', sizeof(float), f_getitem, f_setitem, NULL, "f", 0, 0},
563 {'d', sizeof(double), d_getitem, d_setitem, NULL, "d", 0, 0},
564 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
565 };
566
567 /****************************************************************************
568 Implementations of array object methods.
569 ****************************************************************************/
570 /*[clinic input]
571 class array.array "arrayobject *" "&Arraytype"
572 [clinic start generated code]*/
573 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ad43d37e942a8854]*/
574
575 static PyObject *
newarrayobject(PyTypeObject * type,Py_ssize_t size,const struct arraydescr * descr)576 newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *descr)
577 {
578 arrayobject *op;
579 size_t nbytes;
580
581 if (size < 0) {
582 PyErr_BadInternalCall();
583 return NULL;
584 }
585
586 /* Check for overflow */
587 if (size > PY_SSIZE_T_MAX / descr->itemsize) {
588 return PyErr_NoMemory();
589 }
590 nbytes = size * descr->itemsize;
591 op = (arrayobject *) type->tp_alloc(type, 0);
592 if (op == NULL) {
593 return NULL;
594 }
595 op->ob_descr = descr;
596 op->allocated = size;
597 op->weakreflist = NULL;
598 Py_SIZE(op) = size;
599 if (size <= 0) {
600 op->ob_item = NULL;
601 }
602 else {
603 op->ob_item = PyMem_NEW(char, nbytes);
604 if (op->ob_item == NULL) {
605 Py_DECREF(op);
606 return PyErr_NoMemory();
607 }
608 }
609 op->ob_exports = 0;
610 return (PyObject *) op;
611 }
612
613 static PyObject *
getarrayitem(PyObject * op,Py_ssize_t i)614 getarrayitem(PyObject *op, Py_ssize_t i)
615 {
616 arrayobject *ap;
617 assert(array_Check(op));
618 ap = (arrayobject *)op;
619 assert(i>=0 && i<Py_SIZE(ap));
620 return (*ap->ob_descr->getitem)(ap, i);
621 }
622
623 static int
ins1(arrayobject * self,Py_ssize_t where,PyObject * v)624 ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
625 {
626 char *items;
627 Py_ssize_t n = Py_SIZE(self);
628 if (v == NULL) {
629 PyErr_BadInternalCall();
630 return -1;
631 }
632 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
633 return -1;
634
635 if (array_resize(self, n+1) == -1)
636 return -1;
637 items = self->ob_item;
638 if (where < 0) {
639 where += n;
640 if (where < 0)
641 where = 0;
642 }
643 if (where > n)
644 where = n;
645 /* appends don't need to call memmove() */
646 if (where != n)
647 memmove(items + (where+1)*self->ob_descr->itemsize,
648 items + where*self->ob_descr->itemsize,
649 (n-where)*self->ob_descr->itemsize);
650 return (*self->ob_descr->setitem)(self, where, v);
651 }
652
653 /* Methods */
654
655 static void
array_dealloc(arrayobject * op)656 array_dealloc(arrayobject *op)
657 {
658 if (op->weakreflist != NULL)
659 PyObject_ClearWeakRefs((PyObject *) op);
660 if (op->ob_item != NULL)
661 PyMem_DEL(op->ob_item);
662 Py_TYPE(op)->tp_free((PyObject *)op);
663 }
664
665 static PyObject *
array_richcompare(PyObject * v,PyObject * w,int op)666 array_richcompare(PyObject *v, PyObject *w, int op)
667 {
668 arrayobject *va, *wa;
669 PyObject *vi = NULL;
670 PyObject *wi = NULL;
671 Py_ssize_t i, k;
672 PyObject *res;
673
674 if (!array_Check(v) || !array_Check(w))
675 Py_RETURN_NOTIMPLEMENTED;
676
677 va = (arrayobject *)v;
678 wa = (arrayobject *)w;
679
680 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
681 /* Shortcut: if the lengths differ, the arrays differ */
682 if (op == Py_EQ)
683 res = Py_False;
684 else
685 res = Py_True;
686 Py_INCREF(res);
687 return res;
688 }
689
690 if (va->ob_descr == wa->ob_descr && va->ob_descr->compareitems != NULL) {
691 /* Fast path:
692 arrays with same types can have their buffers compared directly */
693 Py_ssize_t common_length = Py_MIN(Py_SIZE(va), Py_SIZE(wa));
694 int result = va->ob_descr->compareitems(va->ob_item, wa->ob_item,
695 common_length);
696 if (result == 0)
697 goto compare_sizes;
698
699 int cmp;
700 switch (op) {
701 case Py_LT: cmp = result < 0; break;
702 case Py_LE: cmp = result <= 0; break;
703 case Py_EQ: cmp = result == 0; break;
704 case Py_NE: cmp = result != 0; break;
705 case Py_GT: cmp = result > 0; break;
706 case Py_GE: cmp = result >= 0; break;
707 default: return NULL; /* cannot happen */
708 }
709 PyObject *res = cmp ? Py_True : Py_False;
710 Py_INCREF(res);
711 return res;
712 }
713
714
715 /* Search for the first index where items are different */
716 k = 1;
717 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
718 vi = getarrayitem(v, i);
719 wi = getarrayitem(w, i);
720 if (vi == NULL || wi == NULL) {
721 Py_XDECREF(vi);
722 Py_XDECREF(wi);
723 return NULL;
724 }
725 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
726 if (k == 0)
727 break; /* Keeping vi and wi alive! */
728 Py_DECREF(vi);
729 Py_DECREF(wi);
730 if (k < 0)
731 return NULL;
732 }
733
734 if (k) {
735 /* No more items to compare -- compare sizes */
736 compare_sizes: ;
737 Py_ssize_t vs = Py_SIZE(va);
738 Py_ssize_t ws = Py_SIZE(wa);
739 int cmp;
740 switch (op) {
741 case Py_LT: cmp = vs < ws; break;
742 case Py_LE: cmp = vs <= ws; break;
743 /* If the lengths were not equal,
744 the earlier fast-path check would have caught that. */
745 case Py_EQ: assert(vs == ws); cmp = 1; break;
746 case Py_NE: assert(vs == ws); cmp = 0; break;
747 case Py_GT: cmp = vs > ws; break;
748 case Py_GE: cmp = vs >= ws; break;
749 default: return NULL; /* cannot happen */
750 }
751 if (cmp)
752 res = Py_True;
753 else
754 res = Py_False;
755 Py_INCREF(res);
756 return res;
757 }
758
759 /* We have an item that differs. First, shortcuts for EQ/NE */
760 if (op == Py_EQ) {
761 Py_INCREF(Py_False);
762 res = Py_False;
763 }
764 else if (op == Py_NE) {
765 Py_INCREF(Py_True);
766 res = Py_True;
767 }
768 else {
769 /* Compare the final item again using the proper operator */
770 res = PyObject_RichCompare(vi, wi, op);
771 }
772 Py_DECREF(vi);
773 Py_DECREF(wi);
774 return res;
775 }
776
777 static Py_ssize_t
array_length(arrayobject * a)778 array_length(arrayobject *a)
779 {
780 return Py_SIZE(a);
781 }
782
783 static PyObject *
array_item(arrayobject * a,Py_ssize_t i)784 array_item(arrayobject *a, Py_ssize_t i)
785 {
786 if (i < 0 || i >= Py_SIZE(a)) {
787 PyErr_SetString(PyExc_IndexError, "array index out of range");
788 return NULL;
789 }
790 return getarrayitem((PyObject *)a, i);
791 }
792
793 static PyObject *
array_slice(arrayobject * a,Py_ssize_t ilow,Py_ssize_t ihigh)794 array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
795 {
796 arrayobject *np;
797 if (ilow < 0)
798 ilow = 0;
799 else if (ilow > Py_SIZE(a))
800 ilow = Py_SIZE(a);
801 if (ihigh < 0)
802 ihigh = 0;
803 if (ihigh < ilow)
804 ihigh = ilow;
805 else if (ihigh > Py_SIZE(a))
806 ihigh = Py_SIZE(a);
807 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
808 if (np == NULL)
809 return NULL;
810 if (ihigh > ilow) {
811 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
812 (ihigh-ilow) * a->ob_descr->itemsize);
813 }
814 return (PyObject *)np;
815 }
816
817
818 /*[clinic input]
819 array.array.__copy__
820
821 Return a copy of the array.
822 [clinic start generated code]*/
823
824 static PyObject *
array_array___copy___impl(arrayobject * self)825 array_array___copy___impl(arrayobject *self)
826 /*[clinic end generated code: output=dec7c3f925d9619e input=ad1ee5b086965f09]*/
827 {
828 return array_slice(self, 0, Py_SIZE(self));
829 }
830
831 /*[clinic input]
832 array.array.__deepcopy__
833
834 unused: object
835 /
836
837 Return a copy of the array.
838 [clinic start generated code]*/
839
840 static PyObject *
array_array___deepcopy__(arrayobject * self,PyObject * unused)841 array_array___deepcopy__(arrayobject *self, PyObject *unused)
842 /*[clinic end generated code: output=1ec748d8e14a9faa input=2405ecb4933748c4]*/
843 {
844 return array_array___copy___impl(self);
845 }
846
847 static PyObject *
array_concat(arrayobject * a,PyObject * bb)848 array_concat(arrayobject *a, PyObject *bb)
849 {
850 Py_ssize_t size;
851 arrayobject *np;
852 if (!array_Check(bb)) {
853 PyErr_Format(PyExc_TypeError,
854 "can only append array (not \"%.200s\") to array",
855 Py_TYPE(bb)->tp_name);
856 return NULL;
857 }
858 #define b ((arrayobject *)bb)
859 if (a->ob_descr != b->ob_descr) {
860 PyErr_BadArgument();
861 return NULL;
862 }
863 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
864 return PyErr_NoMemory();
865 }
866 size = Py_SIZE(a) + Py_SIZE(b);
867 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
868 if (np == NULL) {
869 return NULL;
870 }
871 if (Py_SIZE(a) > 0) {
872 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
873 }
874 if (Py_SIZE(b) > 0) {
875 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
876 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
877 }
878 return (PyObject *)np;
879 #undef b
880 }
881
882 static PyObject *
array_repeat(arrayobject * a,Py_ssize_t n)883 array_repeat(arrayobject *a, Py_ssize_t n)
884 {
885 Py_ssize_t size;
886 arrayobject *np;
887 Py_ssize_t oldbytes, newbytes;
888 if (n < 0)
889 n = 0;
890 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
891 return PyErr_NoMemory();
892 }
893 size = Py_SIZE(a) * n;
894 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
895 if (np == NULL)
896 return NULL;
897 if (size == 0)
898 return (PyObject *)np;
899 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
900 newbytes = oldbytes * n;
901 /* this follows the code in unicode_repeat */
902 if (oldbytes == 1) {
903 memset(np->ob_item, a->ob_item[0], newbytes);
904 } else {
905 Py_ssize_t done = oldbytes;
906 memcpy(np->ob_item, a->ob_item, oldbytes);
907 while (done < newbytes) {
908 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
909 memcpy(np->ob_item+done, np->ob_item, ncopy);
910 done += ncopy;
911 }
912 }
913 return (PyObject *)np;
914 }
915
916 static int
array_del_slice(arrayobject * a,Py_ssize_t ilow,Py_ssize_t ihigh)917 array_del_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
918 {
919 char *item;
920 Py_ssize_t d; /* Change in size */
921 if (ilow < 0)
922 ilow = 0;
923 else if (ilow > Py_SIZE(a))
924 ilow = Py_SIZE(a);
925 if (ihigh < 0)
926 ihigh = 0;
927 if (ihigh < ilow)
928 ihigh = ilow;
929 else if (ihigh > Py_SIZE(a))
930 ihigh = Py_SIZE(a);
931 item = a->ob_item;
932 d = ihigh-ilow;
933 /* Issue #4509: If the array has exported buffers and the slice
934 assignment would change the size of the array, fail early to make
935 sure we don't modify it. */
936 if (d != 0 && a->ob_exports > 0) {
937 PyErr_SetString(PyExc_BufferError,
938 "cannot resize an array that is exporting buffers");
939 return -1;
940 }
941 if (d > 0) { /* Delete d items */
942 memmove(item + (ihigh-d)*a->ob_descr->itemsize,
943 item + ihigh*a->ob_descr->itemsize,
944 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
945 if (array_resize(a, Py_SIZE(a) - d) == -1)
946 return -1;
947 }
948 return 0;
949 }
950
951 static int
array_ass_item(arrayobject * a,Py_ssize_t i,PyObject * v)952 array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
953 {
954 if (i < 0 || i >= Py_SIZE(a)) {
955 PyErr_SetString(PyExc_IndexError,
956 "array assignment index out of range");
957 return -1;
958 }
959 if (v == NULL)
960 return array_del_slice(a, i, i+1);
961 return (*a->ob_descr->setitem)(a, i, v);
962 }
963
964 static int
setarrayitem(PyObject * a,Py_ssize_t i,PyObject * v)965 setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
966 {
967 assert(array_Check(a));
968 return array_ass_item((arrayobject *)a, i, v);
969 }
970
971 static int
array_iter_extend(arrayobject * self,PyObject * bb)972 array_iter_extend(arrayobject *self, PyObject *bb)
973 {
974 PyObject *it, *v;
975
976 it = PyObject_GetIter(bb);
977 if (it == NULL)
978 return -1;
979
980 while ((v = PyIter_Next(it)) != NULL) {
981 if (ins1(self, Py_SIZE(self), v) != 0) {
982 Py_DECREF(v);
983 Py_DECREF(it);
984 return -1;
985 }
986 Py_DECREF(v);
987 }
988 Py_DECREF(it);
989 if (PyErr_Occurred())
990 return -1;
991 return 0;
992 }
993
994 static int
array_do_extend(arrayobject * self,PyObject * bb)995 array_do_extend(arrayobject *self, PyObject *bb)
996 {
997 Py_ssize_t size, oldsize, bbsize;
998
999 if (!array_Check(bb))
1000 return array_iter_extend(self, bb);
1001 #define b ((arrayobject *)bb)
1002 if (self->ob_descr != b->ob_descr) {
1003 PyErr_SetString(PyExc_TypeError,
1004 "can only extend with array of same kind");
1005 return -1;
1006 }
1007 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
1008 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
1009 PyErr_NoMemory();
1010 return -1;
1011 }
1012 oldsize = Py_SIZE(self);
1013 /* Get the size of bb before resizing the array since bb could be self. */
1014 bbsize = Py_SIZE(bb);
1015 size = oldsize + Py_SIZE(b);
1016 if (array_resize(self, size) == -1)
1017 return -1;
1018 if (bbsize > 0) {
1019 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
1020 b->ob_item, bbsize * b->ob_descr->itemsize);
1021 }
1022
1023 return 0;
1024 #undef b
1025 }
1026
1027 static PyObject *
array_inplace_concat(arrayobject * self,PyObject * bb)1028 array_inplace_concat(arrayobject *self, PyObject *bb)
1029 {
1030 if (!array_Check(bb)) {
1031 PyErr_Format(PyExc_TypeError,
1032 "can only extend array with array (not \"%.200s\")",
1033 Py_TYPE(bb)->tp_name);
1034 return NULL;
1035 }
1036 if (array_do_extend(self, bb) == -1)
1037 return NULL;
1038 Py_INCREF(self);
1039 return (PyObject *)self;
1040 }
1041
1042 static PyObject *
array_inplace_repeat(arrayobject * self,Py_ssize_t n)1043 array_inplace_repeat(arrayobject *self, Py_ssize_t n)
1044 {
1045 char *items, *p;
1046 Py_ssize_t size, i;
1047
1048 if (Py_SIZE(self) > 0) {
1049 if (n < 0)
1050 n = 0;
1051 if ((self->ob_descr->itemsize != 0) &&
1052 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
1053 return PyErr_NoMemory();
1054 }
1055 size = Py_SIZE(self) * self->ob_descr->itemsize;
1056 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
1057 return PyErr_NoMemory();
1058 }
1059 if (array_resize(self, n * Py_SIZE(self)) == -1)
1060 return NULL;
1061 items = p = self->ob_item;
1062 for (i = 1; i < n; i++) {
1063 p += size;
1064 memcpy(p, items, size);
1065 }
1066 }
1067 Py_INCREF(self);
1068 return (PyObject *)self;
1069 }
1070
1071
1072 static PyObject *
ins(arrayobject * self,Py_ssize_t where,PyObject * v)1073 ins(arrayobject *self, Py_ssize_t where, PyObject *v)
1074 {
1075 if (ins1(self, where, v) != 0)
1076 return NULL;
1077 Py_RETURN_NONE;
1078 }
1079
1080 /*[clinic input]
1081 array.array.count
1082
1083 v: object
1084 /
1085
1086 Return number of occurrences of v in the array.
1087 [clinic start generated code]*/
1088
1089 static PyObject *
array_array_count(arrayobject * self,PyObject * v)1090 array_array_count(arrayobject *self, PyObject *v)
1091 /*[clinic end generated code: output=3dd3624bf7135a3a input=d9bce9d65e39d1f5]*/
1092 {
1093 Py_ssize_t count = 0;
1094 Py_ssize_t i;
1095
1096 for (i = 0; i < Py_SIZE(self); i++) {
1097 PyObject *selfi;
1098 int cmp;
1099
1100 selfi = getarrayitem((PyObject *)self, i);
1101 if (selfi == NULL)
1102 return NULL;
1103 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1104 Py_DECREF(selfi);
1105 if (cmp > 0)
1106 count++;
1107 else if (cmp < 0)
1108 return NULL;
1109 }
1110 return PyLong_FromSsize_t(count);
1111 }
1112
1113
1114 /*[clinic input]
1115 array.array.index
1116
1117 v: object
1118 /
1119
1120 Return index of first occurrence of v in the array.
1121 [clinic start generated code]*/
1122
1123 static PyObject *
array_array_index(arrayobject * self,PyObject * v)1124 array_array_index(arrayobject *self, PyObject *v)
1125 /*[clinic end generated code: output=d48498d325602167 input=cf619898c6649d08]*/
1126 {
1127 Py_ssize_t i;
1128
1129 for (i = 0; i < Py_SIZE(self); i++) {
1130 PyObject *selfi;
1131 int cmp;
1132
1133 selfi = getarrayitem((PyObject *)self, i);
1134 if (selfi == NULL)
1135 return NULL;
1136 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1137 Py_DECREF(selfi);
1138 if (cmp > 0) {
1139 return PyLong_FromLong((long)i);
1140 }
1141 else if (cmp < 0)
1142 return NULL;
1143 }
1144 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
1145 return NULL;
1146 }
1147
1148 static int
array_contains(arrayobject * self,PyObject * v)1149 array_contains(arrayobject *self, PyObject *v)
1150 {
1151 Py_ssize_t i;
1152 int cmp;
1153
1154 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1155 PyObject *selfi = getarrayitem((PyObject *)self, i);
1156 if (selfi == NULL)
1157 return -1;
1158 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1159 Py_DECREF(selfi);
1160 }
1161 return cmp;
1162 }
1163
1164 /*[clinic input]
1165 array.array.remove
1166
1167 v: object
1168 /
1169
1170 Remove the first occurrence of v in the array.
1171 [clinic start generated code]*/
1172
1173 static PyObject *
array_array_remove(arrayobject * self,PyObject * v)1174 array_array_remove(arrayobject *self, PyObject *v)
1175 /*[clinic end generated code: output=bef06be9fdf9dceb input=0b1e5aed25590027]*/
1176 {
1177 Py_ssize_t i;
1178
1179 for (i = 0; i < Py_SIZE(self); i++) {
1180 PyObject *selfi;
1181 int cmp;
1182
1183 selfi = getarrayitem((PyObject *)self,i);
1184 if (selfi == NULL)
1185 return NULL;
1186 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1187 Py_DECREF(selfi);
1188 if (cmp > 0) {
1189 if (array_del_slice(self, i, i+1) != 0)
1190 return NULL;
1191 Py_RETURN_NONE;
1192 }
1193 else if (cmp < 0)
1194 return NULL;
1195 }
1196 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
1197 return NULL;
1198 }
1199
1200 /*[clinic input]
1201 array.array.pop
1202
1203 i: Py_ssize_t = -1
1204 /
1205
1206 Return the i-th element and delete it from the array.
1207
1208 i defaults to -1.
1209 [clinic start generated code]*/
1210
1211 static PyObject *
array_array_pop_impl(arrayobject * self,Py_ssize_t i)1212 array_array_pop_impl(arrayobject *self, Py_ssize_t i)
1213 /*[clinic end generated code: output=bc1f0c54fe5308e4 input=8e5feb4c1a11cd44]*/
1214 {
1215 PyObject *v;
1216
1217 if (Py_SIZE(self) == 0) {
1218 /* Special-case most common failure cause */
1219 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1220 return NULL;
1221 }
1222 if (i < 0)
1223 i += Py_SIZE(self);
1224 if (i < 0 || i >= Py_SIZE(self)) {
1225 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1226 return NULL;
1227 }
1228 v = getarrayitem((PyObject *)self, i);
1229 if (v == NULL)
1230 return NULL;
1231 if (array_del_slice(self, i, i+1) != 0) {
1232 Py_DECREF(v);
1233 return NULL;
1234 }
1235 return v;
1236 }
1237
1238 /*[clinic input]
1239 array.array.extend
1240
1241 bb: object
1242 /
1243
1244 Append items to the end of the array.
1245 [clinic start generated code]*/
1246
1247 static PyObject *
array_array_extend(arrayobject * self,PyObject * bb)1248 array_array_extend(arrayobject *self, PyObject *bb)
1249 /*[clinic end generated code: output=bbddbc8e8bef871d input=43be86aba5c31e44]*/
1250 {
1251 if (array_do_extend(self, bb) == -1)
1252 return NULL;
1253 Py_RETURN_NONE;
1254 }
1255
1256 /*[clinic input]
1257 array.array.insert
1258
1259 i: Py_ssize_t
1260 v: object
1261 /
1262
1263 Insert a new item v into the array before position i.
1264 [clinic start generated code]*/
1265
1266 static PyObject *
array_array_insert_impl(arrayobject * self,Py_ssize_t i,PyObject * v)1267 array_array_insert_impl(arrayobject *self, Py_ssize_t i, PyObject *v)
1268 /*[clinic end generated code: output=5a3648e278348564 input=5577d1b4383e9313]*/
1269 {
1270 return ins(self, i, v);
1271 }
1272
1273 /*[clinic input]
1274 array.array.buffer_info
1275
1276 Return a tuple (address, length) giving the current memory address and the length in items of the buffer used to hold array's contents.
1277
1278 The length should be multiplied by the itemsize attribute to calculate
1279 the buffer length in bytes.
1280 [clinic start generated code]*/
1281
1282 static PyObject *
array_array_buffer_info_impl(arrayobject * self)1283 array_array_buffer_info_impl(arrayobject *self)
1284 /*[clinic end generated code: output=9b2a4ec3ae7e98e7 input=a58bae5c6e1ac6a6]*/
1285 {
1286 PyObject *retval = NULL, *v;
1287
1288 retval = PyTuple_New(2);
1289 if (!retval)
1290 return NULL;
1291
1292 v = PyLong_FromVoidPtr(self->ob_item);
1293 if (v == NULL) {
1294 Py_DECREF(retval);
1295 return NULL;
1296 }
1297 PyTuple_SET_ITEM(retval, 0, v);
1298
1299 v = PyLong_FromSsize_t(Py_SIZE(self));
1300 if (v == NULL) {
1301 Py_DECREF(retval);
1302 return NULL;
1303 }
1304 PyTuple_SET_ITEM(retval, 1, v);
1305
1306 return retval;
1307 }
1308
1309 /*[clinic input]
1310 array.array.append
1311
1312 v: object
1313 /
1314
1315 Append new value v to the end of the array.
1316 [clinic start generated code]*/
1317
1318 static PyObject *
array_array_append(arrayobject * self,PyObject * v)1319 array_array_append(arrayobject *self, PyObject *v)
1320 /*[clinic end generated code: output=745a0669bf8db0e2 input=0b98d9d78e78f0fa]*/
1321 {
1322 return ins(self, Py_SIZE(self), v);
1323 }
1324
1325 /*[clinic input]
1326 array.array.byteswap
1327
1328 Byteswap all items of the array.
1329
1330 If the items in the array are not 1, 2, 4, or 8 bytes in size, RuntimeError is
1331 raised.
1332 [clinic start generated code]*/
1333
1334 static PyObject *
array_array_byteswap_impl(arrayobject * self)1335 array_array_byteswap_impl(arrayobject *self)
1336 /*[clinic end generated code: output=5f8236cbdf0d90b5 input=6a85591b950a0186]*/
1337 {
1338 char *p;
1339 Py_ssize_t i;
1340
1341 switch (self->ob_descr->itemsize) {
1342 case 1:
1343 break;
1344 case 2:
1345 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1346 char p0 = p[0];
1347 p[0] = p[1];
1348 p[1] = p0;
1349 }
1350 break;
1351 case 4:
1352 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1353 char p0 = p[0];
1354 char p1 = p[1];
1355 p[0] = p[3];
1356 p[1] = p[2];
1357 p[2] = p1;
1358 p[3] = p0;
1359 }
1360 break;
1361 case 8:
1362 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1363 char p0 = p[0];
1364 char p1 = p[1];
1365 char p2 = p[2];
1366 char p3 = p[3];
1367 p[0] = p[7];
1368 p[1] = p[6];
1369 p[2] = p[5];
1370 p[3] = p[4];
1371 p[4] = p3;
1372 p[5] = p2;
1373 p[6] = p1;
1374 p[7] = p0;
1375 }
1376 break;
1377 default:
1378 PyErr_SetString(PyExc_RuntimeError,
1379 "don't know how to byteswap this array type");
1380 return NULL;
1381 }
1382 Py_RETURN_NONE;
1383 }
1384
1385 /*[clinic input]
1386 array.array.reverse
1387
1388 Reverse the order of the items in the array.
1389 [clinic start generated code]*/
1390
1391 static PyObject *
array_array_reverse_impl(arrayobject * self)1392 array_array_reverse_impl(arrayobject *self)
1393 /*[clinic end generated code: output=c04868b36f6f4089 input=cd904f01b27d966a]*/
1394 {
1395 Py_ssize_t itemsize = self->ob_descr->itemsize;
1396 char *p, *q;
1397 /* little buffer to hold items while swapping */
1398 char tmp[256]; /* 8 is probably enough -- but why skimp */
1399 assert((size_t)itemsize <= sizeof(tmp));
1400
1401 if (Py_SIZE(self) > 1) {
1402 for (p = self->ob_item,
1403 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1404 p < q;
1405 p += itemsize, q -= itemsize) {
1406 /* memory areas guaranteed disjoint, so memcpy
1407 * is safe (& memmove may be slower).
1408 */
1409 memcpy(tmp, p, itemsize);
1410 memcpy(p, q, itemsize);
1411 memcpy(q, tmp, itemsize);
1412 }
1413 }
1414
1415 Py_RETURN_NONE;
1416 }
1417
1418 /*[clinic input]
1419 array.array.fromfile
1420
1421 f: object
1422 n: Py_ssize_t
1423 /
1424
1425 Read n objects from the file object f and append them to the end of the array.
1426 [clinic start generated code]*/
1427
1428 static PyObject *
array_array_fromfile_impl(arrayobject * self,PyObject * f,Py_ssize_t n)1429 array_array_fromfile_impl(arrayobject *self, PyObject *f, Py_ssize_t n)
1430 /*[clinic end generated code: output=ec9f600e10f53510 input=e188afe8e58adf40]*/
1431 {
1432 PyObject *b, *res;
1433 Py_ssize_t itemsize = self->ob_descr->itemsize;
1434 Py_ssize_t nbytes;
1435 _Py_IDENTIFIER(read);
1436 int not_enough_bytes;
1437
1438 if (n < 0) {
1439 PyErr_SetString(PyExc_ValueError, "negative count");
1440 return NULL;
1441 }
1442 if (n > PY_SSIZE_T_MAX / itemsize) {
1443 PyErr_NoMemory();
1444 return NULL;
1445 }
1446 nbytes = n * itemsize;
1447
1448 b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes);
1449 if (b == NULL)
1450 return NULL;
1451
1452 if (!PyBytes_Check(b)) {
1453 PyErr_SetString(PyExc_TypeError,
1454 "read() didn't return bytes");
1455 Py_DECREF(b);
1456 return NULL;
1457 }
1458
1459 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
1460
1461 res = array_array_frombytes(self, b);
1462 Py_DECREF(b);
1463 if (res == NULL)
1464 return NULL;
1465
1466 if (not_enough_bytes) {
1467 PyErr_SetString(PyExc_EOFError,
1468 "read() didn't return enough bytes");
1469 Py_DECREF(res);
1470 return NULL;
1471 }
1472
1473 return res;
1474 }
1475
1476 /*[clinic input]
1477 array.array.tofile
1478
1479 f: object
1480 /
1481
1482 Write all items (as machine values) to the file object f.
1483 [clinic start generated code]*/
1484
1485 static PyObject *
array_array_tofile(arrayobject * self,PyObject * f)1486 array_array_tofile(arrayobject *self, PyObject *f)
1487 /*[clinic end generated code: output=3a2cfa8128df0777 input=b0669a484aab0831]*/
1488 {
1489 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1490 /* Write 64K blocks at a time */
1491 /* XXX Make the block size settable */
1492 int BLOCKSIZE = 64*1024;
1493 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1494 Py_ssize_t i;
1495
1496 if (Py_SIZE(self) == 0)
1497 goto done;
1498
1499 for (i = 0; i < nblocks; i++) {
1500 char* ptr = self->ob_item + i*BLOCKSIZE;
1501 Py_ssize_t size = BLOCKSIZE;
1502 PyObject *bytes, *res;
1503 _Py_IDENTIFIER(write);
1504
1505 if (i*BLOCKSIZE + size > nbytes)
1506 size = nbytes - i*BLOCKSIZE;
1507 bytes = PyBytes_FromStringAndSize(ptr, size);
1508 if (bytes == NULL)
1509 return NULL;
1510 res = _PyObject_CallMethodIdObjArgs(f, &PyId_write, bytes, NULL);
1511 Py_DECREF(bytes);
1512 if (res == NULL)
1513 return NULL;
1514 Py_DECREF(res); /* drop write result */
1515 }
1516
1517 done:
1518 Py_RETURN_NONE;
1519 }
1520
1521 /*[clinic input]
1522 array.array.fromlist
1523
1524 list: object
1525 /
1526
1527 Append items to array from list.
1528 [clinic start generated code]*/
1529
1530 static PyObject *
array_array_fromlist(arrayobject * self,PyObject * list)1531 array_array_fromlist(arrayobject *self, PyObject *list)
1532 /*[clinic end generated code: output=26411c2d228a3e3f input=be2605a96c49680f]*/
1533 {
1534 Py_ssize_t n;
1535
1536 if (!PyList_Check(list)) {
1537 PyErr_SetString(PyExc_TypeError, "arg must be list");
1538 return NULL;
1539 }
1540 n = PyList_Size(list);
1541 if (n > 0) {
1542 Py_ssize_t i, old_size;
1543 old_size = Py_SIZE(self);
1544 if (array_resize(self, old_size + n) == -1)
1545 return NULL;
1546 for (i = 0; i < n; i++) {
1547 PyObject *v = PyList_GET_ITEM(list, i);
1548 if ((*self->ob_descr->setitem)(self,
1549 Py_SIZE(self) - n + i, v) != 0) {
1550 array_resize(self, old_size);
1551 return NULL;
1552 }
1553 if (n != PyList_GET_SIZE(list)) {
1554 PyErr_SetString(PyExc_RuntimeError,
1555 "list changed size during iteration");
1556 array_resize(self, old_size);
1557 return NULL;
1558 }
1559 }
1560 }
1561 Py_RETURN_NONE;
1562 }
1563
1564 /*[clinic input]
1565 array.array.tolist
1566
1567 Convert array to an ordinary list with the same items.
1568 [clinic start generated code]*/
1569
1570 static PyObject *
array_array_tolist_impl(arrayobject * self)1571 array_array_tolist_impl(arrayobject *self)
1572 /*[clinic end generated code: output=00b60cc9eab8ef89 input=a8d7784a94f86b53]*/
1573 {
1574 PyObject *list = PyList_New(Py_SIZE(self));
1575 Py_ssize_t i;
1576
1577 if (list == NULL)
1578 return NULL;
1579 for (i = 0; i < Py_SIZE(self); i++) {
1580 PyObject *v = getarrayitem((PyObject *)self, i);
1581 if (v == NULL)
1582 goto error;
1583 PyList_SET_ITEM(list, i, v);
1584 }
1585 return list;
1586
1587 error:
1588 Py_DECREF(list);
1589 return NULL;
1590 }
1591
1592 static PyObject *
frombytes(arrayobject * self,Py_buffer * buffer)1593 frombytes(arrayobject *self, Py_buffer *buffer)
1594 {
1595 int itemsize = self->ob_descr->itemsize;
1596 Py_ssize_t n;
1597 if (buffer->itemsize != 1) {
1598 PyBuffer_Release(buffer);
1599 PyErr_SetString(PyExc_TypeError, "a bytes-like object is required");
1600 return NULL;
1601 }
1602 n = buffer->len;
1603 if (n % itemsize != 0) {
1604 PyBuffer_Release(buffer);
1605 PyErr_SetString(PyExc_ValueError,
1606 "bytes length not a multiple of item size");
1607 return NULL;
1608 }
1609 n = n / itemsize;
1610 if (n > 0) {
1611 Py_ssize_t old_size = Py_SIZE(self);
1612 if ((n > PY_SSIZE_T_MAX - old_size) ||
1613 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
1614 PyBuffer_Release(buffer);
1615 return PyErr_NoMemory();
1616 }
1617 if (array_resize(self, old_size + n) == -1) {
1618 PyBuffer_Release(buffer);
1619 return NULL;
1620 }
1621 memcpy(self->ob_item + old_size * itemsize,
1622 buffer->buf, n * itemsize);
1623 }
1624 PyBuffer_Release(buffer);
1625 Py_RETURN_NONE;
1626 }
1627
1628 /*[clinic input]
1629 array.array.fromstring
1630
1631 buffer: Py_buffer(accept={str, buffer})
1632 /
1633
1634 Appends 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).
1635
1636 This method is deprecated. Use frombytes instead.
1637 [clinic start generated code]*/
1638
1639 static PyObject *
array_array_fromstring_impl(arrayobject * self,Py_buffer * buffer)1640 array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer)
1641 /*[clinic end generated code: output=31c4baa779df84ce input=a3341a512e11d773]*/
1642 {
1643 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1644 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
1645 return NULL;
1646 return frombytes(self, buffer);
1647 }
1648
1649 /*[clinic input]
1650 array.array.frombytes
1651
1652 buffer: Py_buffer
1653 /
1654
1655 Appends 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).
1656 [clinic start generated code]*/
1657
1658 static PyObject *
array_array_frombytes_impl(arrayobject * self,Py_buffer * buffer)1659 array_array_frombytes_impl(arrayobject *self, Py_buffer *buffer)
1660 /*[clinic end generated code: output=d9842c8f7510a516 input=2bbf2b53ebfcc988]*/
1661 {
1662 return frombytes(self, buffer);
1663 }
1664
1665 /*[clinic input]
1666 array.array.tobytes
1667
1668 Convert the array to an array of machine values and return the bytes representation.
1669 [clinic start generated code]*/
1670
1671 static PyObject *
array_array_tobytes_impl(arrayobject * self)1672 array_array_tobytes_impl(arrayobject *self)
1673 /*[clinic end generated code: output=87318e4edcdc2bb6 input=90ee495f96de34f5]*/
1674 {
1675 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1676 return PyBytes_FromStringAndSize(self->ob_item,
1677 Py_SIZE(self) * self->ob_descr->itemsize);
1678 } else {
1679 return PyErr_NoMemory();
1680 }
1681 }
1682
1683 /*[clinic input]
1684 array.array.tostring
1685
1686 Convert the array to an array of machine values and return the bytes representation.
1687
1688 This method is deprecated. Use tobytes instead.
1689 [clinic start generated code]*/
1690
1691 static PyObject *
array_array_tostring_impl(arrayobject * self)1692 array_array_tostring_impl(arrayobject *self)
1693 /*[clinic end generated code: output=7d6bd92745a2c8f3 input=b6c0ddee7b30457e]*/
1694 {
1695 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1696 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
1697 return NULL;
1698 return array_array_tobytes_impl(self);
1699 }
1700
1701 /*[clinic input]
1702 array.array.fromunicode
1703
1704 ustr: Py_UNICODE(zeroes=True)
1705 /
1706
1707 Extends this array with data from the unicode string ustr.
1708
1709 The array must be a unicode type array; otherwise a ValueError is raised.
1710 Use array.frombytes(ustr.encode(...)) to append Unicode data to an array of
1711 some other type.
1712 [clinic start generated code]*/
1713
1714 static PyObject *
array_array_fromunicode_impl(arrayobject * self,const Py_UNICODE * ustr,Py_ssize_clean_t ustr_length)1715 array_array_fromunicode_impl(arrayobject *self, const Py_UNICODE *ustr,
1716 Py_ssize_clean_t ustr_length)
1717 /*[clinic end generated code: output=cf2f662908e2befc input=150f00566ffbca6e]*/
1718 {
1719 char typecode;
1720
1721 typecode = self->ob_descr->typecode;
1722 if (typecode != 'u') {
1723 PyErr_SetString(PyExc_ValueError,
1724 "fromunicode() may only be called on "
1725 "unicode type arrays");
1726 return NULL;
1727 }
1728 if (ustr_length > 0) {
1729 Py_ssize_t old_size = Py_SIZE(self);
1730 if (array_resize(self, old_size + ustr_length) == -1)
1731 return NULL;
1732 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
1733 ustr, ustr_length * sizeof(Py_UNICODE));
1734 }
1735
1736 Py_RETURN_NONE;
1737 }
1738
1739 /*[clinic input]
1740 array.array.tounicode
1741
1742 Extends this array with data from the unicode string ustr.
1743
1744 Convert the array to a unicode string. The array must be a unicode type array;
1745 otherwise a ValueError is raised. Use array.tobytes().decode() to obtain a
1746 unicode string from an array of some other type.
1747 [clinic start generated code]*/
1748
1749 static PyObject *
array_array_tounicode_impl(arrayobject * self)1750 array_array_tounicode_impl(arrayobject *self)
1751 /*[clinic end generated code: output=08e442378336e1ef input=127242eebe70b66d]*/
1752 {
1753 char typecode;
1754 typecode = self->ob_descr->typecode;
1755 if (typecode != 'u') {
1756 PyErr_SetString(PyExc_ValueError,
1757 "tounicode() may only be called on unicode type arrays");
1758 return NULL;
1759 }
1760 return PyUnicode_FromWideChar((Py_UNICODE *) self->ob_item, Py_SIZE(self));
1761 }
1762
1763 /*[clinic input]
1764 array.array.__sizeof__
1765
1766 Size of the array in memory, in bytes.
1767 [clinic start generated code]*/
1768
1769 static PyObject *
array_array___sizeof___impl(arrayobject * self)1770 array_array___sizeof___impl(arrayobject *self)
1771 /*[clinic end generated code: output=d8e1c61ebbe3eaed input=805586565bf2b3c6]*/
1772 {
1773 Py_ssize_t res;
1774 res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * self->ob_descr->itemsize;
1775 return PyLong_FromSsize_t(res);
1776 }
1777
1778
1779 /*********************** Pickling support ************************/
1780
1781 static const struct mformatdescr {
1782 size_t size;
1783 int is_signed;
1784 int is_big_endian;
1785 } mformat_descriptors[] = {
1786 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1787 {1, 1, 0}, /* 1: SIGNED_INT8 */
1788 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1789 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1790 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1791 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1792 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1793 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1794 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1795 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1796 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1797 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1798 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1799 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1800 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1801 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1802 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1803 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1804 {4, 0, 0}, /* 18: UTF16_LE */
1805 {4, 0, 1}, /* 19: UTF16_BE */
1806 {8, 0, 0}, /* 20: UTF32_LE */
1807 {8, 0, 1} /* 21: UTF32_BE */
1808 };
1809
1810
1811 /*
1812 * Internal: This function is used to find the machine format of a given
1813 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1814 * be found.
1815 */
1816 static enum machine_format_code
typecode_to_mformat_code(char typecode)1817 typecode_to_mformat_code(char typecode)
1818 {
1819 const int is_big_endian = PY_BIG_ENDIAN;
1820
1821 size_t intsize;
1822 int is_signed;
1823
1824 switch (typecode) {
1825 case 'b':
1826 return SIGNED_INT8;
1827 case 'B':
1828 return UNSIGNED_INT8;
1829
1830 case 'u':
1831 if (sizeof(Py_UNICODE) == 2) {
1832 return UTF16_LE + is_big_endian;
1833 }
1834 if (sizeof(Py_UNICODE) == 4) {
1835 return UTF32_LE + is_big_endian;
1836 }
1837 return UNKNOWN_FORMAT;
1838
1839 case 'f':
1840 if (sizeof(float) == 4) {
1841 const float y = 16711938.0;
1842 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1843 return IEEE_754_FLOAT_BE;
1844 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1845 return IEEE_754_FLOAT_LE;
1846 }
1847 return UNKNOWN_FORMAT;
1848
1849 case 'd':
1850 if (sizeof(double) == 8) {
1851 const double x = 9006104071832581.0;
1852 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1853 return IEEE_754_DOUBLE_BE;
1854 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1855 return IEEE_754_DOUBLE_LE;
1856 }
1857 return UNKNOWN_FORMAT;
1858
1859 /* Integers */
1860 case 'h':
1861 intsize = sizeof(short);
1862 is_signed = 1;
1863 break;
1864 case 'H':
1865 intsize = sizeof(short);
1866 is_signed = 0;
1867 break;
1868 case 'i':
1869 intsize = sizeof(int);
1870 is_signed = 1;
1871 break;
1872 case 'I':
1873 intsize = sizeof(int);
1874 is_signed = 0;
1875 break;
1876 case 'l':
1877 intsize = sizeof(long);
1878 is_signed = 1;
1879 break;
1880 case 'L':
1881 intsize = sizeof(long);
1882 is_signed = 0;
1883 break;
1884 case 'q':
1885 intsize = sizeof(long long);
1886 is_signed = 1;
1887 break;
1888 case 'Q':
1889 intsize = sizeof(long long);
1890 is_signed = 0;
1891 break;
1892 default:
1893 return UNKNOWN_FORMAT;
1894 }
1895 switch (intsize) {
1896 case 2:
1897 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1898 case 4:
1899 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1900 case 8:
1901 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1902 default:
1903 return UNKNOWN_FORMAT;
1904 }
1905 }
1906
1907 /* Forward declaration. */
1908 static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1909
1910 /*
1911 * Internal: This function wraps the array constructor--i.e., array_new()--to
1912 * allow the creation of array objects from C code without having to deal
1913 * directly the tuple argument of array_new(). The typecode argument is a
1914 * Unicode character value, like 'i' or 'f' for example, representing an array
1915 * type code. The items argument is a bytes or a list object from which
1916 * contains the initial value of the array.
1917 *
1918 * On success, this functions returns the array object created. Otherwise,
1919 * NULL is returned to indicate a failure.
1920 */
1921 static PyObject *
make_array(PyTypeObject * arraytype,char typecode,PyObject * items)1922 make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
1923 {
1924 PyObject *new_args;
1925 PyObject *array_obj;
1926 PyObject *typecode_obj;
1927
1928 assert(arraytype != NULL);
1929 assert(items != NULL);
1930
1931 typecode_obj = PyUnicode_FromOrdinal(typecode);
1932 if (typecode_obj == NULL)
1933 return NULL;
1934
1935 new_args = PyTuple_New(2);
1936 if (new_args == NULL) {
1937 Py_DECREF(typecode_obj);
1938 return NULL;
1939 }
1940 Py_INCREF(items);
1941 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1942 PyTuple_SET_ITEM(new_args, 1, items);
1943
1944 array_obj = array_new(arraytype, new_args, NULL);
1945 Py_DECREF(new_args);
1946 if (array_obj == NULL)
1947 return NULL;
1948
1949 return array_obj;
1950 }
1951
1952 /*
1953 * This functions is a special constructor used when unpickling an array. It
1954 * provides a portable way to rebuild an array from its memory representation.
1955 */
1956 /*[clinic input]
1957 array._array_reconstructor
1958
1959 arraytype: object(type="PyTypeObject *")
1960 typecode: int(accept={str})
1961 mformat_code: int(type="enum machine_format_code")
1962 items: object
1963 /
1964
1965 Internal. Used for pickling support.
1966 [clinic start generated code]*/
1967
1968 static PyObject *
array__array_reconstructor_impl(PyObject * module,PyTypeObject * arraytype,int typecode,enum machine_format_code mformat_code,PyObject * items)1969 array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype,
1970 int typecode,
1971 enum machine_format_code mformat_code,
1972 PyObject *items)
1973 /*[clinic end generated code: output=e05263141ba28365 input=2464dc8f4c7736b5]*/
1974 {
1975 PyObject *converted_items;
1976 PyObject *result;
1977 const struct arraydescr *descr;
1978
1979 if (!PyType_Check(arraytype)) {
1980 PyErr_Format(PyExc_TypeError,
1981 "first argument must be a type object, not %.200s",
1982 Py_TYPE(arraytype)->tp_name);
1983 return NULL;
1984 }
1985 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1986 PyErr_Format(PyExc_TypeError,
1987 "%.200s is not a subtype of %.200s",
1988 arraytype->tp_name, Arraytype.tp_name);
1989 return NULL;
1990 }
1991 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1992 if ((int)descr->typecode == typecode)
1993 break;
1994 }
1995 if (descr->typecode == '\0') {
1996 PyErr_SetString(PyExc_ValueError,
1997 "second argument must be a valid type code");
1998 return NULL;
1999 }
2000 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
2001 mformat_code > MACHINE_FORMAT_CODE_MAX) {
2002 PyErr_SetString(PyExc_ValueError,
2003 "third argument must be a valid machine format code.");
2004 return NULL;
2005 }
2006 if (!PyBytes_Check(items)) {
2007 PyErr_Format(PyExc_TypeError,
2008 "fourth argument should be bytes, not %.200s",
2009 Py_TYPE(items)->tp_name);
2010 return NULL;
2011 }
2012
2013 /* Fast path: No decoding has to be done. */
2014 if (mformat_code == typecode_to_mformat_code((char)typecode) ||
2015 mformat_code == UNKNOWN_FORMAT) {
2016 return make_array(arraytype, (char)typecode, items);
2017 }
2018
2019 /* Slow path: Decode the byte string according to the given machine
2020 * format code. This occurs when the computer unpickling the array
2021 * object is architecturally different from the one that pickled the
2022 * array.
2023 */
2024 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
2025 PyErr_SetString(PyExc_ValueError,
2026 "string length not a multiple of item size");
2027 return NULL;
2028 }
2029 switch (mformat_code) {
2030 case IEEE_754_FLOAT_LE:
2031 case IEEE_754_FLOAT_BE: {
2032 Py_ssize_t i;
2033 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
2034 Py_ssize_t itemcount = Py_SIZE(items) / 4;
2035 const unsigned char *memstr =
2036 (unsigned char *)PyBytes_AS_STRING(items);
2037
2038 converted_items = PyList_New(itemcount);
2039 if (converted_items == NULL)
2040 return NULL;
2041 for (i = 0; i < itemcount; i++) {
2042 PyObject *pyfloat = PyFloat_FromDouble(
2043 _PyFloat_Unpack4(&memstr[i * 4], le));
2044 if (pyfloat == NULL) {
2045 Py_DECREF(converted_items);
2046 return NULL;
2047 }
2048 PyList_SET_ITEM(converted_items, i, pyfloat);
2049 }
2050 break;
2051 }
2052 case IEEE_754_DOUBLE_LE:
2053 case IEEE_754_DOUBLE_BE: {
2054 Py_ssize_t i;
2055 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
2056 Py_ssize_t itemcount = Py_SIZE(items) / 8;
2057 const unsigned char *memstr =
2058 (unsigned char *)PyBytes_AS_STRING(items);
2059
2060 converted_items = PyList_New(itemcount);
2061 if (converted_items == NULL)
2062 return NULL;
2063 for (i = 0; i < itemcount; i++) {
2064 PyObject *pyfloat = PyFloat_FromDouble(
2065 _PyFloat_Unpack8(&memstr[i * 8], le));
2066 if (pyfloat == NULL) {
2067 Py_DECREF(converted_items);
2068 return NULL;
2069 }
2070 PyList_SET_ITEM(converted_items, i, pyfloat);
2071 }
2072 break;
2073 }
2074 case UTF16_LE:
2075 case UTF16_BE: {
2076 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
2077 converted_items = PyUnicode_DecodeUTF16(
2078 PyBytes_AS_STRING(items), Py_SIZE(items),
2079 "strict", &byteorder);
2080 if (converted_items == NULL)
2081 return NULL;
2082 break;
2083 }
2084 case UTF32_LE:
2085 case UTF32_BE: {
2086 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
2087 converted_items = PyUnicode_DecodeUTF32(
2088 PyBytes_AS_STRING(items), Py_SIZE(items),
2089 "strict", &byteorder);
2090 if (converted_items == NULL)
2091 return NULL;
2092 break;
2093 }
2094
2095 case UNSIGNED_INT8:
2096 case SIGNED_INT8:
2097 case UNSIGNED_INT16_LE:
2098 case UNSIGNED_INT16_BE:
2099 case SIGNED_INT16_LE:
2100 case SIGNED_INT16_BE:
2101 case UNSIGNED_INT32_LE:
2102 case UNSIGNED_INT32_BE:
2103 case SIGNED_INT32_LE:
2104 case SIGNED_INT32_BE:
2105 case UNSIGNED_INT64_LE:
2106 case UNSIGNED_INT64_BE:
2107 case SIGNED_INT64_LE:
2108 case SIGNED_INT64_BE: {
2109 Py_ssize_t i;
2110 const struct mformatdescr mf_descr =
2111 mformat_descriptors[mformat_code];
2112 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
2113 const unsigned char *memstr =
2114 (unsigned char *)PyBytes_AS_STRING(items);
2115 const struct arraydescr *descr;
2116
2117 /* If possible, try to pack array's items using a data type
2118 * that fits better. This may result in an array with narrower
2119 * or wider elements.
2120 *
2121 * For example, if a 32-bit machine pickles an L-code array of
2122 * unsigned longs, then the array will be unpickled by 64-bit
2123 * machine as an I-code array of unsigned ints.
2124 *
2125 * XXX: Is it possible to write a unit test for this?
2126 */
2127 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2128 if (descr->is_integer_type &&
2129 (size_t)descr->itemsize == mf_descr.size &&
2130 descr->is_signed == mf_descr.is_signed)
2131 typecode = descr->typecode;
2132 }
2133
2134 converted_items = PyList_New(itemcount);
2135 if (converted_items == NULL)
2136 return NULL;
2137 for (i = 0; i < itemcount; i++) {
2138 PyObject *pylong;
2139
2140 pylong = _PyLong_FromByteArray(
2141 &memstr[i * mf_descr.size],
2142 mf_descr.size,
2143 !mf_descr.is_big_endian,
2144 mf_descr.is_signed);
2145 if (pylong == NULL) {
2146 Py_DECREF(converted_items);
2147 return NULL;
2148 }
2149 PyList_SET_ITEM(converted_items, i, pylong);
2150 }
2151 break;
2152 }
2153 case UNKNOWN_FORMAT:
2154 /* Impossible, but needed to shut up GCC about the unhandled
2155 * enumeration value.
2156 */
2157 default:
2158 PyErr_BadArgument();
2159 return NULL;
2160 }
2161
2162 result = make_array(arraytype, (char)typecode, converted_items);
2163 Py_DECREF(converted_items);
2164 return result;
2165 }
2166
2167 /*[clinic input]
2168 array.array.__reduce_ex__
2169
2170 value: object
2171 /
2172
2173 Return state information for pickling.
2174 [clinic start generated code]*/
2175
2176 static PyObject *
array_array___reduce_ex__(arrayobject * self,PyObject * value)2177 array_array___reduce_ex__(arrayobject *self, PyObject *value)
2178 /*[clinic end generated code: output=051e0a6175d0eddb input=c36c3f85de7df6cd]*/
2179 {
2180 PyObject *dict;
2181 PyObject *result;
2182 PyObject *array_str;
2183 int typecode = self->ob_descr->typecode;
2184 int mformat_code;
2185 static PyObject *array_reconstructor = NULL;
2186 long protocol;
2187 _Py_IDENTIFIER(_array_reconstructor);
2188 _Py_IDENTIFIER(__dict__);
2189
2190 if (array_reconstructor == NULL) {
2191 PyObject *array_module = PyImport_ImportModule("array");
2192 if (array_module == NULL)
2193 return NULL;
2194 array_reconstructor = _PyObject_GetAttrId(
2195 array_module,
2196 &PyId__array_reconstructor);
2197 Py_DECREF(array_module);
2198 if (array_reconstructor == NULL)
2199 return NULL;
2200 }
2201
2202 if (!PyLong_Check(value)) {
2203 PyErr_SetString(PyExc_TypeError,
2204 "__reduce_ex__ argument should be an integer");
2205 return NULL;
2206 }
2207 protocol = PyLong_AsLong(value);
2208 if (protocol == -1 && PyErr_Occurred())
2209 return NULL;
2210
2211 if (_PyObject_LookupAttrId((PyObject *)self, &PyId___dict__, &dict) < 0) {
2212 return NULL;
2213 }
2214 if (dict == NULL) {
2215 dict = Py_None;
2216 Py_INCREF(dict);
2217 }
2218
2219 mformat_code = typecode_to_mformat_code(typecode);
2220 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
2221 /* Convert the array to a list if we got something weird
2222 * (e.g., non-IEEE floats), or we are pickling the array using
2223 * a Python 2.x compatible protocol.
2224 *
2225 * It is necessary to use a list representation for Python 2.x
2226 * compatible pickle protocol, since Python 2's str objects
2227 * are unpickled as unicode by Python 3. Thus it is impossible
2228 * to make arrays unpicklable by Python 3 by using their memory
2229 * representation, unless we resort to ugly hacks such as
2230 * coercing unicode objects to bytes in array_reconstructor.
2231 */
2232 PyObject *list;
2233 list = array_array_tolist_impl(self);
2234 if (list == NULL) {
2235 Py_DECREF(dict);
2236 return NULL;
2237 }
2238 result = Py_BuildValue(
2239 "O(CO)O", Py_TYPE(self), typecode, list, dict);
2240 Py_DECREF(list);
2241 Py_DECREF(dict);
2242 return result;
2243 }
2244
2245 array_str = array_array_tobytes_impl(self);
2246 if (array_str == NULL) {
2247 Py_DECREF(dict);
2248 return NULL;
2249 }
2250 result = Py_BuildValue(
2251 "O(OCiN)O", array_reconstructor, Py_TYPE(self), typecode,
2252 mformat_code, array_str, dict);
2253 Py_DECREF(dict);
2254 return result;
2255 }
2256
2257 static PyObject *
array_get_typecode(arrayobject * a,void * closure)2258 array_get_typecode(arrayobject *a, void *closure)
2259 {
2260 char typecode = a->ob_descr->typecode;
2261 return PyUnicode_FromOrdinal(typecode);
2262 }
2263
2264 static PyObject *
array_get_itemsize(arrayobject * a,void * closure)2265 array_get_itemsize(arrayobject *a, void *closure)
2266 {
2267 return PyLong_FromLong((long)a->ob_descr->itemsize);
2268 }
2269
2270 static PyGetSetDef array_getsets [] = {
2271 {"typecode", (getter) array_get_typecode, NULL,
2272 "the typecode character used to create the array"},
2273 {"itemsize", (getter) array_get_itemsize, NULL,
2274 "the size, in bytes, of one array item"},
2275 {NULL}
2276 };
2277
2278 static PyMethodDef array_methods[] = {
2279 ARRAY_ARRAY_APPEND_METHODDEF
2280 ARRAY_ARRAY_BUFFER_INFO_METHODDEF
2281 ARRAY_ARRAY_BYTESWAP_METHODDEF
2282 ARRAY_ARRAY___COPY___METHODDEF
2283 ARRAY_ARRAY_COUNT_METHODDEF
2284 ARRAY_ARRAY___DEEPCOPY___METHODDEF
2285 ARRAY_ARRAY_EXTEND_METHODDEF
2286 ARRAY_ARRAY_FROMFILE_METHODDEF
2287 ARRAY_ARRAY_FROMLIST_METHODDEF
2288 ARRAY_ARRAY_FROMSTRING_METHODDEF
2289 ARRAY_ARRAY_FROMBYTES_METHODDEF
2290 ARRAY_ARRAY_FROMUNICODE_METHODDEF
2291 ARRAY_ARRAY_INDEX_METHODDEF
2292 ARRAY_ARRAY_INSERT_METHODDEF
2293 ARRAY_ARRAY_POP_METHODDEF
2294 ARRAY_ARRAY___REDUCE_EX___METHODDEF
2295 ARRAY_ARRAY_REMOVE_METHODDEF
2296 ARRAY_ARRAY_REVERSE_METHODDEF
2297 ARRAY_ARRAY_TOFILE_METHODDEF
2298 ARRAY_ARRAY_TOLIST_METHODDEF
2299 ARRAY_ARRAY_TOSTRING_METHODDEF
2300 ARRAY_ARRAY_TOBYTES_METHODDEF
2301 ARRAY_ARRAY_TOUNICODE_METHODDEF
2302 ARRAY_ARRAY___SIZEOF___METHODDEF
2303 {NULL, NULL} /* sentinel */
2304 };
2305
2306 static PyObject *
array_repr(arrayobject * a)2307 array_repr(arrayobject *a)
2308 {
2309 char typecode;
2310 PyObject *s, *v = NULL;
2311 Py_ssize_t len;
2312
2313 len = Py_SIZE(a);
2314 typecode = a->ob_descr->typecode;
2315 if (len == 0) {
2316 return PyUnicode_FromFormat("%s('%c')",
2317 _PyType_Name(Py_TYPE(a)), (int)typecode);
2318 }
2319 if (typecode == 'u') {
2320 v = array_array_tounicode_impl(a);
2321 } else {
2322 v = array_array_tolist_impl(a);
2323 }
2324 if (v == NULL)
2325 return NULL;
2326
2327 s = PyUnicode_FromFormat("%s('%c', %R)",
2328 _PyType_Name(Py_TYPE(a)), (int)typecode, v);
2329 Py_DECREF(v);
2330 return s;
2331 }
2332
2333 static PyObject*
array_subscr(arrayobject * self,PyObject * item)2334 array_subscr(arrayobject* self, PyObject* item)
2335 {
2336 if (PyIndex_Check(item)) {
2337 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2338 if (i==-1 && PyErr_Occurred()) {
2339 return NULL;
2340 }
2341 if (i < 0)
2342 i += Py_SIZE(self);
2343 return array_item(self, i);
2344 }
2345 else if (PySlice_Check(item)) {
2346 Py_ssize_t start, stop, step, slicelength, i;
2347 size_t cur;
2348 PyObject* result;
2349 arrayobject* ar;
2350 int itemsize = self->ob_descr->itemsize;
2351
2352 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2353 return NULL;
2354 }
2355 slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2356 step);
2357
2358 if (slicelength <= 0) {
2359 return newarrayobject(&Arraytype, 0, self->ob_descr);
2360 }
2361 else if (step == 1) {
2362 PyObject *result = newarrayobject(&Arraytype,
2363 slicelength, self->ob_descr);
2364 if (result == NULL)
2365 return NULL;
2366 memcpy(((arrayobject *)result)->ob_item,
2367 self->ob_item + start * itemsize,
2368 slicelength * itemsize);
2369 return result;
2370 }
2371 else {
2372 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2373 if (!result) return NULL;
2374
2375 ar = (arrayobject*)result;
2376
2377 for (cur = start, i = 0; i < slicelength;
2378 cur += step, i++) {
2379 memcpy(ar->ob_item + i*itemsize,
2380 self->ob_item + cur*itemsize,
2381 itemsize);
2382 }
2383
2384 return result;
2385 }
2386 }
2387 else {
2388 PyErr_SetString(PyExc_TypeError,
2389 "array indices must be integers");
2390 return NULL;
2391 }
2392 }
2393
2394 static int
array_ass_subscr(arrayobject * self,PyObject * item,PyObject * value)2395 array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2396 {
2397 Py_ssize_t start, stop, step, slicelength, needed;
2398 arrayobject* other;
2399 int itemsize;
2400
2401 if (PyIndex_Check(item)) {
2402 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2403
2404 if (i == -1 && PyErr_Occurred())
2405 return -1;
2406 if (i < 0)
2407 i += Py_SIZE(self);
2408 if (i < 0 || i >= Py_SIZE(self)) {
2409 PyErr_SetString(PyExc_IndexError,
2410 "array assignment index out of range");
2411 return -1;
2412 }
2413 if (value == NULL) {
2414 /* Fall through to slice assignment */
2415 start = i;
2416 stop = i + 1;
2417 step = 1;
2418 slicelength = 1;
2419 }
2420 else
2421 return (*self->ob_descr->setitem)(self, i, value);
2422 }
2423 else if (PySlice_Check(item)) {
2424 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2425 return -1;
2426 }
2427 slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2428 step);
2429 }
2430 else {
2431 PyErr_SetString(PyExc_TypeError,
2432 "array indices must be integers");
2433 return -1;
2434 }
2435 if (value == NULL) {
2436 other = NULL;
2437 needed = 0;
2438 }
2439 else if (array_Check(value)) {
2440 other = (arrayobject *)value;
2441 needed = Py_SIZE(other);
2442 if (self == other) {
2443 /* Special case "self[i:j] = self" -- copy self first */
2444 int ret;
2445 value = array_slice(other, 0, needed);
2446 if (value == NULL)
2447 return -1;
2448 ret = array_ass_subscr(self, item, value);
2449 Py_DECREF(value);
2450 return ret;
2451 }
2452 if (other->ob_descr != self->ob_descr) {
2453 PyErr_BadArgument();
2454 return -1;
2455 }
2456 }
2457 else {
2458 PyErr_Format(PyExc_TypeError,
2459 "can only assign array (not \"%.200s\") to array slice",
2460 Py_TYPE(value)->tp_name);
2461 return -1;
2462 }
2463 itemsize = self->ob_descr->itemsize;
2464 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2465 if ((step > 0 && stop < start) ||
2466 (step < 0 && stop > start))
2467 stop = start;
2468
2469 /* Issue #4509: If the array has exported buffers and the slice
2470 assignment would change the size of the array, fail early to make
2471 sure we don't modify it. */
2472 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2473 PyErr_SetString(PyExc_BufferError,
2474 "cannot resize an array that is exporting buffers");
2475 return -1;
2476 }
2477
2478 if (step == 1) {
2479 if (slicelength > needed) {
2480 memmove(self->ob_item + (start + needed) * itemsize,
2481 self->ob_item + stop * itemsize,
2482 (Py_SIZE(self) - stop) * itemsize);
2483 if (array_resize(self, Py_SIZE(self) +
2484 needed - slicelength) < 0)
2485 return -1;
2486 }
2487 else if (slicelength < needed) {
2488 if (array_resize(self, Py_SIZE(self) +
2489 needed - slicelength) < 0)
2490 return -1;
2491 memmove(self->ob_item + (start + needed) * itemsize,
2492 self->ob_item + stop * itemsize,
2493 (Py_SIZE(self) - start - needed) * itemsize);
2494 }
2495 if (needed > 0)
2496 memcpy(self->ob_item + start * itemsize,
2497 other->ob_item, needed * itemsize);
2498 return 0;
2499 }
2500 else if (needed == 0) {
2501 /* Delete slice */
2502 size_t cur;
2503 Py_ssize_t i;
2504
2505 if (step < 0) {
2506 stop = start + 1;
2507 start = stop + step * (slicelength - 1) - 1;
2508 step = -step;
2509 }
2510 for (cur = start, i = 0; i < slicelength;
2511 cur += step, i++) {
2512 Py_ssize_t lim = step - 1;
2513
2514 if (cur + step >= (size_t)Py_SIZE(self))
2515 lim = Py_SIZE(self) - cur - 1;
2516 memmove(self->ob_item + (cur - i) * itemsize,
2517 self->ob_item + (cur + 1) * itemsize,
2518 lim * itemsize);
2519 }
2520 cur = start + (size_t)slicelength * step;
2521 if (cur < (size_t)Py_SIZE(self)) {
2522 memmove(self->ob_item + (cur-slicelength) * itemsize,
2523 self->ob_item + cur * itemsize,
2524 (Py_SIZE(self) - cur) * itemsize);
2525 }
2526 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2527 return -1;
2528 return 0;
2529 }
2530 else {
2531 size_t cur;
2532 Py_ssize_t i;
2533
2534 if (needed != slicelength) {
2535 PyErr_Format(PyExc_ValueError,
2536 "attempt to assign array of size %zd "
2537 "to extended slice of size %zd",
2538 needed, slicelength);
2539 return -1;
2540 }
2541 for (cur = start, i = 0; i < slicelength;
2542 cur += step, i++) {
2543 memcpy(self->ob_item + cur * itemsize,
2544 other->ob_item + i * itemsize,
2545 itemsize);
2546 }
2547 return 0;
2548 }
2549 }
2550
2551 static PyMappingMethods array_as_mapping = {
2552 (lenfunc)array_length,
2553 (binaryfunc)array_subscr,
2554 (objobjargproc)array_ass_subscr
2555 };
2556
2557 static const void *emptybuf = "";
2558
2559
2560 static int
array_buffer_getbuf(arrayobject * self,Py_buffer * view,int flags)2561 array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
2562 {
2563 if (view == NULL) {
2564 PyErr_SetString(PyExc_BufferError,
2565 "array_buffer_getbuf: view==NULL argument is obsolete");
2566 return -1;
2567 }
2568
2569 view->buf = (void *)self->ob_item;
2570 view->obj = (PyObject*)self;
2571 Py_INCREF(self);
2572 if (view->buf == NULL)
2573 view->buf = (void *)emptybuf;
2574 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
2575 view->readonly = 0;
2576 view->ndim = 1;
2577 view->itemsize = self->ob_descr->itemsize;
2578 view->suboffsets = NULL;
2579 view->shape = NULL;
2580 if ((flags & PyBUF_ND)==PyBUF_ND) {
2581 view->shape = &((Py_SIZE(self)));
2582 }
2583 view->strides = NULL;
2584 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2585 view->strides = &(view->itemsize);
2586 view->format = NULL;
2587 view->internal = NULL;
2588 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
2589 view->format = (char *)self->ob_descr->formats;
2590 #ifdef Py_UNICODE_WIDE
2591 if (self->ob_descr->typecode == 'u') {
2592 view->format = "w";
2593 }
2594 #endif
2595 }
2596
2597 self->ob_exports++;
2598 return 0;
2599 }
2600
2601 static void
array_buffer_relbuf(arrayobject * self,Py_buffer * view)2602 array_buffer_relbuf(arrayobject *self, Py_buffer *view)
2603 {
2604 self->ob_exports--;
2605 }
2606
2607 static PySequenceMethods array_as_sequence = {
2608 (lenfunc)array_length, /*sq_length*/
2609 (binaryfunc)array_concat, /*sq_concat*/
2610 (ssizeargfunc)array_repeat, /*sq_repeat*/
2611 (ssizeargfunc)array_item, /*sq_item*/
2612 0, /*sq_slice*/
2613 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
2614 0, /*sq_ass_slice*/
2615 (objobjproc)array_contains, /*sq_contains*/
2616 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
2617 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
2618 };
2619
2620 static PyBufferProcs array_as_buffer = {
2621 (getbufferproc)array_buffer_getbuf,
2622 (releasebufferproc)array_buffer_relbuf
2623 };
2624
2625 static PyObject *
array_new(PyTypeObject * type,PyObject * args,PyObject * kwds)2626 array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2627 {
2628 int c;
2629 PyObject *initial = NULL, *it = NULL;
2630 const struct arraydescr *descr;
2631
2632 if (type == &Arraytype && !_PyArg_NoKeywords("array.array", kwds))
2633 return NULL;
2634
2635 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2636 return NULL;
2637
2638 if (PySys_Audit("array.__new__", "CO",
2639 c, initial ? initial : Py_None) < 0) {
2640 return NULL;
2641 }
2642
2643 if (initial && c != 'u') {
2644 if (PyUnicode_Check(initial)) {
2645 PyErr_Format(PyExc_TypeError, "cannot use a str to initialize "
2646 "an array with typecode '%c'", c);
2647 return NULL;
2648 }
2649 else if (array_Check(initial) &&
2650 ((arrayobject*)initial)->ob_descr->typecode == 'u') {
2651 PyErr_Format(PyExc_TypeError, "cannot use a unicode array to "
2652 "initialize an array with typecode '%c'", c);
2653 return NULL;
2654 }
2655 }
2656
2657 if (!(initial == NULL || PyList_Check(initial)
2658 || PyByteArray_Check(initial)
2659 || PyBytes_Check(initial)
2660 || PyTuple_Check(initial)
2661 || ((c=='u') && PyUnicode_Check(initial))
2662 || (array_Check(initial)
2663 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
2664 it = PyObject_GetIter(initial);
2665 if (it == NULL)
2666 return NULL;
2667 /* We set initial to NULL so that the subsequent code
2668 will create an empty array of the appropriate type
2669 and afterwards we can use array_iter_extend to populate
2670 the array.
2671 */
2672 initial = NULL;
2673 }
2674 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2675 if (descr->typecode == c) {
2676 PyObject *a;
2677 Py_ssize_t len;
2678
2679 if (initial == NULL)
2680 len = 0;
2681 else if (PyList_Check(initial))
2682 len = PyList_GET_SIZE(initial);
2683 else if (PyTuple_Check(initial) || array_Check(initial))
2684 len = Py_SIZE(initial);
2685 else
2686 len = 0;
2687
2688 a = newarrayobject(type, len, descr);
2689 if (a == NULL)
2690 return NULL;
2691
2692 if (len > 0 && !array_Check(initial)) {
2693 Py_ssize_t i;
2694 for (i = 0; i < len; i++) {
2695 PyObject *v =
2696 PySequence_GetItem(initial, i);
2697 if (v == NULL) {
2698 Py_DECREF(a);
2699 return NULL;
2700 }
2701 if (setarrayitem(a, i, v) != 0) {
2702 Py_DECREF(v);
2703 Py_DECREF(a);
2704 return NULL;
2705 }
2706 Py_DECREF(v);
2707 }
2708 }
2709 else if (initial != NULL && (PyByteArray_Check(initial) ||
2710 PyBytes_Check(initial))) {
2711 PyObject *v;
2712 v = array_array_frombytes((arrayobject *)a,
2713 initial);
2714 if (v == NULL) {
2715 Py_DECREF(a);
2716 return NULL;
2717 }
2718 Py_DECREF(v);
2719 }
2720 else if (initial != NULL && PyUnicode_Check(initial)) {
2721 Py_UNICODE *ustr;
2722 Py_ssize_t n;
2723
2724 ustr = PyUnicode_AsUnicode(initial);
2725 if (ustr == NULL) {
2726 PyErr_NoMemory();
2727 Py_DECREF(a);
2728 return NULL;
2729 }
2730
2731 n = PyUnicode_GET_DATA_SIZE(initial);
2732 if (n > 0) {
2733 arrayobject *self = (arrayobject *)a;
2734 char *item = self->ob_item;
2735 item = (char *)PyMem_Realloc(item, n);
2736 if (item == NULL) {
2737 PyErr_NoMemory();
2738 Py_DECREF(a);
2739 return NULL;
2740 }
2741 self->ob_item = item;
2742 Py_SIZE(self) = n / sizeof(Py_UNICODE);
2743 memcpy(item, ustr, n);
2744 self->allocated = Py_SIZE(self);
2745 }
2746 }
2747 else if (initial != NULL && array_Check(initial) && len > 0) {
2748 arrayobject *self = (arrayobject *)a;
2749 arrayobject *other = (arrayobject *)initial;
2750 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2751 }
2752 if (it != NULL) {
2753 if (array_iter_extend((arrayobject *)a, it) == -1) {
2754 Py_DECREF(it);
2755 Py_DECREF(a);
2756 return NULL;
2757 }
2758 Py_DECREF(it);
2759 }
2760 return a;
2761 }
2762 }
2763 PyErr_SetString(PyExc_ValueError,
2764 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
2765 return NULL;
2766 }
2767
2768
2769 PyDoc_STRVAR(module_doc,
2770 "This module defines an object type which can efficiently represent\n\
2771 an array of basic values: characters, integers, floating point\n\
2772 numbers. Arrays are sequence types and behave very much like lists,\n\
2773 except that the type of objects stored in them is constrained.\n");
2774
2775 PyDoc_STRVAR(arraytype_doc,
2776 "array(typecode [, initializer]) -> array\n\
2777 \n\
2778 Return a new array whose items are restricted by typecode, and\n\
2779 initialized from the optional initializer value, which must be a list,\n\
2780 string or iterable over elements of the appropriate type.\n\
2781 \n\
2782 Arrays represent basic values and behave very much like lists, except\n\
2783 the type of objects stored in them is constrained. The type is specified\n\
2784 at object creation time by using a type code, which is a single character.\n\
2785 The following type codes are defined:\n\
2786 \n\
2787 Type code C Type Minimum size in bytes\n\
2788 'b' signed integer 1\n\
2789 'B' unsigned integer 1\n\
2790 'u' Unicode character 2 (see note)\n\
2791 'h' signed integer 2\n\
2792 'H' unsigned integer 2\n\
2793 'i' signed integer 2\n\
2794 'I' unsigned integer 2\n\
2795 'l' signed integer 4\n\
2796 'L' unsigned integer 4\n\
2797 'q' signed integer 8 (see note)\n\
2798 'Q' unsigned integer 8 (see note)\n\
2799 'f' floating point 4\n\
2800 'd' floating point 8\n\
2801 \n\
2802 NOTE: The 'u' typecode corresponds to Python's unicode character. On\n\
2803 narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2804 \n\
2805 NOTE: The 'q' and 'Q' type codes are only available if the platform\n\
2806 C compiler used to build Python supports 'long long', or, on Windows,\n\
2807 '__int64'.\n\
2808 \n\
2809 Methods:\n\
2810 \n\
2811 append() -- append a new item to the end of the array\n\
2812 buffer_info() -- return information giving the current memory info\n\
2813 byteswap() -- byteswap all the items of the array\n\
2814 count() -- return number of occurrences of an object\n\
2815 extend() -- extend array by appending multiple elements from an iterable\n\
2816 fromfile() -- read items from a file object\n\
2817 fromlist() -- append items from the list\n\
2818 frombytes() -- append items from the string\n\
2819 index() -- return index of first occurrence of an object\n\
2820 insert() -- insert a new item into the array at a provided position\n\
2821 pop() -- remove and return item (default last)\n\
2822 remove() -- remove first occurrence of an object\n\
2823 reverse() -- reverse the order of the items in the array\n\
2824 tofile() -- write all items to a file object\n\
2825 tolist() -- return the array converted to an ordinary list\n\
2826 tobytes() -- return the array converted to a string\n\
2827 \n\
2828 Attributes:\n\
2829 \n\
2830 typecode -- the typecode character used to create the array\n\
2831 itemsize -- the length in bytes of one array item\n\
2832 ");
2833
2834 static PyObject *array_iter(arrayobject *ao);
2835
2836 static PyTypeObject Arraytype = {
2837 PyVarObject_HEAD_INIT(NULL, 0)
2838 "array.array",
2839 sizeof(arrayobject),
2840 0,
2841 (destructor)array_dealloc, /* tp_dealloc */
2842 0, /* tp_vectorcall_offset */
2843 0, /* tp_getattr */
2844 0, /* tp_setattr */
2845 0, /* tp_as_async */
2846 (reprfunc)array_repr, /* tp_repr */
2847 0, /* tp_as_number*/
2848 &array_as_sequence, /* tp_as_sequence*/
2849 &array_as_mapping, /* tp_as_mapping*/
2850 0, /* tp_hash */
2851 0, /* tp_call */
2852 0, /* tp_str */
2853 PyObject_GenericGetAttr, /* tp_getattro */
2854 0, /* tp_setattro */
2855 &array_as_buffer, /* tp_as_buffer*/
2856 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2857 arraytype_doc, /* tp_doc */
2858 0, /* tp_traverse */
2859 0, /* tp_clear */
2860 array_richcompare, /* tp_richcompare */
2861 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
2862 (getiterfunc)array_iter, /* tp_iter */
2863 0, /* tp_iternext */
2864 array_methods, /* tp_methods */
2865 0, /* tp_members */
2866 array_getsets, /* tp_getset */
2867 0, /* tp_base */
2868 0, /* tp_dict */
2869 0, /* tp_descr_get */
2870 0, /* tp_descr_set */
2871 0, /* tp_dictoffset */
2872 0, /* tp_init */
2873 PyType_GenericAlloc, /* tp_alloc */
2874 array_new, /* tp_new */
2875 PyObject_Del, /* tp_free */
2876 };
2877
2878
2879 /*********************** Array Iterator **************************/
2880
2881 /*[clinic input]
2882 class array.arrayiterator "arrayiterobject *" "&PyArrayIter_Type"
2883 [clinic start generated code]*/
2884 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=5aefd2d74d8c8e30]*/
2885
2886 static PyObject *
array_iter(arrayobject * ao)2887 array_iter(arrayobject *ao)
2888 {
2889 arrayiterobject *it;
2890
2891 if (!array_Check(ao)) {
2892 PyErr_BadInternalCall();
2893 return NULL;
2894 }
2895
2896 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2897 if (it == NULL)
2898 return NULL;
2899
2900 Py_INCREF(ao);
2901 it->ao = ao;
2902 it->index = 0;
2903 it->getitem = ao->ob_descr->getitem;
2904 PyObject_GC_Track(it);
2905 return (PyObject *)it;
2906 }
2907
2908 static PyObject *
arrayiter_next(arrayiterobject * it)2909 arrayiter_next(arrayiterobject *it)
2910 {
2911 arrayobject *ao;
2912
2913 assert(it != NULL);
2914 assert(PyArrayIter_Check(it));
2915 ao = it->ao;
2916 if (ao == NULL) {
2917 return NULL;
2918 }
2919 assert(array_Check(ao));
2920 if (it->index < Py_SIZE(ao)) {
2921 return (*it->getitem)(ao, it->index++);
2922 }
2923 it->ao = NULL;
2924 Py_DECREF(ao);
2925 return NULL;
2926 }
2927
2928 static void
arrayiter_dealloc(arrayiterobject * it)2929 arrayiter_dealloc(arrayiterobject *it)
2930 {
2931 PyObject_GC_UnTrack(it);
2932 Py_XDECREF(it->ao);
2933 PyObject_GC_Del(it);
2934 }
2935
2936 static int
arrayiter_traverse(arrayiterobject * it,visitproc visit,void * arg)2937 arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2938 {
2939 Py_VISIT(it->ao);
2940 return 0;
2941 }
2942
2943 /*[clinic input]
2944 array.arrayiterator.__reduce__
2945
2946 Return state information for pickling.
2947 [clinic start generated code]*/
2948
2949 static PyObject *
array_arrayiterator___reduce___impl(arrayiterobject * self)2950 array_arrayiterator___reduce___impl(arrayiterobject *self)
2951 /*[clinic end generated code: output=7898a52e8e66e016 input=a062ea1e9951417a]*/
2952 {
2953 _Py_IDENTIFIER(iter);
2954 PyObject *func = _PyEval_GetBuiltinId(&PyId_iter);
2955 if (self->ao == NULL) {
2956 return Py_BuildValue("N(())", func);
2957 }
2958 return Py_BuildValue("N(O)n", func, self->ao, self->index);
2959 }
2960
2961 /*[clinic input]
2962 array.arrayiterator.__setstate__
2963
2964 state: object
2965 /
2966
2967 Set state information for unpickling.
2968 [clinic start generated code]*/
2969
2970 static PyObject *
array_arrayiterator___setstate__(arrayiterobject * self,PyObject * state)2971 array_arrayiterator___setstate__(arrayiterobject *self, PyObject *state)
2972 /*[clinic end generated code: output=397da9904e443cbe input=f47d5ceda19e787b]*/
2973 {
2974 Py_ssize_t index = PyLong_AsSsize_t(state);
2975 if (index == -1 && PyErr_Occurred())
2976 return NULL;
2977 if (index < 0)
2978 index = 0;
2979 else if (index > Py_SIZE(self->ao))
2980 index = Py_SIZE(self->ao); /* iterator exhausted */
2981 self->index = index;
2982 Py_RETURN_NONE;
2983 }
2984
2985 static PyMethodDef arrayiter_methods[] = {
2986 ARRAY_ARRAYITERATOR___REDUCE___METHODDEF
2987 ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF
2988 {NULL, NULL} /* sentinel */
2989 };
2990
2991 static PyTypeObject PyArrayIter_Type = {
2992 PyVarObject_HEAD_INIT(NULL, 0)
2993 "arrayiterator", /* tp_name */
2994 sizeof(arrayiterobject), /* tp_basicsize */
2995 0, /* tp_itemsize */
2996 /* methods */
2997 (destructor)arrayiter_dealloc, /* tp_dealloc */
2998 0, /* tp_vectorcall_offset */
2999 0, /* tp_getattr */
3000 0, /* tp_setattr */
3001 0, /* tp_as_async */
3002 0, /* tp_repr */
3003 0, /* tp_as_number */
3004 0, /* tp_as_sequence */
3005 0, /* tp_as_mapping */
3006 0, /* tp_hash */
3007 0, /* tp_call */
3008 0, /* tp_str */
3009 PyObject_GenericGetAttr, /* tp_getattro */
3010 0, /* tp_setattro */
3011 0, /* tp_as_buffer */
3012 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3013 0, /* tp_doc */
3014 (traverseproc)arrayiter_traverse, /* tp_traverse */
3015 0, /* tp_clear */
3016 0, /* tp_richcompare */
3017 0, /* tp_weaklistoffset */
3018 PyObject_SelfIter, /* tp_iter */
3019 (iternextfunc)arrayiter_next, /* tp_iternext */
3020 arrayiter_methods, /* tp_methods */
3021 };
3022
3023
3024 /*********************** Install Module **************************/
3025
3026 /* No functions in array module. */
3027 static PyMethodDef a_methods[] = {
3028 ARRAY__ARRAY_RECONSTRUCTOR_METHODDEF
3029 {NULL, NULL, 0, NULL} /* Sentinel */
3030 };
3031
3032 static int
array_modexec(PyObject * m)3033 array_modexec(PyObject *m)
3034 {
3035 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
3036 PyObject *typecodes;
3037 Py_ssize_t size = 0;
3038 const struct arraydescr *descr;
3039
3040 if (PyType_Ready(&Arraytype) < 0)
3041 return -1;
3042 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
3043
3044 Py_INCREF((PyObject *)&Arraytype);
3045 if (PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype) < 0) {
3046 Py_DECREF((PyObject *)&Arraytype);
3047 return -1;
3048 }
3049 Py_INCREF((PyObject *)&Arraytype);
3050 if (PyModule_AddObject(m, "array", (PyObject *)&Arraytype) < 0) {
3051 Py_DECREF((PyObject *)&Arraytype);
3052 return -1;
3053 }
3054
3055 for (descr=descriptors; descr->typecode != '\0'; descr++) {
3056 size++;
3057 }
3058
3059 p = buffer;
3060 for (descr = descriptors; descr->typecode != '\0'; descr++) {
3061 *p++ = (char)descr->typecode;
3062 }
3063 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
3064 if (PyModule_AddObject(m, "typecodes", typecodes) < 0) {
3065 Py_XDECREF(typecodes);
3066 return -1;
3067 }
3068
3069 return 0;
3070 }
3071
3072 static PyModuleDef_Slot arrayslots[] = {
3073 {Py_mod_exec, array_modexec},
3074 {0, NULL}
3075 };
3076
3077
3078 static struct PyModuleDef arraymodule = {
3079 PyModuleDef_HEAD_INIT,
3080 "array",
3081 module_doc,
3082 0,
3083 a_methods,
3084 arrayslots,
3085 NULL,
3086 NULL,
3087 NULL
3088 };
3089
3090
3091 PyMODINIT_FUNC
PyInit_array(void)3092 PyInit_array(void)
3093 {
3094 return PyModuleDef_Init(&arraymodule);
3095 }
3096