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