14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Array object implementation */
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* An array is a uniform list -- all items have the same type.
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The item type is restricted to simple C types like int or float */
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_SSIZE_T_CLEAN
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h"
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structmember.h"
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef STDC_HEADERS
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stddef.h>
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* !STDC_HEADERS */
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SYS_TYPES_H
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/types.h>          /* For size_t */
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_SYS_TYPES_H */
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !STDC_HEADERS */
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstruct arrayobject; /* Forward */
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* All possible arraydescr values are defined in the vector "descriptors"
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * below.  That's defined later because the appropriate get and set
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * functions aren't visible yet.
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstruct arraydescr {
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int typecode;
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int itemsize;
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct arrayobject {
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_VAR_HEAD
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *ob_item;
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t allocated;
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct arraydescr *ob_descr;
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *weakreflist; /* List of weak references */
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} arrayobject;
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject Arraytype;
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_resize(arrayobject *self, Py_ssize_t newsize)
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *items;
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t _new_size;
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Bypass realloc() when a previous overallocation is large enough
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       to accommodate the newsize.  If the newsize is 16 smaller than the
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       current size, then proceed with the realloc() to shrink the list.
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (self->allocated >= newsize &&
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(self) < newsize + 16 &&
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->ob_item != NULL) {
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(self) = newsize;
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* This over-allocates proportional to the array size, making room
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * for additional growth.  The over-allocation is mild, but is
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * enough to give linear-time amortized behavior over a long
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * sequence of appends() in the presence of a poorly-performing
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * system realloc().
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * The growth pattern is:  0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * Note, the pattern starts out the same as for lists but then
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * grows at a smaller rate so that larger arrays only overallocate
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * by about 1/16th -- this is done because arrays are presumed to be more
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * memory critical.
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    items = self->ob_item;
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* XXX The following multiplication and division does not optimize away
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       like it does for lists since the size is not known at compile time */
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        items = NULL;
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (items == NULL) {
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_NoMemory();
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self->ob_item = items;
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_SIZE(self) = newsize;
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self->allocated = _new_size;
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/****************************************************************************
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmGet and Set functions for each type.
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmA Get function takes an arrayobject* and an integer index, returning the
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray value at that index wrapped in an appropriate PyObject*.
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmA Set function takes an arrayobject, integer index, and PyObject*; sets
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe array value at that index to the raw C data extracted from the PyObject*,
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand returns 0 if successful, else nonzero on failure (PyObject* not of an
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmappropriate type or value).
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmNote that the basic Get and Set functions do NOT check that the index is
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmin bounds; that's the responsibility of the caller.
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm****************************************************************************/
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmc_getitem(arrayobject *ap, Py_ssize_t i)
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmc_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char x;
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "c;array item must be char", &x))
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((char *)ap->ob_item)[i] = x;
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb_getitem(arrayobject *ap, Py_ssize_t i)
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long x = ((char *)ap->ob_item)[i];
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x >= 128)
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x -= 256;
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(x);
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    short x;
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       must use the next size up that is signed ('h') and manually do
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       the overflow checking */
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "h;array item must be integer", &x))
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (x < -128) {
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "signed char is less than minimum");
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (x > 127) {
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "signed char is greater than maximum");
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((char *)ap->ob_item)[i] = (char)x;
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmBB_getitem(arrayobject *ap, Py_ssize_t i)
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long x = ((unsigned char *)ap->ob_item)[i];
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(x);
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmBB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned char x;
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "b;array item must be integer", &x))
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((char *)ap->ob_item)[i] = x;
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmu_getitem(arrayobject *ap, Py_ssize_t i)
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmu_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_UNICODE *p;
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len;
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (len != 1) {
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "array item must be unicode character");
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((Py_UNICODE *)ap->ob_item)[i] = p[0];
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmh_getitem(arrayobject *ap, Py_ssize_t i)
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmh_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    short x;
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "h;array item must be integer", &x))
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 ((short *)ap->ob_item)[i] = x;
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHH_getitem(arrayobject *ap, Py_ssize_t i)
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int x;
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* PyArg_Parse's 'h' formatter is for a signed short, therefore
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       must use the next size up and manually do the overflow checking */
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "i;array item must be integer", &x))
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (x < 0) {
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "unsigned short is less than minimum");
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (x > USHRT_MAX) {
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "unsigned short is greater than maximum");
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((short *)ap->ob_item)[i] = (short)x;
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmi_getitem(arrayobject *ap, Py_ssize_t i)
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmi_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int x;
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "i;array item must be integer", &x))
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 ((int *)ap->ob_item)[i] = x;
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmII_getitem(arrayobject *ap, Py_ssize_t i)
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong(
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (unsigned long) ((unsigned int *)ap->ob_item)[i]);
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmII_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long x;
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyLong_Check(v)) {
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = PyLong_AsUnsignedLong(v);
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (x == (unsigned long) -1 && PyErr_Occurred())
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        long y;
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_Parse(v, "l;array item must be integer", &y))
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (y < 0) {
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_OverflowError,
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "unsigned int is less than minimum");
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (unsigned long)y;
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x > UINT_MAX) {
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "unsigned int is greater than maximum");
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylml_getitem(arrayobject *ap, Py_ssize_t i)
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(((long *)ap->ob_item)[i]);
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylml_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long x;
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "l;array item must be integer", &x))
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 ((long *)ap->ob_item)[i] = x;
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLL_getitem(arrayobject *ap, Py_ssize_t i)
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long x;
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyLong_Check(v)) {
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = PyLong_AsUnsignedLong(v);
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (x == (unsigned long) -1 && PyErr_Occurred())
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        long y;
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_Parse(v, "l;array item must be integer", &y))
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (y < 0) {
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_OverflowError,
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "unsigned long is less than minimum");
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (unsigned long)y;
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x > ULONG_MAX) {
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "unsigned long is greater than maximum");
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((unsigned long *)ap->ob_item)[i] = x;
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf_getitem(arrayobject *ap, Py_ssize_t i)
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    float x;
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "f;array item must be float", &x))
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 ((float *)ap->ob_item)[i] = x;
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmd_getitem(arrayobject *ap, Py_ssize_t i)
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmd_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    double x;
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_Parse(v, "d;array item must be float", &x))
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i >= 0)
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 ((double *)ap->ob_item)[i] = x;
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Description of types */
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic struct arraydescr descriptors[] = {
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'c', sizeof(char), c_getitem, c_setitem},
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'b', sizeof(char), b_getitem, b_setitem},
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'B', sizeof(char), BB_getitem, BB_setitem},
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'h', sizeof(short), h_getitem, h_setitem},
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'H', sizeof(short), HH_getitem, HH_setitem},
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'i', sizeof(int), i_getitem, i_setitem},
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'I', sizeof(int), II_getitem, II_setitem},
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'l', sizeof(long), l_getitem, l_setitem},
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'L', sizeof(long), LL_getitem, LL_setitem},
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'f', sizeof(float), f_getitem, f_setitem},
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'d', sizeof(double), d_getitem, d_setitem},
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {'\0', 0, 0, 0} /* Sentinel */
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/****************************************************************************
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmImplementations of array object methods.
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm****************************************************************************/
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnewarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayobject *op;
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t nbytes;
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size < 0) {
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadInternalCall();
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nbytes = size * descr->itemsize;
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check for overflow */
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (nbytes / descr->itemsize != (size_t)size) {
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op = (arrayobject *) type->tp_alloc(type, 0);
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op == NULL) {
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_descr = descr;
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->allocated = size;
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->weakreflist = NULL;
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_SIZE(op) = size;
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size <= 0) {
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        op->ob_item = NULL;
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        op->ob_item = PyMem_NEW(char, nbytes);
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (op->ob_item == NULL) {
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(op);
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyErr_NoMemory();
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *) op;
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetarrayitem(PyObject *op, Py_ssize_t i)
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register arrayobject *ap;
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(array_Check(op));
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ap = (arrayobject *)op;
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(i>=0 && i<Py_SIZE(ap));
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (*ap->ob_descr->getitem)(ap, i);
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmins1(arrayobject *self, Py_ssize_t where, PyObject *v)
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *items;
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n = Py_SIZE(self);
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL) {
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadInternalCall();
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((*self->ob_descr->setitem)(self, -1, v) < 0)
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (array_resize(self, n+1) == -1)
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    items = self->ob_item;
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (where < 0) {
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        where += n;
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (where < 0)
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            where = 0;
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (where > n)
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        where = n;
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* appends don't need to call memmove() */
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (where != n)
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memmove(items + (where+1)*self->ob_descr->itemsize,
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            items + where*self->ob_descr->itemsize,
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (n-where)*self->ob_descr->itemsize);
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (*self->ob_descr->setitem)(self, where, v);
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Methods */
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_dealloc(arrayobject *op)
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op->weakreflist != NULL)
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject_ClearWeakRefs((PyObject *) op);
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op->ob_item != NULL)
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_DEL(op->ob_item);
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TYPE(op)->tp_free((PyObject *)op);
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_richcompare(PyObject *v, PyObject *w, int op)
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayobject *va, *wa;
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *vi = NULL;
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *wi = NULL;
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, k;
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *res;
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!array_Check(v) || !array_Check(w)) {
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_NotImplemented);
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_NotImplemented;
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va = (arrayobject *)v;
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    wa = (arrayobject *)w;
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Shortcut: if the lengths differ, the arrays differ */
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (op == Py_EQ)
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = Py_False;
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = Py_True;
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(res);
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return res;
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Search for the first index where items are different */
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    k = 1;
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        vi = getarrayitem(v, i);
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        wi = getarrayitem(w, i);
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (vi == NULL || wi == NULL) {
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_XDECREF(vi);
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_XDECREF(wi);
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        k = PyObject_RichCompareBool(vi, wi, Py_EQ);
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (k == 0)
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break; /* Keeping vi and wi alive! */
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(vi);
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(wi);
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (k < 0)
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (k) {
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* No more items to compare -- compare sizes */
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t vs = Py_SIZE(va);
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t ws = Py_SIZE(wa);
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int cmp;
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (op) {
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_LT: cmp = vs <  ws; break;
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_LE: cmp = vs <= ws; break;
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_EQ: cmp = vs == ws; break;
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_NE: cmp = vs != ws; break;
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_GT: cmp = vs >  ws; break;
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_GE: cmp = vs >= ws; break;
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default: return NULL; /* cannot happen */
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (cmp)
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = Py_True;
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = Py_False;
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(res);
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return res;
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* We have an item that differs.  First, shortcuts for EQ/NE */
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op == Py_EQ) {
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_False);
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = Py_False;
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (op == Py_NE) {
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_True);
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = Py_True;
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Compare the final item again using the proper operator */
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = PyObject_RichCompare(vi, wi, op);
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(vi);
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(wi);
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return res;
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_length(arrayobject *a)
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(a);
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_item(arrayobject *a, Py_ssize_t i)
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i < 0 || i >= Py_SIZE(a)) {
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_IndexError, "array index out of range");
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return getarrayitem((PyObject *)a, i);
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayobject *np;
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ilow < 0)
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ilow = 0;
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (ilow > Py_SIZE(a))
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ilow = Py_SIZE(a);
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ihigh < 0)
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ihigh = 0;
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ihigh < ilow)
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ihigh = ilow;
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (ihigh > Py_SIZE(a))
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ihigh = Py_SIZE(a);
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (np == NULL)
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           (ihigh-ilow) * a->ob_descr->itemsize);
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)np;
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_copy(arrayobject *a, PyObject *unused)
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return array_slice(a, 0, Py_SIZE(a));
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(copy_doc,
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"copy(array)\n\
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Return a copy of the array.");
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_concat(arrayobject *a, PyObject *bb)
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t size;
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayobject *np;
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!array_Check(bb)) {
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             "can only append array (not \"%.200s\") to array",
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 Py_TYPE(bb)->tp_name);
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define b ((arrayobject *)bb)
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (a->ob_descr != b->ob_descr) {
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadArgument();
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size = Py_SIZE(a) + Py_SIZE(b);
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (np == NULL) {
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)np;
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef b
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_repeat(arrayobject *a, Py_ssize_t n)
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t size;
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayobject *np;
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p;
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t nbytes;
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n < 0)
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = 0;
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size = Py_SIZE(a) * n;
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (np == NULL)
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = np->ob_item;
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n; i++) {
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(p, a->ob_item, nbytes);
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p += nbytes;
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *) np;
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *item;
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n; /* Size of replacement array */
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t d; /* Change in size */
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define b ((arrayobject *)v)
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = 0;
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (array_Check(v)) {
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = Py_SIZE(b);
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (a == b) {
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Special case "a[i:j] = a" -- copy b first */
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int ret;
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            v = array_slice(b, 0, n);
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!v)
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return -1;
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ret = array_ass_slice(a, ilow, ihigh, v);
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(v);
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ret;
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (b->ob_descr != a->ob_descr) {
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_BadArgument();
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         "can only assign array (not \"%.200s\") to array slice",
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         Py_TYPE(v)->tp_name);
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ilow < 0)
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ilow = 0;
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (ilow > Py_SIZE(a))
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ilow = Py_SIZE(a);
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ihigh < 0)
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ihigh = 0;
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ihigh < ilow)
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ihigh = ilow;
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (ihigh > Py_SIZE(a))
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ihigh = Py_SIZE(a);
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    item = a->ob_item;
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d = n - (ihigh-ilow);
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (d < 0) { /* Delete -d items */
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memmove(item + (ihigh+d)*a->ob_descr->itemsize,
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            item + ihigh*a->ob_descr->itemsize,
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(a) += d;
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        /* Can't fail */
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a->ob_item = item;
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a->allocated = Py_SIZE(a);
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (d > 0) { /* Insert d items */
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_RESIZE(item, char,
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     (Py_SIZE(a) + d)*a->ob_descr->itemsize);
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (item == NULL) {
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_NoMemory();
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memmove(item + (ihigh+d)*a->ob_descr->itemsize,
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            item + ihigh*a->ob_descr->itemsize,
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a->ob_item = item;
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(a) += d;
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a->allocated = Py_SIZE(a);
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n > 0)
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               n*b->ob_descr->itemsize);
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef b
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i < 0 || i >= Py_SIZE(a)) {
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_IndexError,
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "array assignment index out of range");
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return array_ass_slice(a, i, i+1, v);
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (*a->ob_descr->setitem)(a, i, v);
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(array_Check(a));
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return array_ass_item((arrayobject *)a, i, v);
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_iter_extend(arrayobject *self, PyObject *bb)
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *it, *v;
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    it = PyObject_GetIter(bb);
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (it == NULL)
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while ((v = PyIter_Next(it)) != NULL) {
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (ins1(self, Py_SIZE(self), v) != 0) {
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(v);
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(it);
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(it);
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_Occurred())
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_do_extend(arrayobject *self, PyObject *bb)
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t size;
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *old_item;
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!array_Check(bb))
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return array_iter_extend(self, bb);
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define b ((arrayobject *)bb)
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (self->ob_descr != b->ob_descr) {
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "can only extend with array of same kind");
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_NoMemory();
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size = Py_SIZE(self) + Py_SIZE(b);
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    old_item = self->ob_item;
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (self->ob_item == NULL) {
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->ob_item = old_item;
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_NoMemory();
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_SIZE(self) = size;
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self->allocated = size;
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef b
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_inplace_concat(arrayobject *self, PyObject *bb)
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!array_Check(bb)) {
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "can only extend array with array (not \"%.200s\")",
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_TYPE(bb)->tp_name);
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (array_do_extend(self, bb) == -1)
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(self);
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)self;
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_inplace_repeat(arrayobject *self, Py_ssize_t n)
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *items, *p;
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t size, i;
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_SIZE(self) > 0) {
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (n < 0)
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = 0;
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        items = self->ob_item;
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ((self->ob_descr->itemsize != 0) &&
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyErr_NoMemory();
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size = Py_SIZE(self) * self->ob_descr->itemsize;
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (n == 0) {
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyMem_FREE(items);
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self->ob_item = NULL;
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_SIZE(self) = 0;
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self->allocated = 0;
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (size > PY_SSIZE_T_MAX / n) {
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyErr_NoMemory();
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyMem_RESIZE(items, char, n * size);
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (items == NULL)
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyErr_NoMemory();
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p = items;
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (i = 1; i < n; i++) {
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                p += size;
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                memcpy(p, items, size);
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self->ob_item = items;
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_SIZE(self) *= n;
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self->allocated = Py_SIZE(self);
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(self);
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)self;
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmins(arrayobject *self, Py_ssize_t where, PyObject *v)
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ins1(self, where, v) != 0)
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_count(arrayobject *self, PyObject *v)
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count = 0;
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < Py_SIZE(self); i++) {
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *selfi = getarrayitem((PyObject *)self, i);
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(selfi);
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (cmp > 0)
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            count++;
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (cmp < 0)
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(count);
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(count_doc,
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"count(x)\n\
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn number of occurrences of x in the array.");
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_index(arrayobject *self, PyObject *v)
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < Py_SIZE(self); i++) {
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *selfi = getarrayitem((PyObject *)self, i);
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(selfi);
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (cmp > 0) {
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyInt_FromLong((long)i);
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (cmp < 0)
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(index_doc,
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"index(x)\n\
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn index of first occurrence of x in the array.");
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_contains(arrayobject *self, PyObject *v)
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int cmp;
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *selfi = getarrayitem((PyObject *)self, i);
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(selfi);
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return cmp;
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_remove(arrayobject *self, PyObject *v)
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < Py_SIZE(self); i++) {
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *selfi = getarrayitem((PyObject *)self,i);
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(selfi);
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (cmp > 0) {
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (array_ass_slice(self, i, i+1,
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               (PyObject *)NULL) != 0)
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_INCREF(Py_None);
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Py_None;
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (cmp < 0)
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(remove_doc,
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"remove(x)\n\
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmRemove the first occurrence of x in the array.");
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_pop(arrayobject *self, PyObject *args)
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i = -1;
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|n:pop", &i))
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_SIZE(self) == 0) {
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Special-case most common failure cause */
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_IndexError, "pop from empty array");
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i < 0)
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i += Py_SIZE(self);
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i < 0 || i >= Py_SIZE(self)) {
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_IndexError, "pop index out of range");
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = getarrayitem((PyObject *)self,i);
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(pop_doc,
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"pop([i])\n\
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the i-th element and delete it from the array. i defaults to -1.");
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_extend(arrayobject *self, PyObject *bb)
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (array_do_extend(self, bb) == -1)
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(extend_doc,
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"extend(array or iterable)\n\
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Append items to the end of the array.");
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_insert(arrayobject *self, PyObject *args)
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ins(self, i, v);
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(insert_doc,
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"insert(i,x)\n\
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmInsert a new item x into the array before position i.");
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_buffer_info(arrayobject *self, PyObject *unused)
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject* retval = NULL;
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    retval = PyTuple_New(2);
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!retval)
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return retval;
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(buffer_info_doc,
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"buffer_info() -> (address, length)\n\
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a tuple (address, length) giving the current memory address and\n\
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe length in items of the buffer used to hold array's contents\n\
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe length should be multiplied by the itemsize attribute to calculate\n\
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe buffer length in bytes.");
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_append(arrayobject *self, PyObject *v)
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ins(self, Py_SIZE(self), v);
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(append_doc,
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"append(x)\n\
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAppend new value x to the end of the array.");
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_byteswap(arrayobject *self, PyObject *unused)
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p;
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (self->ob_descr->itemsize) {
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 1:
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 2:
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char p0 = p[0];
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[0] = p[1];
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[1] = p0;
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 4:
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char p0 = p[0];
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char p1 = p[1];
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[0] = p[3];
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[1] = p[2];
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[2] = p1;
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[3] = p0;
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 8:
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char p0 = p[0];
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char p1 = p[1];
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char p2 = p[2];
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char p3 = p[3];
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[0] = p[7];
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[1] = p[6];
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[2] = p[5];
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[3] = p[4];
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[4] = p3;
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[5] = p2;
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[6] = p1;
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p[7] = p0;
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_RuntimeError,
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "don't know how to byteswap this array type");
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(byteswap_doc,
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"byteswap()\n\
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmByteswap all items of the array.  If the items in the array are not 1, 2,\n\
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm4, or 8 bytes in size, RuntimeError is raised.");
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_reverse(arrayobject *self, PyObject *unused)
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register Py_ssize_t itemsize = self->ob_descr->itemsize;
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register char *p, *q;
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* little buffer to hold items while swapping */
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char tmp[256];      /* 8 is probably enough -- but why skimp */
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert((size_t)itemsize <= sizeof(tmp));
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_SIZE(self) > 1) {
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (p = self->ob_item,
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             p < q;
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             p += itemsize, q -= itemsize) {
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* memory areas guaranteed disjoint, so memcpy
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             * is safe (& memmove may be slower).
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             */
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(tmp, p, itemsize);
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(p, q, itemsize);
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(q, tmp, itemsize);
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(reverse_doc,
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"reverse()\n\
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReverse the order of the items in the array.");
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_fromfile(arrayobject *self, PyObject *args)
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *f;
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n;
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    FILE *fp;
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fp = PyFile_AsFile(f);
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (fp == NULL) {
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n > 0) {
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *item = self->ob_item;
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t itemsize = self->ob_descr->itemsize;
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size_t nread;
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t newlength;
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size_t newbytes;
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Be careful here about overflow */
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ((newlength = Py_SIZE(self) + n) <= 0 ||
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (newbytes = newlength * itemsize) / itemsize !=
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (size_t)newlength)
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto nomem;
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_RESIZE(item, char, newbytes);
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (item == NULL) {
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          nomem:
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_NoMemory();
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->ob_item = item;
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(self) += n;
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->allocated = Py_SIZE(self);
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        nread = fread(item + (Py_SIZE(self) - n) * itemsize,
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      itemsize, n, fp);
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (nread < (size_t)n) {
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          Py_SIZE(self) -= (n - nread);
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self->ob_item = item;
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self->allocated = Py_SIZE(self);
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (ferror(fp)) {
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetFromErrno(PyExc_IOError);
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                clearerr(fp);
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_EOFError,
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "not enough items in file");
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(fromfile_doc,
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"fromfile(f, n)\n\
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmRead n objects from the file object f and append them to the end of the\n\
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray.  Also called as read.");
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_fromfile_as_read(arrayobject *self, PyObject *args)
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       "use array.fromfile()", 1) < 0)
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return array_fromfile(self, args);
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_tofile(arrayobject *self, PyObject *f)
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    FILE *fp;
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fp = PyFile_AsFile(f);
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (fp == NULL) {
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError, "arg must be open file");
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (self->ob_size > 0) {
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (fwrite(self->ob_item, self->ob_descr->itemsize,
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   self->ob_size, fp) != (size_t)self->ob_size) {
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetFromErrno(PyExc_IOError);
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            clearerr(fp);
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(tofile_doc,
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"tofile(f)\n\
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWrite all items (as machine values) to the file object f.  Also called as\n\
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwrite.");
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_tofile_as_write(arrayobject *self, PyObject *f)
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       "use array.tofile()", 1) < 0)
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return array_tofile(self, f);
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_fromlist(arrayobject *self, PyObject *list)
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n;
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t itemsize = self->ob_descr->itemsize;
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyList_Check(list)) {
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError, "arg must be list");
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = PyList_Size(list);
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n > 0) {
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *item = self->ob_item;
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t i;
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (item == NULL) {
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_NoMemory();
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->ob_item = item;
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(self) += n;
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->allocated = Py_SIZE(self);
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < n; i++) {
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *v = PyList_GetItem(list, i);
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if ((*self->ob_descr->setitem)(self,
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Py_SIZE(self) - n + i, v) != 0) {
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_SIZE(self) -= n;
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return PyErr_NoMemory();
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyMem_RESIZE(item, char,
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  Py_SIZE(self) * itemsize);
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self->ob_item = item;
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self->allocated = Py_SIZE(self);
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(fromlist_doc,
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"fromlist(list)\n\
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAppend items to array from list.");
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_tolist(arrayobject *self, PyObject *unused)
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *list = PyList_New(Py_SIZE(self));
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (list == NULL)
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < Py_SIZE(self); i++) {
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *v = getarrayitem((PyObject *)self, i);
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (v == NULL) {
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(list);
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyList_SetItem(list, i, v);
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return list;
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(tolist_doc,
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"tolist() -> list\n\
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert array to an ordinary list with the same items.");
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_fromstring(arrayobject *self, PyObject *args)
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *str;
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n;
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int itemsize = self->ob_descr->itemsize;
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n % itemsize != 0) {
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "string length not a multiple of item size");
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = n / itemsize;
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n > 0) {
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *item = self->ob_item;
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyErr_NoMemory();
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (item == NULL) {
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_NoMemory();
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->ob_item = item;
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(self) += n;
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->allocated = Py_SIZE(self);
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(item + (Py_SIZE(self) - n) * itemsize,
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               str, itemsize*n);
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(fromstring_doc,
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"fromstring(string)\n\
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAppends items from the string, interpreting it as an array of machine\n\
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvalues,as if it had been read from a file using the fromfile() method).");
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_tostring(arrayobject *self, PyObject *unused)
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromStringAndSize(self->ob_item,
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Py_SIZE(self) * self->ob_descr->itemsize);
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(tostring_doc,
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"tostring() -> string\n\
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert the array to an array of machine values and return the string\n\
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrepresentation.");
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_fromunicode(arrayobject *self, PyObject *args)
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_UNICODE *ustr;
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n;
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (self->ob_descr->typecode != 'u') {
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "fromunicode() may only be called on "
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "type 'u' arrays");
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n > 0) {
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyErr_NoMemory();
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (item == NULL) {
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_NoMemory();
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->ob_item = (char *) item;
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(self) += n;
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self->allocated = Py_SIZE(self);
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(item + Py_SIZE(self) - n,
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               ustr, n * sizeof(Py_UNICODE));
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(fromunicode_doc,
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"fromunicode(ustr)\n\
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmExtends this array with data from the unicode string ustr.\n\
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe array must be a type 'u' array; otherwise a ValueError\n\
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis raised.  Use array.fromstring(ustr.decode(...)) to\n\
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmappend Unicode data to an array of some other type.");
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_tounicode(arrayobject *self, PyObject *unused)
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (self->ob_descr->typecode != 'u') {
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "tounicode() may only be called on type 'u' arrays");
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(tounicode_doc,
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"tounicode() -> unicode\n\
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert the array to a unicode string.  The array must be\n\
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma type 'u' array; otherwise a ValueError is raised.  Use\n\
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray.tostring().decode() to obtain a unicode string from\n\
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylman array of some other type.");
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_USING_UNICODE */
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_reduce(arrayobject *array)
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *dict, *result, *list;
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (dict == NULL) {
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dict = Py_None;
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(dict);
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Unlike in Python 3.x, we never use the more efficient memory
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * representation of an array for pickling.  This is unfortunately
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * necessary to allow array objects to be unpickled by Python 3.x,
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * since str objects from 2.x are always decoded to unicode in
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * Python 3.x.
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    list = array_tolist(array, NULL);
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (list == NULL) {
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(dict);
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = Py_BuildValue(
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "O(cO)O", Py_TYPE(array), array->ob_descr->typecode, list, dict);
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(list);
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(dict);
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_get_typecode(arrayobject *a, void *closure)
15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char tc = a->ob_descr->typecode;
15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromStringAndSize(&tc, 1);
15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_get_itemsize(arrayobject *a, void *closure)
15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long)a->ob_descr->itemsize);
15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyGetSetDef array_getsets [] = {
15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"typecode", (getter) array_get_typecode, NULL,
15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "the typecode character used to create the array"},
15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"itemsize", (getter) array_get_itemsize, NULL,
15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "the size, in bytes, of one array item"},
15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL}
15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef array_methods[] = {
15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"append",          (PyCFunction)array_append,      METH_O,
15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     append_doc},
15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     buffer_info_doc},
15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"byteswap",        (PyCFunction)array_byteswap,    METH_NOARGS,
15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     byteswap_doc},
15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"__copy__",        (PyCFunction)array_copy,        METH_NOARGS,
15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     copy_doc},
15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"count",           (PyCFunction)array_count,       METH_O,
15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     count_doc},
15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"__deepcopy__",(PyCFunction)array_copy,            METH_O,
15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     copy_doc},
15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"extend",      (PyCFunction)array_extend,          METH_O,
15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     extend_doc},
15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"fromfile",        (PyCFunction)array_fromfile,    METH_VARARGS,
15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     fromfile_doc},
15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"fromlist",        (PyCFunction)array_fromlist,    METH_O,
15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     fromlist_doc},
15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"fromstring",      (PyCFunction)array_fromstring,  METH_VARARGS,
15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     fromstring_doc},
15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"fromunicode",     (PyCFunction)array_fromunicode, METH_VARARGS,
15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     fromunicode_doc},
15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"index",           (PyCFunction)array_index,       METH_O,
15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     index_doc},
15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"insert",          (PyCFunction)array_insert,      METH_VARARGS,
15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     insert_doc},
15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"pop",             (PyCFunction)array_pop,         METH_VARARGS,
15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     pop_doc},
15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"read",            (PyCFunction)array_fromfile_as_read,    METH_VARARGS,
15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     fromfile_doc},
15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"__reduce__",      (PyCFunction)array_reduce,      METH_NOARGS,
15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     reduce_doc},
15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"remove",          (PyCFunction)array_remove,      METH_O,
15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     remove_doc},
15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"reverse",         (PyCFunction)array_reverse,     METH_NOARGS,
15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     reverse_doc},
15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*      {"sort",        (PyCFunction)array_sort,        METH_VARARGS,
15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sort_doc},*/
15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"tofile",          (PyCFunction)array_tofile,      METH_O,
15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     tofile_doc},
15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"tolist",          (PyCFunction)array_tolist,      METH_NOARGS,
16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     tolist_doc},
16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"tostring",        (PyCFunction)array_tostring,    METH_NOARGS,
16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     tostring_doc},
16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"tounicode",   (PyCFunction)array_tounicode,       METH_NOARGS,
16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     tounicode_doc},
16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"write",           (PyCFunction)array_tofile_as_write,     METH_O,
16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     tofile_doc},
16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL,              NULL}           /* sentinel */
16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_repr(arrayobject *a)
16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[256], typecode;
16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *s, *t, *v = NULL;
16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len;
16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    len = Py_SIZE(a);
16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    typecode = a->ob_descr->typecode;
16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (len == 0) {
16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromString(buf);
16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (typecode == 'c')
16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = array_tostring(a, NULL);
16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (typecode == 'u')
16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = array_tounicode(a, NULL);
16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = array_tolist(a, NULL);
16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    t = PyObject_Repr(v);
16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(v);
16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = PyString_FromString(buf);
16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyString_ConcatAndDel(&s, t);
16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyString_ConcatAndDel(&s, PyString_FromString(")"));
16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s;
16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_subscr(arrayobject* self, PyObject* item)
16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyIndex_Check(item)) {
16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i==-1 && PyErr_Occurred()) {
16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i < 0)
16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i += Py_SIZE(self);
16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return array_item(self, i);
16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PySlice_Check(item)) {
16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t start, stop, step, slicelength, cur, i;
16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject* result;
16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        arrayobject* ar;
16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int itemsize = self->ob_descr->itemsize;
16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         &start, &stop, &step, &slicelength) < 0) {
16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (slicelength <= 0) {
16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return newarrayobject(&Arraytype, 0, self->ob_descr);
16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (step == 1) {
16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *result = newarrayobject(&Arraytype,
16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    slicelength, self->ob_descr);
16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (result == NULL)
16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(((arrayobject *)result)->ob_item,
16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   self->ob_item + start * itemsize,
16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   slicelength * itemsize);
16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return result;
16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!result) return NULL;
16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ar = (arrayobject*)result;
16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (cur = start, i = 0; i < slicelength;
16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 cur += step, i++) {
16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                memcpy(ar->ob_item + i*itemsize,
16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       self->ob_item + cur*itemsize,
16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       itemsize);
16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return result;
16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "array indices must be integers");
16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t start, stop, step, slicelength, needed;
17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayobject* other;
17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int itemsize;
17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyIndex_Check(item)) {
17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i == -1 && PyErr_Occurred())
17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i < 0)
17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i += Py_SIZE(self);
17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i < 0 || i >= Py_SIZE(self)) {
17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_IndexError,
17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "array assignment index out of range");
17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (value == NULL) {
17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Fall through to slice assignment */
17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start = i;
17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            stop = i + 1;
17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            step = 1;
17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            slicelength = 1;
17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (*self->ob_descr->setitem)(self, i, value);
17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PySlice_Check(item)) {
17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PySlice_GetIndicesEx((PySliceObject *)item,
17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 Py_SIZE(self), &start, &stop,
17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 &step, &slicelength) < 0) {
17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "array indices must be integer");
17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == NULL) {
17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        other = NULL;
17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        needed = 0;
17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (array_Check(value)) {
17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        other = (arrayobject *)value;
17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        needed = Py_SIZE(other);
17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (self == other) {
17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Special case "self[i:j] = self" -- copy self first */
17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int ret;
17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            value = array_slice(other, 0, needed);
17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (value == NULL)
17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return -1;
17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ret = array_ass_subscr(self, item, value);
17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(value);
17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ret;
17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (other->ob_descr != self->ob_descr) {
17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_BadArgument();
17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         "can only assign array (not \"%.200s\") to array slice",
17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         Py_TYPE(value)->tp_name);
17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    itemsize = self->ob_descr->itemsize;
17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((step > 0 && stop < start) ||
17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (step < 0 && stop > start))
17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        stop = start;
17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (step == 1) {
17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (slicelength > needed) {
17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memmove(self->ob_item + (start + needed) * itemsize,
17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self->ob_item + stop * itemsize,
17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (Py_SIZE(self) - stop) * itemsize);
17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (array_resize(self, Py_SIZE(self) +
17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             needed - slicelength) < 0)
17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return -1;
17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (slicelength < needed) {
17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (array_resize(self, Py_SIZE(self) +
17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             needed - slicelength) < 0)
17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return -1;
17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memmove(self->ob_item + (start + needed) * itemsize,
17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self->ob_item + stop * itemsize,
17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (Py_SIZE(self) - start - needed) * itemsize);
17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (needed > 0)
17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(self->ob_item + start * itemsize,
17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   other->ob_item, needed * itemsize);
17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (needed == 0) {
18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Delete slice */
18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size_t cur;
18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t i;
18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (step < 0) {
18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            stop = start + 1;
18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start = stop + step * (slicelength - 1) - 1;
18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            step = -step;
18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (cur = start, i = 0; i < slicelength;
18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             cur += step, i++) {
18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_ssize_t lim = step - 1;
18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (cur + step >= (size_t)Py_SIZE(self))
18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                lim = Py_SIZE(self) - cur - 1;
18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memmove(self->ob_item + (cur - i) * itemsize,
18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self->ob_item + (cur + 1) * itemsize,
18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                lim * itemsize);
18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cur = start + slicelength * step;
18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (cur < (size_t)Py_SIZE(self)) {
18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memmove(self->ob_item + (cur-slicelength) * itemsize,
18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self->ob_item + cur * itemsize,
18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (Py_SIZE(self) - cur) * itemsize);
18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t cur, i;
18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (needed != slicelength) {
18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_ValueError,
18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "attempt to assign array of size %zd "
18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "to extended slice of size %zd",
18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                needed, slicelength);
18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (cur = start, i = 0; i < slicelength;
18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             cur += step, i++) {
18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(self->ob_item + cur * itemsize,
18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   other->ob_item + i * itemsize,
18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   itemsize);
18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMappingMethods array_as_mapping = {
18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (lenfunc)array_length,
18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (binaryfunc)array_subscr,
18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (objobjargproc)array_ass_subscr
18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const void *emptybuf = "";
18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( index != 0 ) {
18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_SystemError,
18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "Accessing non-existent array segment");
18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *ptr = (void *)self->ob_item;
18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (*ptr == NULL)
18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *ptr = emptybuf;
18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(self)*self->ob_descr->itemsize;
18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( index != 0 ) {
18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_SystemError,
18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "Accessing non-existent array segment");
18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *ptr = (void *)self->ob_item;
18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (*ptr == NULL)
18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *ptr = emptybuf;
18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(self)*self->ob_descr->itemsize;
18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( lenp )
18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PySequenceMethods array_as_sequence = {
18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (lenfunc)array_length,                      /*sq_length*/
18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (binaryfunc)array_concat,               /*sq_concat*/
18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizeargfunc)array_repeat,                 /*sq_repeat*/
18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizeargfunc)array_item,                           /*sq_item*/
18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizessizeargfunc)array_slice,             /*sq_slice*/
18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizeobjargproc)array_ass_item,                    /*sq_ass_item*/
19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizessizeobjargproc)array_ass_slice,      /*sq_ass_slice*/
19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (objobjproc)array_contains,                 /*sq_contains*/
19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (binaryfunc)array_inplace_concat,           /*sq_inplace_concat*/
19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizeargfunc)array_inplace_repeat          /*sq_inplace_repeat*/
19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyBufferProcs array_as_buffer = {
19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (readbufferproc)array_buffer_getreadbuf,
19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (writebufferproc)array_buffer_getwritebuf,
19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (segcountproc)array_buffer_getsegcount,
19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    NULL,
19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char c;
19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *initial = NULL, *it = NULL;
19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct arraydescr *descr;
19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!(initial == NULL || PyList_Check(initial)
19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          || PyString_Check(initial) || PyTuple_Check(initial)
19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          || (c == 'u' && PyUnicode_Check(initial)))) {
19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        it = PyObject_GetIter(initial);
19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (it == NULL)
19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* We set initial to NULL so that the subsequent code
19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           will create an empty array of the appropriate type
19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           and afterwards we can use array_iter_extend to populate
19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           the array.
19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        */
19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        initial = NULL;
19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (descr = descriptors; descr->typecode != '\0'; descr++) {
19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (descr->typecode == c) {
19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *a;
19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_ssize_t len;
19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (initial == NULL || !(PyList_Check(initial)
19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                || PyTuple_Check(initial)))
19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = 0;
19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = PySequence_Size(initial);
19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            a = newarrayobject(type, len, descr);
19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (a == NULL)
19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (len > 0) {
19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_ssize_t i;
19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (i = 0; i < len; i++) {
19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyObject *v =
19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PySequence_GetItem(initial, i);
19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (v == NULL) {
19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_DECREF(a);
19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (setarrayitem(a, i, v) != 0) {
19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_DECREF(v);
19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_DECREF(a);
19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(v);
19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else if (initial != NULL && PyString_Check(initial)) {
19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyObject *t_initial, *v;
19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                t_initial = PyTuple_Pack(1, initial);
19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (t_initial == NULL) {
19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(a);
19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                v = array_fromstring((arrayobject *)a,
19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                         t_initial);
19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(t_initial);
19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (v == NULL) {
19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(a);
19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(v);
19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else if (initial != NULL && PyUnicode_Check(initial))  {
19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (n > 0) {
19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    arrayobject *self = (arrayobject *)a;
19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    char *item = self->ob_item;
19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    item = (char *)PyMem_Realloc(item, n);
19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (item == NULL) {
19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyErr_NoMemory();
19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_DECREF(a);
19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self->ob_item = item;
19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_SIZE(self) = n / sizeof(Py_UNICODE);
19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    memcpy(item, PyUnicode_AS_DATA(initial), n);
20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self->allocated = Py_SIZE(self);
20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (it != NULL) {
20054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (array_iter_extend((arrayobject *)a, it) == -1) {
20064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(it);
20074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(a);
20084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
20104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(it);
20114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return a;
20134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
20144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_ValueError,
20164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
20174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
20184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
20194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(module_doc,
20224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"This module defines an object type which can efficiently represent\n\
20234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylman array of basic values: characters, integers, floating point\n\
20244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnumbers.  Arrays are sequence types and behave very much like lists,\n\
20254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept that the type of objects stored in them is constrained.  The\n\
20264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtype is specified at object creation time by using a type code, which\n\
20274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis a single character.  The following type codes are defined:\n\
20284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Type code   C Type             Minimum size in bytes \n\
20304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'c'         character          1 \n\
20314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'b'         signed integer     1 \n\
20324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'B'         unsigned integer   1 \n\
20334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'u'         Unicode character  2 \n\
20344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'h'         signed integer     2 \n\
20354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'H'         unsigned integer   2 \n\
20364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'i'         signed integer     2 \n\
20374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'I'         unsigned integer   2 \n\
20384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'l'         signed integer     4 \n\
20394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'L'         unsigned integer   4 \n\
20404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'f'         floating point     4 \n\
20414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'd'         floating point     8 \n\
20424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe constructor is:\n\
20444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray(typecode [, initializer]) -- create a new array\n\
20464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm");
20474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(arraytype_doc,
20494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"array(typecode [, initializer]) -> array\n\
20504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a new array whose items are restricted by typecode, and\n\
20524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitialized from the optional initializer value, which must be a list,\n\
20534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring. or iterable over elements of the appropriate type.\n\
20544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmArrays represent basic values and behave very much like lists, except\n\
20564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe type of objects stored in them is constrained.\n\
20574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmMethods:\n\
20594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmappend() -- append a new item to the end of the array\n\
20614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbuffer_info() -- return information giving the current memory info\n\
20624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbyteswap() -- byteswap all the items of the array\n\
20634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcount() -- return number of occurrences of an object\n\
20644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextend() -- extend array by appending multiple elements from an iterable\n\
20654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfromfile() -- read items from a file object\n\
20664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfromlist() -- append items from the list\n\
20674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfromstring() -- append items from the string\n\
20684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmindex() -- return index of first occurrence of an object\n\
20694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminsert() -- insert a new item into the array at a provided position\n\
20704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpop() -- remove and return item (default last)\n\
20714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmread() -- DEPRECATED, use fromfile()\n\
20724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmremove() -- remove first occurrence of an object\n\
20734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreverse() -- reverse the order of the items in the array\n\
20744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtofile() -- write all items to a file object\n\
20754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtolist() -- return the array converted to an ordinary list\n\
20764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtostring() -- return the array converted to a string\n\
20774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwrite() -- DEPRECATED, use tofile()\n\
20784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAttributes:\n\
20804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypecode -- the typecode character used to create the array\n\
20824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmitemsize -- the length in bytes of one array item\n\
20834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm");
20844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *array_iter(arrayobject *ao);
20864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject Arraytype = {
20884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyVarObject_HEAD_INIT(NULL, 0)
20894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "array.array",
20904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sizeof(arrayobject),
20914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
20924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (destructor)array_dealloc,                  /* tp_dealloc */
20934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_print */
20944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getattr */
20954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattr */
20964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_compare */
20974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (reprfunc)array_repr,                       /* tp_repr */
20984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_number*/
20994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &array_as_sequence,                         /* tp_as_sequence*/
21004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &array_as_mapping,                          /* tp_as_mapping*/
21014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_hash */
21024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_call */
21034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_str */
21044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericGetAttr,                    /* tp_getattro */
21054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattro */
21064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &array_as_buffer,                           /* tp_as_buffer*/
21074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,  /* tp_flags */
21084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arraytype_doc,                              /* tp_doc */
21094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_traverse */
21104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_clear */
21114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    array_richcompare,                          /* tp_richcompare */
21124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    offsetof(arrayobject, weakreflist),         /* tp_weaklistoffset */
21134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (getiterfunc)array_iter,                    /* tp_iter */
21144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_iternext */
21154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    array_methods,                              /* tp_methods */
21164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_members */
21174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    array_getsets,                              /* tp_getset */
21184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_base */
21194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dict */
21204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_get */
21214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_set */
21224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dictoffset */
21234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_init */
21244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyType_GenericAlloc,                        /* tp_alloc */
21254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    array_new,                                  /* tp_new */
21264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_Del,                               /* tp_free */
21274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
21284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*********************** Array Iterator **************************/
21314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
21334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_HEAD
21344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t                          index;
21354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayobject                 *ao;
21364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject                    * (*getitem)(struct arrayobject *, Py_ssize_t);
21374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} arrayiterobject;
21384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject PyArrayIter_Type;
21404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
21424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarray_iter(arrayobject *ao)
21454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arrayiterobject *it;
21474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!array_Check(ao)) {
21494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadInternalCall();
21504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
21544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (it == NULL)
21554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(ao);
21584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    it->ao = ao;
21594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    it->index = 0;
21604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    it->getitem = ao->ob_descr->getitem;
21614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GC_Track(it);
21624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)it;
21634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarrayiter_next(arrayiterobject *it)
21674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(PyArrayIter_Check(it));
21694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (it->index < Py_SIZE(it->ao))
21704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (*it->getitem)(it->ao, it->index++);
21714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
21724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
21754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarrayiter_dealloc(arrayiterobject *it)
21764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GC_UnTrack(it);
21784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(it->ao);
21794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GC_Del(it);
21804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
21834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
21844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_VISIT(it->ao);
21864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
21874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject PyArrayIter_Type = {
21904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyVarObject_HEAD_INIT(NULL, 0)
21914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "arrayiterator",                        /* tp_name */
21924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sizeof(arrayiterobject),                /* tp_basicsize */
21934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_itemsize */
21944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* methods */
21954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (destructor)arrayiter_dealloc,              /* tp_dealloc */
21964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_print */
21974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_getattr */
21984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_setattr */
21994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_compare */
22004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_repr */
22014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_as_number */
22024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_as_sequence */
22034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_as_mapping */
22044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_hash */
22054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_call */
22064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_str */
22074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericGetAttr,                /* tp_getattro */
22084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_setattro */
22094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_as_buffer */
22104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
22114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_doc */
22124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (traverseproc)arrayiter_traverse,           /* tp_traverse */
22134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_clear */
22144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_richcompare */
22154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                      /* tp_weaklistoffset */
22164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_SelfIter,                          /* tp_iter */
22174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (iternextfunc)arrayiter_next,               /* tp_iternext */
22184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_methods */
22194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
22204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*********************** Install Module **************************/
22234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* No functions in array module. */
22254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef a_methods[] = {
22264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL, NULL, 0, NULL}        /* Sentinel */
22274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
22284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyMODINIT_FUNC
22314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitarray(void)
22324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
22334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *m;
22344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Arraytype.ob_type = &PyType_Type;
22364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyArrayIter_Type.ob_type = &PyType_Type;
22374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    m = Py_InitModule3("array", a_methods, module_doc);
22384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (m == NULL)
22394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
22404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF((PyObject *)&Arraytype);
22424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
22434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF((PyObject *)&Arraytype);
22444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
22454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* No need to check the error here, the caller will do that */
22464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2247