1778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Array object implementation */
2778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
3778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* An array is a uniform list -- all items have the same type.
4778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum   The item type is restricted to simple C types like int or float */
5778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#define PY_SSIZE_T_CLEAN
72919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse#include "Python.h"
8cb87bc8e7ee3a2ffd83dd1b12fcfa1c01aa740aaRaymond Hettinger#include "structmember.h"
95817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse
100c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#ifdef STDC_HEADERS
110c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#include <stddef.h>
127f1de832a21df9048041405b6ca624c91fd98e58Guido van Rossum#else /* !STDC_HEADERS */
130e8bd7e1ccf7f47bc0bb920af899c77669016d3dMartin v. Löwis#ifdef HAVE_SYS_TYPES_H
14c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#include <sys/types.h>          /* For size_t */
150e8bd7e1ccf7f47bc0bb920af899c77669016d3dMartin v. Löwis#endif /* HAVE_SYS_TYPES_H */
167f1de832a21df9048041405b6ca624c91fd98e58Guido van Rossum#endif /* !STDC_HEADERS */
17778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
18778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arrayobject; /* Forward */
19778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
20bb307343e4d2f2781249e560090260d121607626Tim Peters/* All possible arraydescr values are defined in the vector "descriptors"
21bb307343e4d2f2781249e560090260d121607626Tim Peters * below.  That's defined later because the appropriate get and set
22bb307343e4d2f2781249e560090260d121607626Tim Peters * functions aren't visible yet.
23bb307343e4d2f2781249e560090260d121607626Tim Peters */
24778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arraydescr {
25c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int typecode;
26c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int itemsize;
27c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
29778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
30778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
31778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumtypedef struct arrayobject {
32c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_VAR_HEAD
33c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *ob_item;
34c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t allocated;
35c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct arraydescr *ob_descr;
36c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *weakreflist; /* List of weak references */
37778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} arrayobject;
38778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
39938ace69a0e112424a2f426a4881d1fd1fc922d2Jeremy Hyltonstatic PyTypeObject Arraytype;
40778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
4199866336094bd432860d32dd368f5934683939e7Martin v. Löwis#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
42e93237dfcc4ee4feee62adafb4e7899487ca864bChristian Heimes#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
43778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
446e2ee866fa5cac9de821921a31ad4ba76dfde8d9Raymond Hettingerstatic int
4518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_resize(arrayobject *self, Py_ssize_t newsize)
466e2ee866fa5cac9de821921a31ad4ba76dfde8d9Raymond Hettinger{
47c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *items;
48c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size_t _new_size;
49c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
50c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Bypass realloc() when a previous overallocation is large enough
51c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       to accommodate the newsize.  If the newsize is 16 smaller than the
52c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       current size, then proceed with the realloc() to shrink the list.
53c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    */
54c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
55c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->allocated >= newsize &&
56c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) < newsize + 16 &&
57c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item != NULL) {
58c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) = newsize;
59c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
60c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
61c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
62c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* This over-allocates proportional to the array size, making room
63c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * for additional growth.  The over-allocation is mild, but is
64c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * enough to give linear-time amortized behavior over a long
65c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * sequence of appends() in the presence of a poorly-performing
66c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * system realloc().
67c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * The growth pattern is:  0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
68c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * Note, the pattern starts out the same as for lists but then
69c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * grows at a smaller rate so that larger arrays only overallocate
70c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * by about 1/16th -- this is done because arrays are presumed to be more
71c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * memory critical.
72c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     */
73c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
74c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
75c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    items = self->ob_item;
76c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX The following multiplication and division does not optimize away
77c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       like it does for lists since the size is not known at compile time */
78c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
79c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
80c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
81c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        items = NULL;
82c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (items == NULL) {
83c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
84c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
85c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
86c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    self->ob_item = items;
87c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_SIZE(self) = newsize;
88c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    self->allocated = _new_size;
89c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
906e2ee866fa5cac9de821921a31ad4ba76dfde8d9Raymond Hettinger}
916e2ee866fa5cac9de821921a31ad4ba76dfde8d9Raymond Hettinger
92bb307343e4d2f2781249e560090260d121607626Tim Peters/****************************************************************************
93bb307343e4d2f2781249e560090260d121607626Tim PetersGet and Set functions for each type.
94bb307343e4d2f2781249e560090260d121607626Tim PetersA Get function takes an arrayobject* and an integer index, returning the
95bb307343e4d2f2781249e560090260d121607626Tim Petersarray value at that index wrapped in an appropriate PyObject*.
96bb307343e4d2f2781249e560090260d121607626Tim PetersA Set function takes an arrayobject, integer index, and PyObject*; sets
97bb307343e4d2f2781249e560090260d121607626Tim Petersthe array value at that index to the raw C data extracted from the PyObject*,
98bb307343e4d2f2781249e560090260d121607626Tim Petersand returns 0 if successful, else nonzero on failure (PyObject* not of an
99bb307343e4d2f2781249e560090260d121607626Tim Petersappropriate type or value).
100bb307343e4d2f2781249e560090260d121607626Tim PetersNote that the basic Get and Set functions do NOT check that the index is
101bb307343e4d2f2781249e560090260d121607626Tim Petersin bounds; that's the responsibility of the caller.
102bb307343e4d2f2781249e560090260d121607626Tim Peters****************************************************************************/
103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
10518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisc_getitem(arrayobject *ap, Py_ssize_t i)
106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
107c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
11118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisc_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
113c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char x;
114c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "c;array item must be char", &x))
115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
117c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((char *)ap->ob_item)[i] = x;
118c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1212919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
12218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisb_getitem(arrayobject *ap, Py_ssize_t i)
123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    long x = ((char *)ap->ob_item)[i];
125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (x >= 128)
126c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        x -= 256;
127c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong(x);
128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
13118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisb_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    short x;
134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       must use the next size up that is signed ('h') and manually do
136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       the overflow checking */
137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "h;array item must be integer", &x))
138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (x < -128) {
140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_OverflowError,
141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "signed char is less than minimum");
142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
143c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (x > 127) {
145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_OverflowError,
146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "signed char is greater than maximum");
147c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
148c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
149c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
150c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((char *)ap->ob_item)[i] = (char)x;
151c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
152778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
153778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1542919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
15518e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisBB_getitem(arrayobject *ap, Py_ssize_t i)
156549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum{
157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    long x = ((unsigned char *)ap->ob_item)[i];
158c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong(x);
159549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum}
160549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
161541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drakestatic int
16218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisBB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
163541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake{
164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned char x;
165c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
166c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "b;array item must be integer", &x))
167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
169c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((char *)ap->ob_item)[i] = x;
170c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
171541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake}
172549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
17399866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
17499866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
17518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisu_getitem(arrayobject *ap, Py_ssize_t i)
17699866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
177c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
17899866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
17999866336094bd432860d32dd368f5934683939e7Martin v. Löwis
18099866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic int
18118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisu_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
18299866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
183c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_UNICODE *p;
184c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t len;
18599866336094bd432860d32dd368f5934683939e7Martin v. Löwis
186c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
188c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (len != 1) {
189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "array item must be unicode character");
191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
19699866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
19799866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
19899866336094bd432860d32dd368f5934683939e7Martin v. Löwis
199549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossumstatic PyObject *
20018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwish_getitem(arrayobject *ap, Py_ssize_t i)
201778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
203778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
204778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
205778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
20618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwish_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
207778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
208c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    short x;
209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "h;array item must be integer", &x))
211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 ((short *)ap->ob_item)[i] = x;
214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
215778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
216778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
2172919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
21818e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisHH_getitem(arrayobject *ap, Py_ssize_t i)
219549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum{
220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
221549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum}
222549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
223541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drakestatic int
22418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisHH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
225541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake{
226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int x;
227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* PyArg_Parse's 'h' formatter is for a signed short, therefore
228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       must use the next size up and manually do the overflow checking */
229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "i;array item must be integer", &x))
230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (x < 0) {
232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_OverflowError,
233c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "unsigned short is less than minimum");
234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (x > USHRT_MAX) {
237c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_OverflowError,
238c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "unsigned short is greater than maximum");
239c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
240c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
241c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((short *)ap->ob_item)[i] = (short)x;
243c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
244541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake}
245549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
246549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossumstatic PyObject *
24718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisi_getitem(arrayobject *ap, Py_ssize_t i)
248e77a757094f68351f336044654cd91575c677896Guido van Rossum{
249c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
250e77a757094f68351f336044654cd91575c677896Guido van Rossum}
251e77a757094f68351f336044654cd91575c677896Guido van Rossum
252e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic int
25318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisi_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
254e77a757094f68351f336044654cd91575c677896Guido van Rossum{
255c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int x;
256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
257c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "i;array item must be integer", &x))
258c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
259c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
260c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 ((int *)ap->ob_item)[i] = x;
261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
262e77a757094f68351f336044654cd91575c677896Guido van Rossum}
263e77a757094f68351f336044654cd91575c677896Guido van Rossum
2642919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
26518e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisII_getitem(arrayobject *ap, Py_ssize_t i)
266549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum{
267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyLong_FromUnsignedLong(
268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        (unsigned long) ((unsigned int *)ap->ob_item)[i]);
269549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum}
270549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
271549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossumstatic int
27218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisII_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
273549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum{
274c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned long x;
275c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyLong_Check(v)) {
276c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        x = PyLong_AsUnsignedLong(v);
277c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (x == (unsigned long) -1 && PyErr_Occurred())
278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        long y;
282c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!PyArg_Parse(v, "l;array item must be integer", &y))
283c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
284c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (y < 0) {
285c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_OverflowError,
286c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "unsigned int is less than minimum");
287c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        x = (unsigned long)y;
290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (x > UINT_MAX) {
293c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_OverflowError,
294c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "unsigned int is greater than maximum");
295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
301549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum}
302549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
303549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossumstatic PyObject *
30418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisl_getitem(arrayobject *ap, Py_ssize_t i)
305778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong(((long *)ap->ob_item)[i]);
307778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
308778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
309778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
31018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisl_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
311778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    long x;
313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "l;array item must be integer", &x))
314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
316c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 ((long *)ap->ob_item)[i] = x;
317c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
318778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
319778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
3202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
32118e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisLL_getitem(arrayobject *ap, Py_ssize_t i)
322549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum{
323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
324549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum}
325549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
326549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossumstatic int
32718e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisLL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
328549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum{
329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned long x;
330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyLong_Check(v)) {
331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        x = PyLong_AsUnsignedLong(v);
332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (x == (unsigned long) -1 && PyErr_Occurred())
333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        long y;
337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!PyArg_Parse(v, "l;array item must be integer", &y))
338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (y < 0) {
340c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_OverflowError,
341c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "unsigned long is less than minimum");
342c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
343c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        x = (unsigned long)y;
345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (x > ULONG_MAX) {
348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_OverflowError,
349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "unsigned long is greater than maximum");
350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
352c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
354c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((unsigned long *)ap->ob_item)[i] = x;
355c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
356549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum}
357549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossum
358549ab711aad1e8e342b79d3aa74b62f397afbbe7Guido van Rossumstatic PyObject *
35918e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisf_getitem(arrayobject *ap, Py_ssize_t i)
360778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
362778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
363778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
364778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
36518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisf_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
366778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
367c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    float x;
368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "f;array item must be float", &x))
369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
370c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
371c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 ((float *)ap->ob_item)[i] = x;
372c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
373778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
374778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
3752919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
37618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisd_getitem(arrayobject *ap, Py_ssize_t i)
377778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
378c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
379778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
380778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
381778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
38218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisd_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
383778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
384c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    double x;
385c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_Parse(v, "d;array item must be float", &x))
386c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
387c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i >= 0)
388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 ((double *)ap->ob_item)[i] = x;
389c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
390778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
391778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
392778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Description of types */
393234f942aefb779efa6cfb7225e21d16a3f7e80f7Guido van Rossumstatic struct arraydescr descriptors[] = {
394c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'c', sizeof(char), c_getitem, c_setitem},
395c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'b', sizeof(char), b_getitem, b_setitem},
396c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'B', sizeof(char), BB_getitem, BB_setitem},
39799866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
398c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
39999866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'h', sizeof(short), h_getitem, h_setitem},
401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'H', sizeof(short), HH_getitem, HH_setitem},
402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'i', sizeof(int), i_getitem, i_setitem},
403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'I', sizeof(int), II_getitem, II_setitem},
404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'l', sizeof(long), l_getitem, l_setitem},
405c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'L', sizeof(long), LL_getitem, LL_setitem},
406c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'f', sizeof(float), f_getitem, f_setitem},
407c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'d', sizeof(double), d_getitem, d_setitem},
408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {'\0', 0, 0, 0} /* Sentinel */
409778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
410bb307343e4d2f2781249e560090260d121607626Tim Peters
411bb307343e4d2f2781249e560090260d121607626Tim Peters/****************************************************************************
412bb307343e4d2f2781249e560090260d121607626Tim PetersImplementations of array object methods.
413bb307343e4d2f2781249e560090260d121607626Tim Peters****************************************************************************/
414778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
4152919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
41618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisnewarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
417778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
418c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject *op;
419c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size_t nbytes;
420c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (size < 0) {
422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_BadInternalCall();
423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    nbytes = size * descr->itemsize;
427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Check for overflow */
428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (nbytes / descr->itemsize != (size_t)size) {
429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_NoMemory();
430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    op = (arrayobject *) type->tp_alloc(type, 0);
432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (op == NULL) {
433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
435c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    op->ob_descr = descr;
436c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    op->allocated = size;
437c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    op->weakreflist = NULL;
438c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_SIZE(op) = size;
439c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (size <= 0) {
440c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        op->ob_item = NULL;
441c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
442c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
443c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        op->ob_item = PyMem_NEW(char, nbytes);
444c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (op->ob_item == NULL) {
445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(op);
446c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyErr_NoMemory();
447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *) op;
450778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
451778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
4522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
45318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisgetarrayitem(PyObject *op, Py_ssize_t i)
454778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
455c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    register arrayobject *ap;
456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(array_Check(op));
457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ap = (arrayobject *)op;
458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(i>=0 && i<Py_SIZE(ap));
459c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (*ap->ob_descr->getitem)(ap, i);
460778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
461778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
462778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
46318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisins1(arrayobject *self, Py_ssize_t where, PyObject *v)
464778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
465c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *items;
466c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n = Py_SIZE(self);
467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v == NULL) {
468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_BadInternalCall();
469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (array_resize(self, n+1) == -1)
475c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
476c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    items = self->ob_item;
477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (where < 0) {
478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        where += n;
479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (where < 0)
480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            where = 0;
481c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (where > n)
483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        where = n;
484c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* appends don't need to call memmove() */
485c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (where != n)
486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memmove(items + (where+1)*self->ob_descr->itemsize,
487c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            items + where*self->ob_descr->itemsize,
488c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (n-where)*self->ob_descr->itemsize);
489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (*self->ob_descr->setitem)(self, where, v);
490778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
491778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
492778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Methods */
493778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
494778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic void
4959656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_dealloc(arrayobject *op)
496778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (op->weakreflist != NULL)
498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject_ClearWeakRefs((PyObject *) op);
499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (op->ob_item != NULL)
500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_DEL(op->ob_item);
501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_TYPE(op)->tp_free((PyObject *)op);
502778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
503778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
5049d19cb8a70544ced7ec9a7995a31d1ed708d4841Guido van Rossumstatic PyObject *
5059d19cb8a70544ced7ec9a7995a31d1ed708d4841Guido van Rossumarray_richcompare(PyObject *v, PyObject *w, int op)
506778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
507c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject *va, *wa;
508c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *vi = NULL;
509c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *wi = NULL;
510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i, k;
511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *res;
512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(v) || !array_Check(w)) {
514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(Py_NotImplemented);
515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return Py_NotImplemented;
516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
517c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    va = (arrayobject *)v;
519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    wa = (arrayobject *)w;
520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Shortcut: if the lengths differ, the arrays differ */
523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (op == Py_EQ)
524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            res = Py_False;
525c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
526c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            res = Py_True;
527c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(res);
528c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return res;
529c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
531c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Search for the first index where items are different */
532c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    k = 1;
533c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
534c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        vi = getarrayitem(v, i);
535c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        wi = getarrayitem(w, i);
536c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (vi == NULL || wi == NULL) {
537c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_XDECREF(vi);
538c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_XDECREF(wi);
539c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
540c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
541c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        k = PyObject_RichCompareBool(vi, wi, Py_EQ);
542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (k == 0)
543c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break; /* Keeping vi and wi alive! */
544c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(vi);
545c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(wi);
546c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (k < 0)
547c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
548c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
549c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
550c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (k) {
551c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* No more items to compare -- compare sizes */
552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t vs = Py_SIZE(va);
553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t ws = Py_SIZE(wa);
554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int cmp;
555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (op) {
556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Py_LT: cmp = vs <  ws; break;
557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Py_LE: cmp = vs <= ws; break;
558c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Py_EQ: cmp = vs == ws; break;
559c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Py_NE: cmp = vs != ws; break;
560c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Py_GT: cmp = vs >  ws; break;
561c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Py_GE: cmp = vs >= ws; break;
562c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default: return NULL; /* cannot happen */
563c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
564c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cmp)
565c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            res = Py_True;
566c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
567c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            res = Py_False;
568c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(res);
569c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return res;
570c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
572c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* We have an item that differs.  First, shortcuts for EQ/NE */
573c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (op == Py_EQ) {
574c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(Py_False);
575c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        res = Py_False;
576c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (op == Py_NE) {
578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(Py_True);
579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        res = Py_True;
580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
582c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Compare the final item again using the proper operator */
583c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        res = PyObject_RichCompare(vi, wi, op);
584c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
585c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(vi);
586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(wi);
587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return res;
588778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
589778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
59018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
5919656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_length(arrayobject *a)
592778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_SIZE(a);
594778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
595778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
5962919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
59718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_item(arrayobject *a, Py_ssize_t i)
598778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i < 0 || i >= Py_SIZE(a)) {
600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_IndexError, "array index out of range");
601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return getarrayitem((PyObject *)a, i);
604778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
605778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6062919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
60718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
608778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject *np;
610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ilow < 0)
611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ilow = 0;
612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ilow > Py_SIZE(a))
613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ilow = Py_SIZE(a);
614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ihigh < 0)
615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = 0;
616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ihigh < ilow)
617c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = ilow;
618c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ihigh > Py_SIZE(a))
619c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = Py_SIZE(a);
620c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
621c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (np == NULL)
622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
6236eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    if (ihigh > ilow) {
6246eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter        memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
6256eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter               (ihigh-ilow) * a->ob_descr->itemsize);
6266eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    }
627c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)np;
628778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
629778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6302919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
6313aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettingerarray_copy(arrayobject *a, PyObject *unused)
6323aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger{
633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_slice(a, 0, Py_SIZE(a));
6343aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger}
6353aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger
6363aa82c07f709a532de28a39308c23757d3b9c91bRaymond HettingerPyDoc_STRVAR(copy_doc,
6373aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger"copy(array)\n\
6383aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger\n\
6393aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger Return a copy of the array.");
6403aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger
6413aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettingerstatic PyObject *
6429656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_concat(arrayobject *a, PyObject *bb)
643778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size;
645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject *np;
646c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(bb)) {
647c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
648c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             "can only append array (not \"%.200s\") to array",
649c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 Py_TYPE(bb)->tp_name);
650c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
652778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)bb)
653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (a->ob_descr != b->ob_descr) {
654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_BadArgument();
655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_NoMemory();
659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size = Py_SIZE(a) + Py_SIZE(b);
661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
662c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (np == NULL) {
663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
664c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
6656eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    if (Py_SIZE(a) > 0) {
6666eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter        memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
6676eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    }
6686eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    if (Py_SIZE(b) > 0) {
6696eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter        memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
6706eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter               b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
6716eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    }
672c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)np;
673778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
674778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
675778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6762919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
67718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_repeat(arrayobject *a, Py_ssize_t n)
678778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size;
681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject *np;
682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *p;
683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t nbytes;
684c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n < 0)
685c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = 0;
686c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
687c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_NoMemory();
688c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size = Py_SIZE(a) * n;
690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (np == NULL)
692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
6936eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    if (size == 0)
6946eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter        return (PyObject *)np;
695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    p = np->ob_item;
696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(p, a->ob_item, nbytes);
699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        p += nbytes;
700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *) np;
702778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
703778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
704778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
705ad0a4629beac0600c4c4c3167b0d68be57ca674eMartin v. Löwisarray_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
706778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *item;
708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n; /* Size of replacement array */
709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t d; /* Change in size */
710778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)v)
711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v == NULL)
712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = 0;
713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (array_Check(v)) {
714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = Py_SIZE(b);
715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (a == b) {
716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Special case "a[i:j] = a" -- copy b first */
717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            int ret;
718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            v = array_slice(b, 0, n);
719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!v)
720c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
721c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ret = array_ass_slice(a, ilow, ihigh, v);
722c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(v);
723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return ret;
724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
725c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (b->ob_descr != a->ob_descr) {
726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_BadArgument();
727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
731c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
732c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou         "can only assign array (not \"%.200s\") to array slice",
733c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         Py_TYPE(v)->tp_name);
734c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
736c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ilow < 0)
737c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ilow = 0;
738c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ilow > Py_SIZE(a))
739c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ilow = Py_SIZE(a);
740c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ihigh < 0)
741c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = 0;
742c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ihigh < ilow)
743c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = ilow;
744c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ihigh > Py_SIZE(a))
745c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = Py_SIZE(a);
746c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    item = a->ob_item;
747c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    d = n - (ihigh-ilow);
748c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (d < 0) { /* Delete -d items */
749c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memmove(item + (ihigh+d)*a->ob_descr->itemsize,
750c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            item + ihigh*a->ob_descr->itemsize,
751c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
752c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(a) += d;
753c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
754c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                        /* Can't fail */
755c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->ob_item = item;
756c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->allocated = Py_SIZE(a);
757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (d > 0) { /* Insert d items */
759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char,
760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     (Py_SIZE(a) + d)*a->ob_descr->itemsize);
761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memmove(item + (ihigh+d)*a->ob_descr->itemsize,
766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            item + ihigh*a->ob_descr->itemsize,
767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->ob_item = item;
769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(a) += d;
770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->allocated = Py_SIZE(a);
771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0)
773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               n*b->ob_descr->itemsize);
775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
776778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
777778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
778778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
779778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
78018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
781778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
782c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i < 0 || i >= Py_SIZE(a)) {
783c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_IndexError,
784c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         "array assignment index out of range");
785c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
786c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v == NULL)
788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return array_ass_slice(a, i, i+1, v);
789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (*a->ob_descr->setitem)(a, i, v);
790778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
791778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
792778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
79318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwissetarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
794778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(array_Check(a));
796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_ass_item((arrayobject *)a, i, v);
797778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
798778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
79999866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic int
80049f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerarray_iter_extend(arrayobject *self, PyObject *bb)
80199866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *it, *v;
80399866336094bd432860d32dd368f5934683939e7Martin v. Löwis
804c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it = PyObject_GetIter(bb);
805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (it == NULL)
806c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
80749f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger
808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while ((v = PyIter_Next(it)) != NULL) {
8095e684339c23a6bcac8896a5d25549dbe9d7b8aa6Mark Dickinson        if (ins1(self, Py_SIZE(self), v) != 0) {
810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(v);
811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(it);
812c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
813c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
814c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(v);
815c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
816c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(it);
817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_Occurred())
818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
82049f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger}
82149f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger
82249f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerstatic int
82349f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerarray_do_extend(arrayobject *self, PyObject *bb)
82449f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger{
825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size;
826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *old_item;
82749f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger
828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(bb))
829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return array_iter_extend(self, bb);
83099866336094bd432860d32dd368f5934683939e7Martin v. Löwis#define b ((arrayobject *)bb)
831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_descr != b->ob_descr) {
832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     "can only extend with array of same kind");
834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
841c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size = Py_SIZE(self) + Py_SIZE(b);
842c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    old_item = self->ob_item;
843c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
844c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_item == NULL) {
845c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = old_item;
846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
847c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
8496eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    if (Py_SIZE(b) > 0) {
8506eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter        memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
8516eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter               b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
8526eec87810fcf75249cb1060424f69ef5859e3fb1Martin Panter    }
853c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_SIZE(self) = size;
854c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    self->allocated = size;
855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
85799866336094bd432860d32dd368f5934683939e7Martin v. Löwis#undef b
85899866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
85999866336094bd432860d32dd368f5934683939e7Martin v. Löwis
86099866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
86199866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_inplace_concat(arrayobject *self, PyObject *bb)
86299866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(bb)) {
864c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
865c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "can only extend array with array (not \"%.200s\")",
866c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_TYPE(bb)->tp_name);
867c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
868c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
869c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (array_do_extend(self, bb) == -1)
870c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
871c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(self);
872c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)self;
87399866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
87499866336094bd432860d32dd368f5934683939e7Martin v. Löwis
87599866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
87618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_inplace_repeat(arrayobject *self, Py_ssize_t n)
87799866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
878c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *items, *p;
879c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size, i;
880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
881c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(self) > 0) {
882c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (n < 0)
883c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            n = 0;
884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        items = self->ob_item;
885c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if ((self->ob_descr->itemsize != 0) &&
886c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
887c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyErr_NoMemory();
888c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
889c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size = Py_SIZE(self) * self->ob_descr->itemsize;
890c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (n == 0) {
891c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyMem_FREE(items);
892c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->ob_item = NULL;
893c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_SIZE(self) = 0;
894c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->allocated = 0;
895c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
896c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
897c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (size > PY_SSIZE_T_MAX / n) {
898c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return PyErr_NoMemory();
899c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
900c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyMem_RESIZE(items, char, n * size);
901c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (items == NULL)
902c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return PyErr_NoMemory();
903c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p = items;
904c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            for (i = 1; i < n; i++) {
905c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                p += size;
906c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                memcpy(p, items, size);
907c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
908c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->ob_item = items;
909c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_SIZE(self) *= n;
910c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->allocated = Py_SIZE(self);
911c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
912c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
913c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(self);
914c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)self;
91599866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
91699866336094bd432860d32dd368f5934683939e7Martin v. Löwis
91799866336094bd432860d32dd368f5934683939e7Martin v. Löwis
9182919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
91918e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisins(arrayobject *self, Py_ssize_t where, PyObject *v)
920778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
921c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ins1(self, where, v) != 0)
922c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
923c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
924c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
925778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
926778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
9272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
92836cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_count(arrayobject *self, PyObject *v)
9295a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t count = 0;
931c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
9325a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
933c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
934c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self, i);
935c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
936c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
937c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cmp > 0)
938c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            count++;
939c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (cmp < 0)
940c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
941c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
942c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromSsize_t(count);
9435a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
9445a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
94514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(count_doc,
946077a11dd00092fead641b9f2bd824790791512c7Tim Peters"count(x)\n\
9475a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
9483e4caeb3bf2b2579861e9f3379e3508fbb30549cMark DickinsonReturn number of occurrences of x in the array.");
9495a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
9505a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
95136cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_index(arrayobject *self, PyObject *v)
9525a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
953c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
9545a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
955c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
956c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self, i);
957c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
958c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
959c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cmp > 0) {
960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyInt_FromLong((long)i);
961c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
962c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (cmp < 0)
963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
964c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
965c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
966c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
9675a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
9685a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
96914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(index_doc,
970077a11dd00092fead641b9f2bd824790791512c7Tim Peters"index(x)\n\
9715a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
9723e4caeb3bf2b2579861e9f3379e3508fbb30549cMark DickinsonReturn index of first occurrence of x in the array.");
9735a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
974625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic int
975625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarray_contains(arrayobject *self, PyObject *v)
976625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
977c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
978c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int cmp;
979625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
980c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
981c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self, i);
982c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
983c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
984c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
985c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return cmp;
986625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
987625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
9885a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
98936cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_remove(arrayobject *self, PyObject *v)
9905a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
991c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
992c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
993c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
994c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self,i);
995c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
996c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
997c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cmp > 0) {
998c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (array_ass_slice(self, i, i+1,
999c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                               (PyObject *)NULL) != 0)
1000c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
1001c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_INCREF(Py_None);
1002c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return Py_None;
1003c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1004c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (cmp < 0)
1005c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1006c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1007c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
1008c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
10095a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
10105a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
101114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(remove_doc,
1012077a11dd00092fead641b9f2bd824790791512c7Tim Peters"remove(x)\n\
10135a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
10143e4caeb3bf2b2579861e9f3379e3508fbb30549cMark DickinsonRemove the first occurrence of x in the array.");
10155a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
10165a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
10175a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamparray_pop(arrayobject *self, PyObject *args)
10185a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
1019c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i = -1;
1020c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v;
1021c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "|n:pop", &i))
1022c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1023c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(self) == 0) {
1024c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Special-case most common failure cause */
1025c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_IndexError, "pop from empty array");
1026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i < 0)
1029c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        i += Py_SIZE(self);
1030c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i < 0 || i >= Py_SIZE(self)) {
1031c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_IndexError, "pop index out of range");
1032c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1033c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1034c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    v = getarrayitem((PyObject *)self,i);
1035c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1036c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(v);
1037c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1038c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1039c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return v;
10405a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
10415a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
104214f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(pop_doc,
1043077a11dd00092fead641b9f2bd824790791512c7Tim Peters"pop([i])\n\
10445a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
104514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisReturn the i-th element and delete it from the array. i defaults to -1.");
10465a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
10475a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
104836cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_extend(arrayobject *self, PyObject *bb)
10495a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
1050c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (array_do_extend(self, bb) == -1)
1051c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1052c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1053c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
10545a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
10555a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
105614f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(extend_doc,
105749f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger"extend(array or iterable)\n\
10585a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
105949f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger Append items to the end of the array.");
10605a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
10615a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
10629656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_insert(arrayobject *self, PyObject *args)
1063778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1064c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
1065c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v;
1066c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
1067c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1068c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return ins(self, i, v);
1069778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1070778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
107114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(insert_doc,
1072077a11dd00092fead641b9f2bd824790791512c7Tim Peters"insert(i,x)\n\
1073b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
107414f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisInsert a new item x into the array before position i.");
1075b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1076b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
10772919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
107836cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_buffer_info(arrayobject *self, PyObject *unused)
1079de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossum{
10800cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    PyObject *retval = NULL, *v;
10810cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka
1082c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    retval = PyTuple_New(2);
1083c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!retval)
1084c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1085541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake
10860cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    v = PyLong_FromVoidPtr(self->ob_item);
10870cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    if (v == NULL) {
10880cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka        Py_DECREF(retval);
10890cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka        return NULL;
10900cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    }
10910cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    PyTuple_SET_ITEM(retval, 0, v);
10920cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka
1093ff0d875ad13b3db856d632a57cfea48d32af75e0Serhiy Storchaka    v = PyInt_FromSsize_t(Py_SIZE(self));
10940cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    if (v == NULL) {
10950cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka        Py_DECREF(retval);
10960cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka        return NULL;
10970cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    }
10980cc5a2b263b3783adf687f41e6f77b840a39032eSerhiy Storchaka    PyTuple_SET_ITEM(retval, 1, v);
1099541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake
1100c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return retval;
1101de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossum}
1102de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossum
110314f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(buffer_info_doc,
1104077a11dd00092fead641b9f2bd824790791512c7Tim Peters"buffer_info() -> (address, length)\n\
1105b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1106b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumReturn a tuple (address, length) giving the current memory address and\n\
1107702d08ec05ba66831b5c95a9643a7ebbb6d67795Guido van Rossumthe length in items of the buffer used to hold array's contents\n\
1108702d08ec05ba66831b5c95a9643a7ebbb6d67795Guido van RossumThe length should be multiplied by the itemsize attribute to calculate\n\
110914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisthe buffer length in bytes.");
1110b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1111b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1112de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossumstatic PyObject *
111336cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_append(arrayobject *self, PyObject *v)
1114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
11155e684339c23a6bcac8896a5d25549dbe9d7b8aa6Mark Dickinson    return ins(self, Py_SIZE(self), v);
1116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
111814f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(append_doc,
1119b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"append(x)\n\
1120b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
112114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisAppend new value x to the end of the array.");
1122b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1123b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
11242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
112536cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_byteswap(arrayobject *self, PyObject *unused)
1126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1127c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *p;
1128c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
1129c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1130c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (self->ob_descr->itemsize) {
1131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 1:
1132c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 2:
1134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p0 = p[0];
1136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[0] = p[1];
1137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[1] = p0;
1138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 4:
1141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p0 = p[0];
1143c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p1 = p[1];
1144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[0] = p[3];
1145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[1] = p[2];
1146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[2] = p1;
1147c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[3] = p0;
1148c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1149c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1150c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 8:
1151c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1152c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p0 = p[0];
1153c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p1 = p[1];
1154c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p2 = p[2];
1155c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p3 = p[3];
1156c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[0] = p[7];
1157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[1] = p[6];
1158c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[2] = p[5];
1159c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[3] = p[4];
1160c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[4] = p3;
1161c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[5] = p2;
1162c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[6] = p1;
1163c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[7] = p0;
1164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1165c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1166c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
1167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_RuntimeError,
1168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   "don't know how to byteswap this array type");
1169c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1170c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1171c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1173778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
117514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(byteswap_doc,
1176bf272983643776e9842cad6d1885f1b92f5eb67fFred Drake"byteswap()\n\
1177b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1178bf272983643776e9842cad6d1885f1b92f5eb67fFred DrakeByteswap all items of the array.  If the items in the array are not 1, 2,\n\
117914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwis4, or 8 bytes in size, RuntimeError is raised.");
1180b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
11812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
118236cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_reverse(arrayobject *self, PyObject *unused)
1183778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1184c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    register Py_ssize_t itemsize = self->ob_descr->itemsize;
1185c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    register char *p, *q;
1186c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* little buffer to hold items while swapping */
1187c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char tmp[256];      /* 8 is probably enough -- but why skimp */
1188c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert((size_t)itemsize <= sizeof(tmp));
1189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(self) > 1) {
1191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item,
1192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             p < q;
1194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             p += itemsize, q -= itemsize) {
1195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* memory areas guaranteed disjoint, so memcpy
1196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             * is safe (& memmove may be slower).
1197c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             */
1198c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(tmp, p, itemsize);
1199c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(p, q, itemsize);
1200c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(q, tmp, itemsize);
1201c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1203c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1205c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1206778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1207e77a757094f68351f336044654cd91575c677896Guido van Rossum
120814f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(reverse_doc,
1209b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"reverse()\n\
1210b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
121114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisReverse the order of the items in the array.");
1212b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
12132919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
12149656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_fromfile(arrayobject *self, PyObject *args)
1215778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1216c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *f;
1217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    FILE *fp;
1219c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
1220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1221c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    fp = PyFile_AsFile(f);
1222c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (fp == NULL) {
1223c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
1224c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *item = self->ob_item;
1228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t itemsize = self->ob_descr->itemsize;
1229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t nread;
1230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t newlength;
1231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t newbytes;
1232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Be careful here about overflow */
1233c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if ((newlength = Py_SIZE(self) + n) <= 0 ||
1234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (newbytes = newlength * itemsize) / itemsize !=
1235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (size_t)newlength)
1236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            goto nomem;
1237c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, newbytes);
1238c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1239c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou          nomem:
1240c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1241c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1243c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = item;
1244c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1245c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1246c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        nread = fread(item + (Py_SIZE(self) - n) * itemsize,
1247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      itemsize, n, fp);
1248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (nread < (size_t)n) {
1249c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou          Py_SIZE(self) -= (n - nread);
1250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
1251c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->ob_item = item;
1252c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->allocated = Py_SIZE(self);
12537a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            if (ferror(fp)) {
12547a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                PyErr_SetFromErrno(PyExc_IOError);
12557a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                clearerr(fp);
12567a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            }
12577a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            else {
12587a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                PyErr_SetString(PyExc_EOFError,
12597a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                                "not enough items in file");
12607a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            }
1261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1266778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1267778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
126814f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromfile_doc,
1269b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"fromfile(f, n)\n\
1270b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1271b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumRead n objects from the file object f and append them to the end of the\n\
127214f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisarray.  Also called as read.");
1273b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1274b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
12752919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
12761e7c37514db417a495a1118c0b6d753d88249853Georg Brandlarray_fromfile_as_read(arrayobject *self, PyObject *args)
12771e7c37514db417a495a1118c0b6d753d88249853Georg Brandl{
1278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
1279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       "use array.fromfile()", 1) < 0)
1280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_fromfile(self, args);
12821e7c37514db417a495a1118c0b6d753d88249853Georg Brandl}
12831e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
12841e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
12851e7c37514db417a495a1118c0b6d753d88249853Georg Brandlstatic PyObject *
128636cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tofile(arrayobject *self, PyObject *f)
1287778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    FILE *fp;
1289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    fp = PyFile_AsFile(f);
1291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (fp == NULL) {
1292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError, "arg must be open file");
1293c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1294c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_size > 0) {
1296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (fwrite(self->ob_item, self->ob_descr->itemsize,
1297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   self->ob_size, fp) != (size_t)self->ob_size) {
1298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetFromErrno(PyExc_IOError);
1299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            clearerr(fp);
1300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1301c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1302c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1303c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1304c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1305778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1306778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
130714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tofile_doc,
1308b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"tofile(f)\n\
1309b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1310b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumWrite all items (as machine values) to the file object f.  Also called as\n\
131114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwiswrite.");
1312b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1313b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
13142919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
13151e7c37514db417a495a1118c0b6d753d88249853Georg Brandlarray_tofile_as_write(arrayobject *self, PyObject *f)
13161e7c37514db417a495a1118c0b6d753d88249853Georg Brandl{
1317c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
1318c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       "use array.tofile()", 1) < 0)
1319c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1320c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_tofile(self, f);
13211e7c37514db417a495a1118c0b6d753d88249853Georg Brandl}
13221e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
13231e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
13241e7c37514db417a495a1118c0b6d753d88249853Georg Brandlstatic PyObject *
132536cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_fromlist(arrayobject *self, PyObject *list)
1326778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t itemsize = self->ob_descr->itemsize;
1329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyList_Check(list)) {
1331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError, "arg must be list");
1332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = PyList_Size(list);
1335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *item = self->ob_item;
1337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i;
1338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
1339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1340c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1341c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1342c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1343c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = item;
1344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (i = 0; i < n; i++) {
1347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *v = PyList_GetItem(list, i);
1348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if ((*self->ob_descr->setitem)(self,
1349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            Py_SIZE(self) - n + i, v) != 0) {
1350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_SIZE(self) -= n;
1351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1352c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return PyErr_NoMemory();
1353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
1354c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyMem_RESIZE(item, char,
1355c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  Py_SIZE(self) * itemsize);
1356c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item = item;
1357c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->allocated = Py_SIZE(self);
1358c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
1359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1364778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1365778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
136614f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromlist_doc,
1367b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"fromlist(list)\n\
1368b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
136914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisAppend items to array from list.");
1370b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1371b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
13722919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
137336cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tolist(arrayobject *self, PyObject *unused)
1374778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1375c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *list = PyList_New(Py_SIZE(self));
1376c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
137736cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettinger
1378c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (list == NULL)
1379c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
1381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *v = getarrayitem((PyObject *)self, i);
1382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (v == NULL) {
1383c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(list);
1384c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1385c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1386c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyList_SetItem(list, i, v);
1387c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return list;
1389778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1390778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
139114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tolist_doc,
1392fc6aba5008caede94ad65a9cf387b3ba971d5379Guido van Rossum"tolist() -> list\n\
1393b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
139414f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisConvert array to an ordinary list with the same items.");
1395b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1396b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
13972919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
13989656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_fromstring(arrayobject *self, PyObject *args)
1399778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *str;
1401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int itemsize = self->ob_descr->itemsize;
1403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
1404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1405cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka    if (str == self->ob_item) {
1406cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka        PyErr_SetString(PyExc_ValueError,
1407cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka                        "array.fromstring(x): x cannot be self");
1408cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka        return NULL;
1409cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka    }
1410c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n % itemsize != 0) {
1411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
1412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   "string length not a multiple of item size");
1413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1414c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1415c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = n / itemsize;
1416c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1417c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *item = self->ob_item;
1418c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1419c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1420c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return PyErr_NoMemory();
1421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
1423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = item;
1428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(item + (Py_SIZE(self) - n) * itemsize,
1431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               str, itemsize*n);
1432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1435778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1436778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
143714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromstring_doc,
1438b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"fromstring(string)\n\
1439b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1440b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumAppends items from the string, interpreting it as an array of machine\n\
144114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisvalues,as if it had been read from a file using the fromfile() method).");
1442b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1443b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
14442919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
144536cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tostring(arrayobject *self, PyObject *unused)
1446778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyString_FromStringAndSize(self->ob_item,
1449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            Py_SIZE(self) * self->ob_descr->itemsize);
1450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } else {
1451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_NoMemory();
1452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1453778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1454778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
145514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tostring_doc,
1456b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"tostring() -> string\n\
1457b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1458b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumConvert the array to an array of machine values and return the string\n\
145914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisrepresentation.");
1460b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
146199866336094bd432860d32dd368f5934683939e7Martin v. Löwis
146299866336094bd432860d32dd368f5934683939e7Martin v. Löwis
146399866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
146499866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
146599866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_fromunicode(arrayobject *self, PyObject *args)
146699866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_UNICODE *ustr;
1468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_descr->typecode != 'u') {
1473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
1474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "fromunicode() may only be called on "
1475c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "type 'u' arrays");
1476c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1481c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyErr_NoMemory();
1482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
1484c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1485c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1487c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1488c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = (char *) item;
1489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1490c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1491c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(item + Py_SIZE(self) - n,
1492c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               ustr, n * sizeof(Py_UNICODE));
1493c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
149799866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
149899866336094bd432860d32dd368f5934683939e7Martin v. Löwis
149914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromunicode_doc,
150099866336094bd432860d32dd368f5934683939e7Martin v. Löwis"fromunicode(ustr)\n\
150199866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
150299866336094bd432860d32dd368f5934683939e7Martin v. LöwisExtends this array with data from the unicode string ustr.\n\
150399866336094bd432860d32dd368f5934683939e7Martin v. LöwisThe array must be a type 'u' array; otherwise a ValueError\n\
150499866336094bd432860d32dd368f5934683939e7Martin v. Löwisis raised.  Use array.fromstring(ustr.decode(...)) to\n\
150514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisappend Unicode data to an array of some other type.");
150699866336094bd432860d32dd368f5934683939e7Martin v. Löwis
150799866336094bd432860d32dd368f5934683939e7Martin v. Löwis
150899866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
150936cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tounicode(arrayobject *self, PyObject *unused)
151099866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_descr->typecode != 'u') {
1512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
1513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "tounicode() may only be called on type 'u' arrays");
1514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
151799866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
151899866336094bd432860d32dd368f5934683939e7Martin v. Löwis
151914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tounicode_doc,
152099866336094bd432860d32dd368f5934683939e7Martin v. Löwis"tounicode() -> unicode\n\
152199866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
152299866336094bd432860d32dd368f5934683939e7Martin v. LöwisConvert the array to a unicode string.  The array must be\n\
152399866336094bd432860d32dd368f5934683939e7Martin v. Löwisa type 'u' array; otherwise a ValueError is raised.  Use\n\
152499866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray.tostring().decode() to obtain a unicode string from\n\
152514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisan array of some other type.");
152699866336094bd432860d32dd368f5934683939e7Martin v. Löwis
152799866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif /* Py_USING_UNICODE */
152899866336094bd432860d32dd368f5934683939e7Martin v. Löwis
1529999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalottistatic PyObject *
1530999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalottiarray_reduce(arrayobject *array)
1531999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalotti{
1532c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *dict, *result, *list;
1533c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1534c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1535c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (dict == NULL) {
1536c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1537c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1538c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Clear();
1539c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        dict = Py_None;
1540c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(dict);
1541c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Unlike in Python 3.x, we never use the more efficient memory
1543c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * representation of an array for pickling.  This is unfortunately
1544c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * necessary to allow array objects to be unpickled by Python 3.x,
1545c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * since str objects from 2.x are always decoded to unicode in
1546c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * Python 3.x.
1547c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     */
1548c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    list = array_tolist(array, NULL);
1549c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (list == NULL) {
1550c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(dict);
1551c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    result = Py_BuildValue(
1554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        "O(cO)O", Py_TYPE(array), array->ob_descr->typecode, list, dict);
1555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(list);
1556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(dict);
1557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return result;
1558999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalotti}
1559999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalotti
1560999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre VassalottiPyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
156199866336094bd432860d32dd368f5934683939e7Martin v. Löwis
156299866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
15632d639d5665739886e2044b2c92d2e157ee0161aaMeador Ingearray_sizeof(arrayobject *self, PyObject *unused)
15642d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge{
15652d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge    Py_ssize_t res;
1566c06a6d0958e2eb4449605069b9c10d656ab756e8Serhiy Storchaka    res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * self->ob_descr->itemsize;
15672d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge    return PyLong_FromSsize_t(res);
15682d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge}
15692d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge
15702d639d5665739886e2044b2c92d2e157ee0161aaMeador IngePyDoc_STRVAR(sizeof_doc,
15712d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge"__sizeof__() -> int\n\
15722d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge\n\
15732d639d5665739886e2044b2c92d2e157ee0161aaMeador IngeSize of the array in memory, in bytes.");
15742d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge
15752d639d5665739886e2044b2c92d2e157ee0161aaMeador Ingestatic PyObject *
157699866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_get_typecode(arrayobject *a, void *closure)
157799866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char tc = a->ob_descr->typecode;
1579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyString_FromStringAndSize(&tc, 1);
158099866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
158199866336094bd432860d32dd368f5934683939e7Martin v. Löwis
158299866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
158399866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_get_itemsize(arrayobject *a, void *closure)
158499866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1585c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong((long)a->ob_descr->itemsize);
158699866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
158799866336094bd432860d32dd368f5934683939e7Martin v. Löwis
158899866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyGetSetDef array_getsets [] = {
1589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"typecode", (getter) array_get_typecode, NULL,
1590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     "the typecode character used to create the array"},
1591c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"itemsize", (getter) array_get_itemsize, NULL,
1592c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     "the size, in bytes, of one array item"},
1593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {NULL}
159499866336094bd432860d32dd368f5934683939e7Martin v. Löwis};
159599866336094bd432860d32dd368f5934683939e7Martin v. Löwis
1596111c180674379950f65113db8076919b2353f5abMartin v. Löwisstatic PyMethodDef array_methods[] = {
1597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"append",          (PyCFunction)array_append,      METH_O,
1598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     append_doc},
1599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
1600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     buffer_info_doc},
1601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"byteswap",        (PyCFunction)array_byteswap,    METH_NOARGS,
1602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     byteswap_doc},
1603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"__copy__",        (PyCFunction)array_copy,        METH_NOARGS,
1604c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     copy_doc},
1605c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"count",           (PyCFunction)array_count,       METH_O,
1606c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     count_doc},
1607c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"__deepcopy__",(PyCFunction)array_copy,            METH_O,
1608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     copy_doc},
1609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"extend",      (PyCFunction)array_extend,          METH_O,
1610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     extend_doc},
1611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromfile",        (PyCFunction)array_fromfile,    METH_VARARGS,
1612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromfile_doc},
1613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromlist",        (PyCFunction)array_fromlist,    METH_O,
1614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromlist_doc},
1615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromstring",      (PyCFunction)array_fromstring,  METH_VARARGS,
1616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromstring_doc},
161799866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
1618c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromunicode",     (PyCFunction)array_fromunicode, METH_VARARGS,
1619c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromunicode_doc},
162099866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
1621c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"index",           (PyCFunction)array_index,       METH_O,
1622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     index_doc},
1623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"insert",          (PyCFunction)array_insert,      METH_VARARGS,
1624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     insert_doc},
1625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"pop",             (PyCFunction)array_pop,         METH_VARARGS,
1626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     pop_doc},
1627c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"read",            (PyCFunction)array_fromfile_as_read,    METH_VARARGS,
1628c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromfile_doc},
1629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"__reduce__",      (PyCFunction)array_reduce,      METH_NOARGS,
1630c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     reduce_doc},
1631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"remove",          (PyCFunction)array_remove,      METH_O,
1632c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     remove_doc},
1633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"reverse",         (PyCFunction)array_reverse,     METH_NOARGS,
1634c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     reverse_doc},
1635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou/*      {"sort",        (PyCFunction)array_sort,        METH_VARARGS,
1636c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sort_doc},*/
1637c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tofile",          (PyCFunction)array_tofile,      METH_O,
1638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tofile_doc},
1639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tolist",          (PyCFunction)array_tolist,      METH_NOARGS,
1640c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tolist_doc},
1641c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tostring",        (PyCFunction)array_tostring,    METH_NOARGS,
1642c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tostring_doc},
164399866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
1644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tounicode",   (PyCFunction)array_tounicode,       METH_NOARGS,
1645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tounicode_doc},
164699866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
1647c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"write",           (PyCFunction)array_tofile_as_write,     METH_O,
1648c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tofile_doc},
16492d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge    {"__sizeof__",      (PyCFunction)array_sizeof,      METH_NOARGS,
16502d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge     sizeof_doc},
1651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {NULL,              NULL}           /* sentinel */
1652778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1653778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
16542919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
16559656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_repr(arrayobject *a)
1656778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char buf[256], typecode;
1658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *s, *t, *v = NULL;
1659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t len;
1660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    len = Py_SIZE(a);
1662c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    typecode = a->ob_descr->typecode;
1663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (len == 0) {
1664c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
1665c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyString_FromString(buf);
1666c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1667c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1668c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (typecode == 'c')
1669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = array_tostring(a, NULL);
16701755ad9b026d63bbff707e0d33b738e18499b3e9Michael W. Hudson#ifdef Py_USING_UNICODE
1671c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (typecode == 'u')
1672c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = array_tounicode(a, NULL);
16731755ad9b026d63bbff707e0d33b738e18499b3e9Michael W. Hudson#endif
1674c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
1675c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = array_tolist(a, NULL);
1676c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    t = PyObject_Repr(v);
1677c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(v);
167888ba1e39ecf32d0a2328358351fff3006a5b30b9Raymond Hettinger
1679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
1680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    s = PyString_FromString(buf);
1681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyString_ConcatAndDel(&s, t);
1682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyString_ConcatAndDel(&s, PyString_FromString(")"));
1683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return s;
1684778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1685778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
16869c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonstatic PyObject*
16879c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonarray_subscr(arrayobject* self, PyObject* item)
16889c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson{
1689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyIndex_Check(item)) {
1690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i==-1 && PyErr_Occurred()) {
1692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i < 0)
1695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            i += Py_SIZE(self);
1696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return array_item(self, i);
1697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (PySlice_Check(item)) {
1699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t start, stop, step, slicelength, cur, i;
1700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject* result;
1701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arrayobject* ar;
1702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int itemsize = self->ob_descr->itemsize;
1703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
1705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         &start, &stop, &step, &slicelength) < 0) {
1706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (slicelength <= 0) {
1710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return newarrayobject(&Arraytype, 0, self->ob_descr);
1711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (step == 1) {
1713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *result = newarrayobject(&Arraytype,
1714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                    slicelength, self->ob_descr);
1715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (result == NULL)
1716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
1717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(((arrayobject *)result)->ob_item,
1718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   self->ob_item + start * itemsize,
1719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   slicelength * itemsize);
1720c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return result;
1721c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1722c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
1723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!result) return NULL;
1725c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ar = (arrayobject*)result;
1727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            for (cur = start, i = 0; i < slicelength;
1729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 cur += step, i++) {
1730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                memcpy(ar->ob_item + i*itemsize,
1731c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       self->ob_item + cur*itemsize,
1732c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       itemsize);
1733c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1734c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return result;
1736c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1737c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1738c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1739c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
1740c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "array indices must be integers");
1741c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1742c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
17439c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson}
17449c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson
17459c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonstatic int
17469c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonarray_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
17479c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson{
1748c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t start, stop, step, slicelength, needed;
1749c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject* other;
1750c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int itemsize;
1751c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1752c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyIndex_Check(item)) {
1753c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1754c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1755c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i == -1 && PyErr_Occurred())
1756c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i < 0)
1758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            i += Py_SIZE(self);
1759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i < 0 || i >= Py_SIZE(self)) {
1760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_IndexError,
1761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "array assignment index out of range");
1762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (value == NULL) {
1765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Fall through to slice assignment */
1766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            start = i;
1767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            stop = i + 1;
1768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            step = 1;
1769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            slicelength = 1;
1770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
1772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return (*self->ob_descr->setitem)(self, i, value);
1773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (PySlice_Check(item)) {
1775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PySlice_GetIndicesEx((PySliceObject *)item,
1776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 Py_SIZE(self), &start, &stop,
1777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 &step, &slicelength) < 0) {
1778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1781c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1782c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
1783c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "array indices must be integer");
1784c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1785c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1786c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (value == NULL) {
1787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        other = NULL;
1788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        needed = 0;
1789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1790c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (array_Check(value)) {
1791c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        other = (arrayobject *)value;
1792c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        needed = Py_SIZE(other);
1793c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (self == other) {
1794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Special case "self[i:j] = self" -- copy self first */
1795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            int ret;
1796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            value = array_slice(other, 0, needed);
1797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (value == NULL)
1798c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
1799c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ret = array_ass_subscr(self, item, value);
1800c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(value);
1801c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return ret;
1802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1803c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (other->ob_descr != self->ob_descr) {
1804c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_BadArgument();
1805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1806c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1807c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
1810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou         "can only assign array (not \"%.200s\") to array slice",
1811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         Py_TYPE(value)->tp_name);
1812c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1813c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1814c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    itemsize = self->ob_descr->itemsize;
1815c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1816c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((step > 0 && stop < start) ||
1817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        (step < 0 && stop > start))
1818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        stop = start;
1819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (step == 1) {
1820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (slicelength > needed) {
1821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (start + needed) * itemsize,
1822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + stop * itemsize,
1823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (Py_SIZE(self) - stop) * itemsize);
1824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (array_resize(self, Py_SIZE(self) +
1825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                             needed - slicelength) < 0)
1826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
1827c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (slicelength < needed) {
1829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (array_resize(self, Py_SIZE(self) +
1830c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                             needed - slicelength) < 0)
1831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
1832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (start + needed) * itemsize,
1833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + stop * itemsize,
1834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (Py_SIZE(self) - start - needed) * itemsize);
1835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (needed > 0)
1837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(self->ob_item + start * itemsize,
1838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   other->ob_item, needed * itemsize);
1839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1841c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (needed == 0) {
1842c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Delete slice */
1843c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t cur;
1844c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i;
1845c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (step < 0) {
1847c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            stop = start + 1;
1848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            start = stop + step * (slicelength - 1) - 1;
1849c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            step = -step;
1850c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1851c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (cur = start, i = 0; i < slicelength;
1852c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             cur += step, i++) {
1853c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_ssize_t lim = step - 1;
1854c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (cur + step >= (size_t)Py_SIZE(self))
1856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                lim = Py_SIZE(self) - cur - 1;
1857c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (cur - i) * itemsize,
1858c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + (cur + 1) * itemsize,
1859c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                lim * itemsize);
1860c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        cur = start + slicelength * step;
1862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cur < (size_t)Py_SIZE(self)) {
1863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (cur-slicelength) * itemsize,
1864c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + cur * itemsize,
1865c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (Py_SIZE(self) - cur) * itemsize);
1866c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1867c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
1868c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1869c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1870c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1871c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1872c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t cur, i;
1873c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1874c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (needed != slicelength) {
1875c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_Format(PyExc_ValueError,
1876c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "attempt to assign array of size %zd "
1877c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "to extended slice of size %zd",
1878c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                needed, slicelength);
1879c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1881c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (cur = start, i = 0; i < slicelength;
1882c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             cur += step, i++) {
1883c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(self->ob_item + cur * itemsize,
1884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   other->ob_item + i * itemsize,
1885c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   itemsize);
1886c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1887c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1888c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
18899c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson}
18909c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson
18919c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonstatic PyMappingMethods array_as_mapping = {
1892c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (lenfunc)array_length,
1893c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (binaryfunc)array_subscr,
1894c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (objobjargproc)array_ass_subscr
18959c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson};
18969c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson
189701a807db2a4b2d39d8e9473e658b908ff58e1058Raymond Hettingerstatic const void *emptybuf = "";
189801a807db2a4b2d39d8e9473e658b908ff58e1058Raymond Hettinger
189918e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
190018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
1901fdf95dd525840559d77637802ff117969db19031Guido van Rossum{
1902c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ( index != 0 ) {
1903c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
1904c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "Accessing non-existent array segment");
1905c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1906c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1907c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    *ptr = (void *)self->ob_item;
1908c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (*ptr == NULL)
1909c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *ptr = emptybuf;
1910c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_SIZE(self)*self->ob_descr->itemsize;
1911fdf95dd525840559d77637802ff117969db19031Guido van Rossum}
1912fdf95dd525840559d77637802ff117969db19031Guido van Rossum
191318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
191418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
1915fdf95dd525840559d77637802ff117969db19031Guido van Rossum{
1916c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ( index != 0 ) {
1917c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
1918c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "Accessing non-existent array segment");
1919c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1920c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1921c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    *ptr = (void *)self->ob_item;
1922c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (*ptr == NULL)
1923c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *ptr = emptybuf;
1924c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_SIZE(self)*self->ob_descr->itemsize;
1925fdf95dd525840559d77637802ff117969db19031Guido van Rossum}
1926fdf95dd525840559d77637802ff117969db19031Guido van Rossum
192718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
192818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
1929fdf95dd525840559d77637802ff117969db19031Guido van Rossum{
1930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ( lenp )
1931c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
1932c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1933fdf95dd525840559d77637802ff117969db19031Guido van Rossum}
1934fdf95dd525840559d77637802ff117969db19031Guido van Rossum
19352919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PySequenceMethods array_as_sequence = {
1936c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (lenfunc)array_length,                      /*sq_length*/
1937c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (binaryfunc)array_concat,               /*sq_concat*/
1938c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeargfunc)array_repeat,                 /*sq_repeat*/
1939c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeargfunc)array_item,                           /*sq_item*/
1940c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizessizeargfunc)array_slice,             /*sq_slice*/
1941c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeobjargproc)array_ass_item,                    /*sq_ass_item*/
1942c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizessizeobjargproc)array_ass_slice,      /*sq_ass_slice*/
1943c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (objobjproc)array_contains,                 /*sq_contains*/
1944c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (binaryfunc)array_inplace_concat,           /*sq_inplace_concat*/
1945c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeargfunc)array_inplace_repeat          /*sq_inplace_repeat*/
1946778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1947778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1948fdf95dd525840559d77637802ff117969db19031Guido van Rossumstatic PyBufferProcs array_as_buffer = {
1949c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (readbufferproc)array_buffer_getreadbuf,
1950c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (writebufferproc)array_buffer_getwritebuf,
1951c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (segcountproc)array_buffer_getsegcount,
1952c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    NULL,
1953fdf95dd525840559d77637802ff117969db19031Guido van Rossum};
1954fdf95dd525840559d77637802ff117969db19031Guido van Rossum
19552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
195699866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1957778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1958b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    int c = -1;
1959b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    PyObject *initial = NULL, *it = NULL, *typecode = NULL;
1960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct arraydescr *descr;
1961c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1962c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
1963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1964c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1965b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    if (!PyArg_ParseTuple(args, "O|O:array", &typecode, &initial))
1966c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1967c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1968b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    if (PyString_Check(typecode) && PyString_GET_SIZE(typecode) == 1)
1969b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        c = (unsigned char)*PyString_AS_STRING(typecode);
1970dc967c137cb5e2e0f558cedbb94a13256db3fb75Serhiy Storchaka#ifdef Py_USING_UNICODE
1971b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    else if (PyUnicode_Check(typecode) && PyUnicode_GET_SIZE(typecode) == 1)
1972b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        c = *PyUnicode_AS_UNICODE(typecode);
1973dc967c137cb5e2e0f558cedbb94a13256db3fb75Serhiy Storchaka#endif
1974b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    else {
1975b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        PyErr_Format(PyExc_TypeError,
1976b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka                     "array() argument 1 or typecode must be char (string or "
1977b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka                     "ascii-unicode with length 1), not %s",
1978b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka                     Py_TYPE(typecode)->tp_name);
1979b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        return NULL;
1980b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    }
1981b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka
1982c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!(initial == NULL || PyList_Check(initial)
1983c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou          || PyString_Check(initial) || PyTuple_Check(initial)
19844ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky          || (c == 'u' && PyUnicode_Check(initial)))) {
1985c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        it = PyObject_GetIter(initial);
1986c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (it == NULL)
1987c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1988c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* We set initial to NULL so that the subsequent code
1989c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           will create an empty array of the appropriate type
1990c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           and afterwards we can use array_iter_extend to populate
1991c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           the array.
1992c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        */
1993c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        initial = NULL;
1994c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1995c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (descr = descriptors; descr->typecode != '\0'; descr++) {
1996c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (descr->typecode == c) {
1997c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *a;
1998c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_ssize_t len;
1999c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
20004ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky            if (initial == NULL || !(PyList_Check(initial)
20014ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky                || PyTuple_Check(initial)))
2002c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                len = 0;
2003c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else
20044ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky                len = PySequence_Size(initial);
2005c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2006c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            a = newarrayobject(type, len, descr);
2007c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (a == NULL)
2008c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
2009c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
20104ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky            if (len > 0) {
2011c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_ssize_t i;
2012c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                for (i = 0; i < len; i++) {
2013c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    PyObject *v =
2014c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PySequence_GetItem(initial, i);
2015c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    if (v == NULL) {
2016c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(a);
2017c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        return NULL;
2018c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    }
2019c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    if (setarrayitem(a, i, v) != 0) {
2020c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(v);
2021c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(a);
2022c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        return NULL;
2023c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    }
2024c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(v);
2025c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            } else if (initial != NULL && PyString_Check(initial)) {
2027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyObject *t_initial, *v;
2028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                t_initial = PyTuple_Pack(1, initial);
2029c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (t_initial == NULL) {
2030c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(a);
2031c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return NULL;
2032c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2033c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                v = array_fromstring((arrayobject *)a,
2034c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                         t_initial);
2035c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(t_initial);
2036c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (v == NULL) {
2037c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(a);
2038c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return NULL;
2039c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2040c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(v);
204199866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
2042c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            } else if (initial != NULL && PyUnicode_Check(initial))  {
2043c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
2044c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (n > 0) {
2045c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    arrayobject *self = (arrayobject *)a;
2046c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    char *item = self->ob_item;
2047c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    item = (char *)PyMem_Realloc(item, n);
2048c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    if (item == NULL) {
2049c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyErr_NoMemory();
2050c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(a);
2051c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        return NULL;
2052c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    }
2053c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    self->ob_item = item;
2054c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_SIZE(self) = n / sizeof(Py_UNICODE);
2055c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    memcpy(item, PyUnicode_AS_DATA(initial), n);
2056c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    self->allocated = Py_SIZE(self);
2057c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
205899866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
2059c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
2060c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (it != NULL) {
2061c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (array_iter_extend((arrayobject *)a, it) == -1) {
2062c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(it);
2063c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(a);
2064c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return NULL;
2065c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2066c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(it);
2067c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
2068c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return a;
2069c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2070c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2071c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetString(PyExc_ValueError,
2072c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
2073c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
2074778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
2075778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
2076778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
207714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(module_doc,
207899866336094bd432860d32dd368f5934683939e7Martin v. Löwis"This module defines an object type which can efficiently represent\n\
2079b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossuman array of basic values: characters, integers, floating point\n\
2080b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumnumbers.  Arrays are sequence types and behave very much like lists,\n\
2081b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumexcept that the type of objects stored in them is constrained.  The\n\
2082b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtype is specified at object creation time by using a type code, which\n\
2083b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumis a single character.  The following type codes are defined:\n\
2084b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2085b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    Type code   C Type             Minimum size in bytes \n\
2086b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'c'         character          1 \n\
2087b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'b'         signed integer     1 \n\
2088b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'B'         unsigned integer   1 \n\
208999866336094bd432860d32dd368f5934683939e7Martin v. Löwis    'u'         Unicode character  2 \n\
2090b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'h'         signed integer     2 \n\
2091b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'H'         unsigned integer   2 \n\
2092b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'i'         signed integer     2 \n\
2093b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'I'         unsigned integer   2 \n\
2094b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'l'         signed integer     4 \n\
2095b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'L'         unsigned integer   4 \n\
2096b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'f'         floating point     4 \n\
2097b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'd'         floating point     8 \n\
2098b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
209999866336094bd432860d32dd368f5934683939e7Martin v. LöwisThe constructor is:\n\
2100b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2101b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumarray(typecode [, initializer]) -- create a new array\n\
210214f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwis");
2103b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
210414f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(arraytype_doc,
210599866336094bd432860d32dd368f5934683939e7Martin v. Löwis"array(typecode [, initializer]) -> array\n\
210699866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
210799866336094bd432860d32dd368f5934683939e7Martin v. LöwisReturn a new array whose items are restricted by typecode, and\n\
21086ab78cd0c055462af4f5a6c59b9f310a83734c45Raymond Hettingerinitialized from the optional initializer value, which must be a list,\n\
2109b918bdc92c96a16cd83dfa431e0ab192fb1a6cc7Florent Xiclunastring or iterable over elements of the appropriate type.\n\
211099866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
211199866336094bd432860d32dd368f5934683939e7Martin v. LöwisArrays represent basic values and behave very much like lists, except\n\
2112b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumthe type of objects stored in them is constrained.\n\
2113b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2114b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumMethods:\n\
2115b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2116b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumappend() -- append a new item to the end of the array\n\
2117b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumbuffer_info() -- return information giving the current memory info\n\
2118b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumbyteswap() -- byteswap all the items of the array\n\
21193e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinsoncount() -- return number of occurrences of an object\n\
212049f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerextend() -- extend array by appending multiple elements from an iterable\n\
2121b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumfromfile() -- read items from a file object\n\
2122b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumfromlist() -- append items from the list\n\
2123b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumfromstring() -- append items from the string\n\
21243e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinsonindex() -- return index of first occurrence of an object\n\
2125b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossuminsert() -- insert a new item into the array at a provided position\n\
21265a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamppop() -- remove and return item (default last)\n\
2127b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumread() -- DEPRECATED, use fromfile()\n\
21283e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinsonremove() -- remove first occurrence of an object\n\
2129b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumreverse() -- reverse the order of the items in the array\n\
2130b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtofile() -- write all items to a file object\n\
2131b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtolist() -- return the array converted to an ordinary list\n\
2132b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtostring() -- return the array converted to a string\n\
2133b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumwrite() -- DEPRECATED, use tofile()\n\
2134b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
213599866336094bd432860d32dd368f5934683939e7Martin v. LöwisAttributes:\n\
2136b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2137b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtypecode -- the typecode character used to create the array\n\
2138b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumitemsize -- the length in bytes of one array item\n\
213914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwis");
2140b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
2141625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyObject *array_iter(arrayobject *ao);
2142625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
21430c32279626d166fe0e09c571fcfc9af25508b1cdTim Petersstatic PyTypeObject Arraytype = {
2144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyVarObject_HEAD_INIT(NULL, 0)
2145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    "array.array",
2146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sizeof(arrayobject),
2147c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,
2148c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (destructor)array_dealloc,                  /* tp_dealloc */
2149c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_print */
2150c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_getattr */
2151c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_setattr */
2152c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_compare */
2153c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (reprfunc)array_repr,                       /* tp_repr */
2154c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_as_number*/
2155c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    &array_as_sequence,                         /* tp_as_sequence*/
2156c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    &array_as_mapping,                          /* tp_as_mapping*/
2157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_hash */
2158c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_call */
2159c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_str */
2160c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GenericGetAttr,                    /* tp_getattro */
2161c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_setattro */
2162c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    &array_as_buffer,                           /* tp_as_buffer*/
2163c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,  /* tp_flags */
2164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arraytype_doc,                              /* tp_doc */
2165c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_traverse */
2166c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_clear */
2167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_richcompare,                          /* tp_richcompare */
2168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    offsetof(arrayobject, weakreflist),         /* tp_weaklistoffset */
2169c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (getiterfunc)array_iter,                    /* tp_iter */
2170c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_iternext */
2171c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_methods,                              /* tp_methods */
2172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_members */
2173c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_getsets,                              /* tp_getset */
2174c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_base */
2175c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_dict */
2176c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_descr_get */
2177c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_descr_set */
2178c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_dictoffset */
2179c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_init */
2180c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyType_GenericAlloc,                        /* tp_alloc */
2181c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_new,                                  /* tp_new */
2182c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_Del,                               /* tp_free */
2183b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum};
2184b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
2185625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2186625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger/*********************** Array Iterator **************************/
2187625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2188625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingertypedef struct {
2189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_HEAD
2190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t                          index;
2191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject                 *ao;
2192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject                    * (*getitem)(struct arrayobject *, Py_ssize_t);
2193625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger} arrayiterobject;
2194625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2195625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyTypeObject PyArrayIter_Type;
2196625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2197625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2198625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2199625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyObject *
2200625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarray_iter(arrayobject *ao)
2201625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayiterobject *it;
2203625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(ao)) {
2205c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_BadInternalCall();
2206c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
2207c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2208625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (it == NULL)
2211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
2212625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(ao);
2214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it->ao = ao;
2215c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it->index = 0;
2216c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it->getitem = ao->ob_descr->getitem;
2217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GC_Track(it);
2218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)it;
2219625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2220625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2221625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyObject *
2222625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarrayiter_next(arrayiterobject *it)
2223625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2224c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(PyArrayIter_Check(it));
2225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (it->index < Py_SIZE(it->ao))
2226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return (*it->getitem)(it->ao, it->index++);
2227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
2228625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2229625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2230625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic void
2231625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarrayiter_dealloc(arrayiterobject *it)
2232625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2233c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GC_UnTrack(it);
2234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(it->ao);
2235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GC_Del(it);
2236625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2237625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2238625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic int
2239625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2240625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2241c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_VISIT(it->ao);
2242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
2243625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2244625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2245625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyTypeObject PyArrayIter_Type = {
2246c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyVarObject_HEAD_INIT(NULL, 0)
2247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    "arrayiterator",                        /* tp_name */
2248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sizeof(arrayiterobject),                /* tp_basicsize */
2249c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_itemsize */
2250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* methods */
2251c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (destructor)arrayiter_dealloc,              /* tp_dealloc */
2252c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_print */
2253c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_getattr */
2254c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_setattr */
2255c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_compare */
2256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_repr */
2257c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_number */
2258c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_sequence */
2259c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_mapping */
2260c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_hash */
2261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_call */
2262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_str */
2263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GenericGetAttr,                /* tp_getattro */
2264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_setattro */
2265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_buffer */
2266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_doc */
2268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (traverseproc)arrayiter_traverse,           /* tp_traverse */
2269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_clear */
2270c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_richcompare */
2271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_weaklistoffset */
2272c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_SelfIter,                          /* tp_iter */
2273c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (iternextfunc)arrayiter_next,               /* tp_iternext */
2274c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_methods */
2275625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger};
2276625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2277625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2278625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger/*********************** Install Module **************************/
2279625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
228099866336094bd432860d32dd368f5934683939e7Martin v. Löwis/* No functions in array module. */
228199866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyMethodDef a_methods[] = {
228299866336094bd432860d32dd368f5934683939e7Martin v. Löwis    {NULL, NULL, 0, NULL}        /* Sentinel */
228399866336094bd432860d32dd368f5934683939e7Martin v. Löwis};
228499866336094bd432860d32dd368f5934683939e7Martin v. Löwis
228599866336094bd432860d32dd368f5934683939e7Martin v. Löwis
2286fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark HammondPyMODINIT_FUNC
2287f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas Woutersinitarray(void)
2288778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
2289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *m;
22900d40ba4cdf6899b126297848f27f07a9cc76acb9Fred Drake
2291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Arraytype.ob_type = &PyType_Type;
2292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyArrayIter_Type.ob_type = &PyType_Type;
2293c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    m = Py_InitModule3("array", a_methods, module_doc);
2294c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (m == NULL)
2295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return;
2296f4e3484692096260e0ea030f4f3490204fb966c6Fred Drake
2297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF((PyObject *)&Arraytype);
2298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF((PyObject *)&Arraytype);
2300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
2301c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* No need to check the error here, the caller will do that */
2302778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
2303