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