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