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