arraymodule.c revision c06a6d0958e2eb4449605069b9c10d656ab756e8
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;
623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           (ihigh-ilow) * a->ob_descr->itemsize);
625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)np;
626778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
627778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
6293aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettingerarray_copy(arrayobject *a, PyObject *unused)
6303aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger{
631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_slice(a, 0, Py_SIZE(a));
6323aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger}
6333aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger
6343aa82c07f709a532de28a39308c23757d3b9c91bRaymond HettingerPyDoc_STRVAR(copy_doc,
6353aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger"copy(array)\n\
6363aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger\n\
6373aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger Return a copy of the array.");
6383aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettinger
6393aa82c07f709a532de28a39308c23757d3b9c91bRaymond Hettingerstatic PyObject *
6409656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_concat(arrayobject *a, PyObject *bb)
641778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
642c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size;
643c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject *np;
644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(bb)) {
645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
646c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             "can only append array (not \"%.200s\") to array",
647c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 Py_TYPE(bb)->tp_name);
648c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
649c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
650778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)bb)
651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (a->ob_descr != b->ob_descr) {
652c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_BadArgument();
653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_NoMemory();
657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size = Py_SIZE(a) + Py_SIZE(b);
659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (np == NULL) {
661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
662c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
664c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
665c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
666c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)np;
667778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
668778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
669778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
67118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_repeat(arrayobject *a, Py_ssize_t n)
672778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
673c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
674c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size;
675c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject *np;
676c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *p;
677c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t nbytes;
678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n < 0)
679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = 0;
680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_NoMemory();
682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size = Py_SIZE(a) * n;
684c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
685c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (np == NULL)
686c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
687c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    p = np->ob_item;
688c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(p, a->ob_item, nbytes);
691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        p += nbytes;
692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *) np;
694778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
695778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
696778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
697ad0a4629beac0600c4c4c3167b0d68be57ca674eMartin v. Löwisarray_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
698778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *item;
700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n; /* Size of replacement array */
701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t d; /* Change in size */
702778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)v)
703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v == NULL)
704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = 0;
705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (array_Check(v)) {
706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = Py_SIZE(b);
707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (a == b) {
708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Special case "a[i:j] = a" -- copy b first */
709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            int ret;
710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            v = array_slice(b, 0, n);
711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!v)
712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ret = array_ass_slice(a, ilow, ihigh, v);
714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(v);
715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return ret;
716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (b->ob_descr != a->ob_descr) {
718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_BadArgument();
719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
720c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
721c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
722c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou         "can only assign array (not \"%.200s\") to array slice",
725c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         Py_TYPE(v)->tp_name);
726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ilow < 0)
729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ilow = 0;
730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ilow > Py_SIZE(a))
731c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ilow = Py_SIZE(a);
732c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ihigh < 0)
733c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = 0;
734c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ihigh < ilow)
735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = ilow;
736c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ihigh > Py_SIZE(a))
737c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ihigh = Py_SIZE(a);
738c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    item = a->ob_item;
739c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    d = n - (ihigh-ilow);
740c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (d < 0) { /* Delete -d items */
741c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memmove(item + (ihigh+d)*a->ob_descr->itemsize,
742c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            item + ihigh*a->ob_descr->itemsize,
743c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
744c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(a) += d;
745c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
746c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                        /* Can't fail */
747c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->ob_item = item;
748c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->allocated = Py_SIZE(a);
749c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
750c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (d > 0) { /* Insert d items */
751c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char,
752c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     (Py_SIZE(a) + d)*a->ob_descr->itemsize);
753c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
754c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
755c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
756c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memmove(item + (ihigh+d)*a->ob_descr->itemsize,
758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            item + ihigh*a->ob_descr->itemsize,
759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->ob_item = item;
761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(a) += d;
762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->allocated = Py_SIZE(a);
763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0)
765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               n*b->ob_descr->itemsize);
767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
768778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
769778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
770778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
771778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
77218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
773778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i < 0 || i >= Py_SIZE(a)) {
775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_IndexError,
776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         "array assignment index out of range");
777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v == NULL)
780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return array_ass_slice(a, i, i+1, v);
781c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (*a->ob_descr->setitem)(a, i, v);
782778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
783778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
784778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
78518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwissetarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
786778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(array_Check(a));
788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_ass_item((arrayobject *)a, i, v);
789778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
790778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
79199866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic int
79249f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerarray_iter_extend(arrayobject *self, PyObject *bb)
79399866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *it, *v;
79599866336094bd432860d32dd368f5934683939e7Martin v. Löwis
796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it = PyObject_GetIter(bb);
797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (it == NULL)
798c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
79949f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger
800c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while ((v = PyIter_Next(it)) != NULL) {
8015e684339c23a6bcac8896a5d25549dbe9d7b8aa6Mark Dickinson        if (ins1(self, Py_SIZE(self), v) != 0) {
802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(v);
803c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(it);
804c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
806c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(v);
807c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(it);
809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_Occurred())
810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
81249f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger}
81349f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger
81449f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerstatic int
81549f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerarray_do_extend(arrayobject *self, PyObject *bb)
81649f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger{
817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size;
818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *old_item;
81949f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger
820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(bb))
821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return array_iter_extend(self, bb);
82299866336094bd432860d32dd368f5934683939e7Martin v. Löwis#define b ((arrayobject *)bb)
823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_descr != b->ob_descr) {
824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     "can only extend with array of same kind");
826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
827c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
830c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size = Py_SIZE(self) + Py_SIZE(b);
834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    old_item = self->ob_item;
835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_item == NULL) {
837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = old_item;
838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
841c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
842c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
843c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_SIZE(self) = size;
844c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    self->allocated = size;
845c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
84799866336094bd432860d32dd368f5934683939e7Martin v. Löwis#undef b
84899866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
84999866336094bd432860d32dd368f5934683939e7Martin v. Löwis
85099866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
85199866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_inplace_concat(arrayobject *self, PyObject *bb)
85299866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
853c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(bb)) {
854c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "can only extend array with array (not \"%.200s\")",
856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_TYPE(bb)->tp_name);
857c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
858c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
859c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (array_do_extend(self, bb) == -1)
860c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(self);
862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)self;
86399866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
86499866336094bd432860d32dd368f5934683939e7Martin v. Löwis
86599866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
86618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_inplace_repeat(arrayobject *self, Py_ssize_t n)
86799866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
868c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *items, *p;
869c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t size, i;
870c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
871c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(self) > 0) {
872c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (n < 0)
873c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            n = 0;
874c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        items = self->ob_item;
875c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if ((self->ob_descr->itemsize != 0) &&
876c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
877c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyErr_NoMemory();
878c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
879c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size = Py_SIZE(self) * self->ob_descr->itemsize;
880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (n == 0) {
881c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyMem_FREE(items);
882c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->ob_item = NULL;
883c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_SIZE(self) = 0;
884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->allocated = 0;
885c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
886c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
887c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (size > PY_SSIZE_T_MAX / n) {
888c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return PyErr_NoMemory();
889c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
890c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyMem_RESIZE(items, char, n * size);
891c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (items == NULL)
892c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return PyErr_NoMemory();
893c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p = items;
894c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            for (i = 1; i < n; i++) {
895c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                p += size;
896c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                memcpy(p, items, size);
897c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
898c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->ob_item = items;
899c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_SIZE(self) *= n;
900c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->allocated = Py_SIZE(self);
901c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
902c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
903c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(self);
904c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)self;
90599866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
90699866336094bd432860d32dd368f5934683939e7Martin v. Löwis
90799866336094bd432860d32dd368f5934683939e7Martin v. Löwis
9082919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
90918e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisins(arrayobject *self, Py_ssize_t where, PyObject *v)
910778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
911c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ins1(self, where, v) != 0)
912c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
913c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
914c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
915778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
916778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
9172919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
91836cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_count(arrayobject *self, PyObject *v)
9195a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
920c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t count = 0;
921c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
9225a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
923c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
924c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self, i);
925c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
926c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
927c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cmp > 0)
928c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            count++;
929c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (cmp < 0)
930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
931c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
932c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromSsize_t(count);
9335a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
9345a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
93514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(count_doc,
936077a11dd00092fead641b9f2bd824790791512c7Tim Peters"count(x)\n\
9375a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
9383e4caeb3bf2b2579861e9f3379e3508fbb30549cMark DickinsonReturn number of occurrences of x in the array.");
9395a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
9405a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
94136cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_index(arrayobject *self, PyObject *v)
9425a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
943c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
9445a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
945c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
946c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self, i);
947c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
948c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
949c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cmp > 0) {
950c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyInt_FromLong((long)i);
951c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
952c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (cmp < 0)
953c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
954c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
955c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
956c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
9575a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
9585a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
95914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(index_doc,
960077a11dd00092fead641b9f2bd824790791512c7Tim Peters"index(x)\n\
9615a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
9623e4caeb3bf2b2579861e9f3379e3508fbb30549cMark DickinsonReturn index of first occurrence of x in the array.");
9635a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
964625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic int
965625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarray_contains(arrayobject *self, PyObject *v)
966625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
967c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
968c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int cmp;
969625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
970c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
971c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self, i);
972c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
973c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
974c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
975c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return cmp;
976625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
977625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
9785a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
97936cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_remove(arrayobject *self, PyObject *v)
9805a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
981c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
982c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
983c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
984c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *selfi = getarrayitem((PyObject *)self,i);
985c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
986c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(selfi);
987c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cmp > 0) {
988c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (array_ass_slice(self, i, i+1,
989c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                               (PyObject *)NULL) != 0)
990c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
991c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_INCREF(Py_None);
992c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return Py_None;
993c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
994c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (cmp < 0)
995c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
996c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
997c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
998c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
9995a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
10005a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
100114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(remove_doc,
1002077a11dd00092fead641b9f2bd824790791512c7Tim Peters"remove(x)\n\
10035a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
10043e4caeb3bf2b2579861e9f3379e3508fbb30549cMark DickinsonRemove the first occurrence of x in the array.");
10055a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
10065a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
10075a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamparray_pop(arrayobject *self, PyObject *args)
10085a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
1009c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i = -1;
1010c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v;
1011c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "|n:pop", &i))
1012c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1013c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(self) == 0) {
1014c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Special-case most common failure cause */
1015c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_IndexError, "pop from empty array");
1016c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1017c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1018c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i < 0)
1019c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        i += Py_SIZE(self);
1020c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i < 0 || i >= Py_SIZE(self)) {
1021c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_IndexError, "pop index out of range");
1022c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1023c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1024c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    v = getarrayitem((PyObject *)self,i);
1025c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(v);
1027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1029c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return v;
10305a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
10315a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
103214f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(pop_doc,
1033077a11dd00092fead641b9f2bd824790791512c7Tim Peters"pop([i])\n\
10345a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
103514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisReturn the i-th element and delete it from the array. i defaults to -1.");
10365a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
10375a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
103836cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_extend(arrayobject *self, PyObject *bb)
10395a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp{
1040c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (array_do_extend(self, bb) == -1)
1041c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1042c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1043c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
10445a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp}
10455a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
104614f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(extend_doc,
104749f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger"extend(array or iterable)\n\
10485a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp\n\
104949f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettinger Append items to the end of the array.");
10505a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamp
10515a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kampstatic PyObject *
10529656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_insert(arrayobject *self, PyObject *args)
1053778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1054c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
1055c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v;
1056c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
1057c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1058c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return ins(self, i, v);
1059778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1060778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
106114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(insert_doc,
1062077a11dd00092fead641b9f2bd824790791512c7Tim Peters"insert(i,x)\n\
1063b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
106414f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisInsert a new item x into the array before position i.");
1065b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1066b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
10672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
106836cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_buffer_info(arrayobject *self, PyObject *unused)
1069de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossum{
1070c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject* retval = NULL;
1071c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    retval = PyTuple_New(2);
1072c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!retval)
1073c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1074541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake
1075c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1076c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
1077541dc3b7b2606906e0ee2d9088a984443b1fa64cFred Drake
1078c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return retval;
1079de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossum}
1080de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossum
108114f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(buffer_info_doc,
1082077a11dd00092fead641b9f2bd824790791512c7Tim Peters"buffer_info() -> (address, length)\n\
1083b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1084b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumReturn a tuple (address, length) giving the current memory address and\n\
1085702d08ec05ba66831b5c95a9643a7ebbb6d67795Guido van Rossumthe length in items of the buffer used to hold array's contents\n\
1086702d08ec05ba66831b5c95a9643a7ebbb6d67795Guido van RossumThe length should be multiplied by the itemsize attribute to calculate\n\
108714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisthe buffer length in bytes.");
1088b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1089b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1090de4a4ca2dd1a2bb2e65e32f7760b756a5f7788c4Guido van Rossumstatic PyObject *
109136cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_append(arrayobject *self, PyObject *v)
1092778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
10935e684339c23a6bcac8896a5d25549dbe9d7b8aa6Mark Dickinson    return ins(self, Py_SIZE(self), v);
1094778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1095778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
109614f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(append_doc,
1097b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"append(x)\n\
1098b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
109914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisAppend new value x to the end of the array.");
1100b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1101b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
11022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
110336cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_byteswap(arrayobject *self, PyObject *unused)
1104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1105c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *p;
1106c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
1107c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1108c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (self->ob_descr->itemsize) {
1109c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 1:
1110c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1111c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 2:
1112c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1113c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p0 = p[0];
1114c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[0] = p[1];
1115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[1] = p0;
1116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1117c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1118c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 4:
1119c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1120c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p0 = p[0];
1121c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p1 = p[1];
1122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[0] = p[3];
1123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[1] = p[2];
1124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[2] = p1;
1125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[3] = p0;
1126c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1127c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1128c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 8:
1129c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1130c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p0 = p[0];
1131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p1 = p[1];
1132c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p2 = p[2];
1133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char p3 = p[3];
1134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[0] = p[7];
1135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[1] = p[6];
1136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[2] = p[5];
1137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[3] = p[4];
1138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[4] = p3;
1139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[5] = p2;
1140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[6] = p1;
1141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p[7] = p0;
1142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1143c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
1145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_RuntimeError,
1146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   "don't know how to byteswap this array type");
1147c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1148c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1149c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1150c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1151778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1152778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
115314f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(byteswap_doc,
1154bf272983643776e9842cad6d1885f1b92f5eb67fFred Drake"byteswap()\n\
1155b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1156bf272983643776e9842cad6d1885f1b92f5eb67fFred DrakeByteswap all items of the array.  If the items in the array are not 1, 2,\n\
115714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwis4, or 8 bytes in size, RuntimeError is raised.");
1158b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
11592919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
116036cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_reverse(arrayobject *self, PyObject *unused)
1161778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1162c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    register Py_ssize_t itemsize = self->ob_descr->itemsize;
1163c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    register char *p, *q;
1164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* little buffer to hold items while swapping */
1165c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char tmp[256];      /* 8 is probably enough -- but why skimp */
1166c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert((size_t)itemsize <= sizeof(tmp));
1167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_SIZE(self) > 1) {
1169c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (p = self->ob_item,
1170c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1171c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             p < q;
1172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             p += itemsize, q -= itemsize) {
1173c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* memory areas guaranteed disjoint, so memcpy
1174c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             * is safe (& memmove may be slower).
1175c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             */
1176c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(tmp, p, itemsize);
1177c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(p, q, itemsize);
1178c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(q, tmp, itemsize);
1179c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1180c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1181c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1182c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1183c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1184778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1185e77a757094f68351f336044654cd91575c677896Guido van Rossum
118614f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(reverse_doc,
1187b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"reverse()\n\
1188b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
118914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisReverse the order of the items in the array.");
1190b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
11912919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
11929656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_fromfile(arrayobject *self, PyObject *args)
1193778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *f;
1195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    FILE *fp;
1197c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
1198c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1199c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    fp = PyFile_AsFile(f);
1200c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (fp == NULL) {
1201c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
1202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1203c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1205c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *item = self->ob_item;
1206c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t itemsize = self->ob_descr->itemsize;
1207c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t nread;
1208c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t newlength;
1209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t newbytes;
1210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Be careful here about overflow */
1211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if ((newlength = Py_SIZE(self) + n) <= 0 ||
1212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (newbytes = newlength * itemsize) / itemsize !=
1213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (size_t)newlength)
1214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            goto nomem;
1215c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, newbytes);
1216c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou          nomem:
1218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1219c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1221c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = item;
1222c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1223c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1224c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        nread = fread(item + (Py_SIZE(self) - n) * itemsize,
1225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      itemsize, n, fp);
1226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (nread < (size_t)n) {
1227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou          Py_SIZE(self) -= (n - nread);
1228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
1229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->ob_item = item;
1230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            self->allocated = Py_SIZE(self);
12317a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            if (ferror(fp)) {
12327a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                PyErr_SetFromErrno(PyExc_IOError);
12337a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                clearerr(fp);
12347a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            }
12357a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            else {
12367a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                PyErr_SetString(PyExc_EOFError,
12377a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou                                "not enough items in file");
12387a7013e8304a5e54782330fe91e96e510d63e72eAntoine Pitrou            }
1239c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1240c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1241c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1243c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1244778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1245778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
124614f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromfile_doc,
1247b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"fromfile(f, n)\n\
1248b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1249b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumRead n objects from the file object f and append them to the end of the\n\
125014f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisarray.  Also called as read.");
1251b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1252b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
12532919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
12541e7c37514db417a495a1118c0b6d753d88249853Georg Brandlarray_fromfile_as_read(arrayobject *self, PyObject *args)
12551e7c37514db417a495a1118c0b6d753d88249853Georg Brandl{
1256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
1257c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       "use array.fromfile()", 1) < 0)
1258c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1259c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_fromfile(self, args);
12601e7c37514db417a495a1118c0b6d753d88249853Georg Brandl}
12611e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
12621e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
12631e7c37514db417a495a1118c0b6d753d88249853Georg Brandlstatic PyObject *
126436cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tofile(arrayobject *self, PyObject *f)
1265778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    FILE *fp;
1267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    fp = PyFile_AsFile(f);
1269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (fp == NULL) {
1270c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError, "arg must be open file");
1271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1272c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1273c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_size > 0) {
1274c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (fwrite(self->ob_item, self->ob_descr->itemsize,
1275c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   self->ob_size, fp) != (size_t)self->ob_size) {
1276c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetFromErrno(PyExc_IOError);
1277c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            clearerr(fp);
1278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1282c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1283778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1284778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
128514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tofile_doc,
1286b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"tofile(f)\n\
1287b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1288b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumWrite all items (as machine values) to the file object f.  Also called as\n\
128914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwiswrite.");
1290b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1291b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
12922919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
12931e7c37514db417a495a1118c0b6d753d88249853Georg Brandlarray_tofile_as_write(arrayobject *self, PyObject *f)
12941e7c37514db417a495a1118c0b6d753d88249853Georg Brandl{
1295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
1296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       "use array.tofile()", 1) < 0)
1297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return array_tofile(self, f);
12991e7c37514db417a495a1118c0b6d753d88249853Georg Brandl}
13001e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
13011e7c37514db417a495a1118c0b6d753d88249853Georg Brandl
13021e7c37514db417a495a1118c0b6d753d88249853Georg Brandlstatic PyObject *
130336cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_fromlist(arrayobject *self, PyObject *list)
1304778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t itemsize = self->ob_descr->itemsize;
1307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1308c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyList_Check(list)) {
1309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError, "arg must be list");
1310c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1311c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = PyList_Size(list);
1313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *item = self->ob_item;
1315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i;
1316c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
1317c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1318c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1319c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1320c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = item;
1322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1324c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (i = 0; i < n; i++) {
1325c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *v = PyList_GetItem(list, i);
1326c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if ((*self->ob_descr->setitem)(self,
1327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            Py_SIZE(self) - n + i, v) != 0) {
1328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_SIZE(self) -= n;
1329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return PyErr_NoMemory();
1331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
1332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyMem_RESIZE(item, char,
1333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  Py_SIZE(self) * itemsize);
1334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item = item;
1335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->allocated = Py_SIZE(self);
1336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
1337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1340c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1341c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1342778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1343778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
134414f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromlist_doc,
1345b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"fromlist(list)\n\
1346b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
134714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisAppend items to array from list.");
1348b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1349b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
13502919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
135136cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tolist(arrayobject *self, PyObject *unused)
1352778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *list = PyList_New(Py_SIZE(self));
1354c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i;
135536cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettinger
1356c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (list == NULL)
1357c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1358c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < Py_SIZE(self); i++) {
1359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *v = getarrayitem((PyObject *)self, i);
1360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (v == NULL) {
1361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(list);
1362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1364c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyList_SetItem(list, i, v);
1365c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return list;
1367778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1368778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
136914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tolist_doc,
1370fc6aba5008caede94ad65a9cf387b3ba971d5379Guido van Rossum"tolist() -> list\n\
1371b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
137214f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisConvert array to an ordinary list with the same items.");
1373b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1374b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
13752919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
13769656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_fromstring(arrayobject *self, PyObject *args)
1377778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1378c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *str;
1379c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int itemsize = self->ob_descr->itemsize;
1381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
1382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1383cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka    if (str == self->ob_item) {
1384cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka        PyErr_SetString(PyExc_ValueError,
1385cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka                        "array.fromstring(x): x cannot be self");
1386cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka        return NULL;
1387cf74c1996e084aa840db0782da833f640a3923e3Serhiy Storchaka    }
1388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n % itemsize != 0) {
1389c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
1390c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   "string length not a multiple of item size");
1391c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1392c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1393c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = n / itemsize;
1394c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1395c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *item = self->ob_item;
1396c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1397c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1398c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return PyErr_NoMemory();
1399c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
1401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1405c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = item;
1406c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1407c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(item + (Py_SIZE(self) - n) * itemsize,
1409c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               str, itemsize*n);
1410c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
1413778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1414778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
141514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromstring_doc,
1416b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"fromstring(string)\n\
1417b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1418b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumAppends items from the string, interpreting it as an array of machine\n\
141914f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisvalues,as if it had been read from a file using the fromfile() method).");
1420b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
1421b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
14222919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
142336cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tostring(arrayobject *self, PyObject *unused)
1424778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyString_FromStringAndSize(self->ob_item,
1427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            Py_SIZE(self) * self->ob_descr->itemsize);
1428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } else {
1429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_NoMemory();
1430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1431778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1432778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
143314f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tostring_doc,
1434b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum"tostring() -> string\n\
1435b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
1436b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumConvert the array to an array of machine values and return the string\n\
143714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisrepresentation.");
1438b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
143999866336094bd432860d32dd368f5934683939e7Martin v. Löwis
144099866336094bd432860d32dd368f5934683939e7Martin v. Löwis
144199866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
144299866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
144399866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_fromunicode(arrayobject *self, PyObject *args)
144499866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_UNICODE *ustr;
1446c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t n;
1447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_descr->typecode != 'u') {
1451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
1452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "fromunicode() may only be called on "
1453c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "type 'u' arrays");
1454c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1455c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0) {
1457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1459c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyErr_NoMemory();
1460c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1461c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
1462c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (item == NULL) {
1463c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
1464c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1465c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1466c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->ob_item = (char *) item;
1467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_SIZE(self) += n;
1468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        self->allocated = Py_SIZE(self);
1469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memcpy(item + Py_SIZE(self) - n,
1470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               ustr, n * sizeof(Py_UNICODE));
1471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
1474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
147599866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
147699866336094bd432860d32dd368f5934683939e7Martin v. Löwis
147714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(fromunicode_doc,
147899866336094bd432860d32dd368f5934683939e7Martin v. Löwis"fromunicode(ustr)\n\
147999866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
148099866336094bd432860d32dd368f5934683939e7Martin v. LöwisExtends this array with data from the unicode string ustr.\n\
148199866336094bd432860d32dd368f5934683939e7Martin v. LöwisThe array must be a type 'u' array; otherwise a ValueError\n\
148299866336094bd432860d32dd368f5934683939e7Martin v. Löwisis raised.  Use array.fromstring(ustr.decode(...)) to\n\
148314f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisappend Unicode data to an array of some other type.");
148499866336094bd432860d32dd368f5934683939e7Martin v. Löwis
148599866336094bd432860d32dd368f5934683939e7Martin v. Löwis
148699866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
148736cd2bf4596fdffee0392335aca8bd221d46584aRaymond Hettingerarray_tounicode(arrayobject *self, PyObject *unused)
148899866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (self->ob_descr->typecode != 'u') {
1490c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
1491c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "tounicode() may only be called on type 'u' arrays");
1492c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1493c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
149599866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
149699866336094bd432860d32dd368f5934683939e7Martin v. Löwis
149714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(tounicode_doc,
149899866336094bd432860d32dd368f5934683939e7Martin v. Löwis"tounicode() -> unicode\n\
149999866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
150099866336094bd432860d32dd368f5934683939e7Martin v. LöwisConvert the array to a unicode string.  The array must be\n\
150199866336094bd432860d32dd368f5934683939e7Martin v. Löwisa type 'u' array; otherwise a ValueError is raised.  Use\n\
150299866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray.tostring().decode() to obtain a unicode string from\n\
150314f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwisan array of some other type.");
150499866336094bd432860d32dd368f5934683939e7Martin v. Löwis
150599866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif /* Py_USING_UNICODE */
150699866336094bd432860d32dd368f5934683939e7Martin v. Löwis
1507999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalottistatic PyObject *
1508999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalottiarray_reduce(arrayobject *array)
1509999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalotti{
1510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *dict, *result, *list;
1511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (dict == NULL) {
1514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Clear();
1517c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        dict = Py_None;
1518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(dict);
1519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Unlike in Python 3.x, we never use the more efficient memory
1521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * representation of an array for pickling.  This is unfortunately
1522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * necessary to allow array objects to be unpickled by Python 3.x,
1523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * since str objects from 2.x are always decoded to unicode in
1524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * Python 3.x.
1525c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     */
1526c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    list = array_tolist(array, NULL);
1527c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (list == NULL) {
1528c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(dict);
1529c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1531c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    result = Py_BuildValue(
1532c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        "O(cO)O", Py_TYPE(array), array->ob_descr->typecode, list, dict);
1533c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(list);
1534c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(dict);
1535c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return result;
1536999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalotti}
1537999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre Vassalotti
1538999ecc0eaf88dc73c386d360183c3899242e7ffdAlexandre VassalottiPyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
153999866336094bd432860d32dd368f5934683939e7Martin v. Löwis
154099866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
15412d639d5665739886e2044b2c92d2e157ee0161aaMeador Ingearray_sizeof(arrayobject *self, PyObject *unused)
15422d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge{
15432d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge    Py_ssize_t res;
1544c06a6d0958e2eb4449605069b9c10d656ab756e8Serhiy Storchaka    res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * self->ob_descr->itemsize;
15452d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge    return PyLong_FromSsize_t(res);
15462d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge}
15472d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge
15482d639d5665739886e2044b2c92d2e157ee0161aaMeador IngePyDoc_STRVAR(sizeof_doc,
15492d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge"__sizeof__() -> int\n\
15502d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge\n\
15512d639d5665739886e2044b2c92d2e157ee0161aaMeador IngeSize of the array in memory, in bytes.");
15522d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge
15532d639d5665739886e2044b2c92d2e157ee0161aaMeador Ingestatic PyObject *
155499866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_get_typecode(arrayobject *a, void *closure)
155599866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char tc = a->ob_descr->typecode;
1557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyString_FromStringAndSize(&tc, 1);
155899866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
155999866336094bd432860d32dd368f5934683939e7Martin v. Löwis
156099866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyObject *
156199866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_get_itemsize(arrayobject *a, void *closure)
156299866336094bd432860d32dd368f5934683939e7Martin v. Löwis{
1563c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong((long)a->ob_descr->itemsize);
156499866336094bd432860d32dd368f5934683939e7Martin v. Löwis}
156599866336094bd432860d32dd368f5934683939e7Martin v. Löwis
156699866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyGetSetDef array_getsets [] = {
1567c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"typecode", (getter) array_get_typecode, NULL,
1568c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     "the typecode character used to create the array"},
1569c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"itemsize", (getter) array_get_itemsize, NULL,
1570c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     "the size, in bytes, of one array item"},
1571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {NULL}
157299866336094bd432860d32dd368f5934683939e7Martin v. Löwis};
157399866336094bd432860d32dd368f5934683939e7Martin v. Löwis
1574111c180674379950f65113db8076919b2353f5abMartin v. Löwisstatic PyMethodDef array_methods[] = {
1575c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"append",          (PyCFunction)array_append,      METH_O,
1576c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     append_doc},
1577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
1578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     buffer_info_doc},
1579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"byteswap",        (PyCFunction)array_byteswap,    METH_NOARGS,
1580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     byteswap_doc},
1581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"__copy__",        (PyCFunction)array_copy,        METH_NOARGS,
1582c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     copy_doc},
1583c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"count",           (PyCFunction)array_count,       METH_O,
1584c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     count_doc},
1585c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"__deepcopy__",(PyCFunction)array_copy,            METH_O,
1586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     copy_doc},
1587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"extend",      (PyCFunction)array_extend,          METH_O,
1588c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     extend_doc},
1589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromfile",        (PyCFunction)array_fromfile,    METH_VARARGS,
1590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromfile_doc},
1591c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromlist",        (PyCFunction)array_fromlist,    METH_O,
1592c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromlist_doc},
1593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromstring",      (PyCFunction)array_fromstring,  METH_VARARGS,
1594c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromstring_doc},
159599866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
1596c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"fromunicode",     (PyCFunction)array_fromunicode, METH_VARARGS,
1597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromunicode_doc},
159899866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
1599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"index",           (PyCFunction)array_index,       METH_O,
1600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     index_doc},
1601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"insert",          (PyCFunction)array_insert,      METH_VARARGS,
1602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     insert_doc},
1603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"pop",             (PyCFunction)array_pop,         METH_VARARGS,
1604c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     pop_doc},
1605c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"read",            (PyCFunction)array_fromfile_as_read,    METH_VARARGS,
1606c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     fromfile_doc},
1607c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"__reduce__",      (PyCFunction)array_reduce,      METH_NOARGS,
1608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     reduce_doc},
1609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"remove",          (PyCFunction)array_remove,      METH_O,
1610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     remove_doc},
1611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"reverse",         (PyCFunction)array_reverse,     METH_NOARGS,
1612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     reverse_doc},
1613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou/*      {"sort",        (PyCFunction)array_sort,        METH_VARARGS,
1614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sort_doc},*/
1615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tofile",          (PyCFunction)array_tofile,      METH_O,
1616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tofile_doc},
1617c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tolist",          (PyCFunction)array_tolist,      METH_NOARGS,
1618c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tolist_doc},
1619c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tostring",        (PyCFunction)array_tostring,    METH_NOARGS,
1620c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tostring_doc},
162199866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
1622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tounicode",   (PyCFunction)array_tounicode,       METH_NOARGS,
1623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tounicode_doc},
162499866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
1625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"write",           (PyCFunction)array_tofile_as_write,     METH_O,
1626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     tofile_doc},
16272d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge    {"__sizeof__",      (PyCFunction)array_sizeof,      METH_NOARGS,
16282d639d5665739886e2044b2c92d2e157ee0161aaMeador Inge     sizeof_doc},
1629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {NULL,              NULL}           /* sentinel */
1630778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1631778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
16322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
16339656abd913d359ecd48b07f4b4237b007f26d778Peter Schneider-Kamparray_repr(arrayobject *a)
1634778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char buf[256], typecode;
1636c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *s, *t, *v = NULL;
1637c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t len;
1638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    len = Py_SIZE(a);
1640c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    typecode = a->ob_descr->typecode;
1641c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (len == 0) {
1642c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
1643c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyString_FromString(buf);
1644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1646c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (typecode == 'c')
1647c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = array_tostring(a, NULL);
16481755ad9b026d63bbff707e0d33b738e18499b3e9Michael W. Hudson#ifdef Py_USING_UNICODE
1649c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (typecode == 'u')
1650c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = array_tounicode(a, NULL);
16511755ad9b026d63bbff707e0d33b738e18499b3e9Michael W. Hudson#endif
1652c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
1653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = array_tolist(a, NULL);
1654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    t = PyObject_Repr(v);
1655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(v);
165688ba1e39ecf32d0a2328358351fff3006a5b30b9Raymond Hettinger
1657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
1658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    s = PyString_FromString(buf);
1659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyString_ConcatAndDel(&s, t);
1660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyString_ConcatAndDel(&s, PyString_FromString(")"));
1661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return s;
1662778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1663778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
16649c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonstatic PyObject*
16659c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonarray_subscr(arrayobject* self, PyObject* item)
16669c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson{
1667c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyIndex_Check(item)) {
1668c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i==-1 && PyErr_Occurred()) {
1670c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1671c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1672c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i < 0)
1673c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            i += Py_SIZE(self);
1674c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return array_item(self, i);
1675c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1676c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (PySlice_Check(item)) {
1677c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t start, stop, step, slicelength, cur, i;
1678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject* result;
1679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arrayobject* ar;
1680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int itemsize = self->ob_descr->itemsize;
1681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
1683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         &start, &stop, &step, &slicelength) < 0) {
1684c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1685c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1686c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1687c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (slicelength <= 0) {
1688c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return newarrayobject(&Arraytype, 0, self->ob_descr);
1689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (step == 1) {
1691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *result = newarrayobject(&Arraytype,
1692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                    slicelength, self->ob_descr);
1693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (result == NULL)
1694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
1695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(((arrayobject *)result)->ob_item,
1696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   self->ob_item + start * itemsize,
1697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   slicelength * itemsize);
1698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return result;
1699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
1701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!result) return NULL;
1703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ar = (arrayobject*)result;
1705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            for (cur = start, i = 0; i < slicelength;
1707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 cur += step, i++) {
1708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                memcpy(ar->ob_item + i*itemsize,
1709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       self->ob_item + cur*itemsize,
1710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       itemsize);
1711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return result;
1714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
1718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "array indices must be integers");
1719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1720c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
17219c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson}
17229c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson
17239c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonstatic int
17249c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonarray_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
17259c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson{
1726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t start, stop, step, slicelength, needed;
1727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject* other;
1728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int itemsize;
1729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyIndex_Check(item)) {
1731c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1732c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1733c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i == -1 && PyErr_Occurred())
1734c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i < 0)
1736c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            i += Py_SIZE(self);
1737c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i < 0 || i >= Py_SIZE(self)) {
1738c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_IndexError,
1739c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "array assignment index out of range");
1740c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1741c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1742c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (value == NULL) {
1743c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Fall through to slice assignment */
1744c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            start = i;
1745c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            stop = i + 1;
1746c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            step = 1;
1747c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            slicelength = 1;
1748c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1749c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
1750c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return (*self->ob_descr->setitem)(self, i, value);
1751c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1752c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (PySlice_Check(item)) {
1753c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PySlice_GetIndicesEx((PySliceObject *)item,
1754c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 Py_SIZE(self), &start, &stop,
1755c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 &step, &slicelength) < 0) {
1756c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
1761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "array indices must be integer");
1762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (value == NULL) {
1765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        other = NULL;
1766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        needed = 0;
1767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (array_Check(value)) {
1769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        other = (arrayobject *)value;
1770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        needed = Py_SIZE(other);
1771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (self == other) {
1772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Special case "self[i:j] = self" -- copy self first */
1773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            int ret;
1774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            value = array_slice(other, 0, needed);
1775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (value == NULL)
1776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
1777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ret = array_ass_subscr(self, item, value);
1778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(value);
1779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return ret;
1780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1781c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (other->ob_descr != self->ob_descr) {
1782c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_BadArgument();
1783c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1784c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1785c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1786c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_TypeError,
1788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou         "can only assign array (not \"%.200s\") to array slice",
1789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         Py_TYPE(value)->tp_name);
1790c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1791c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1792c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    itemsize = self->ob_descr->itemsize;
1793c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((step > 0 && stop < start) ||
1795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        (step < 0 && stop > start))
1796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        stop = start;
1797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (step == 1) {
1798c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (slicelength > needed) {
1799c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (start + needed) * itemsize,
1800c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + stop * itemsize,
1801c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (Py_SIZE(self) - stop) * itemsize);
1802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (array_resize(self, Py_SIZE(self) +
1803c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                             needed - slicelength) < 0)
1804c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
1805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1806c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (slicelength < needed) {
1807c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (array_resize(self, Py_SIZE(self) +
1808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                             needed - slicelength) < 0)
1809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
1810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (start + needed) * itemsize,
1811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + stop * itemsize,
1812c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (Py_SIZE(self) - start - needed) * itemsize);
1813c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1814c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (needed > 0)
1815c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(self->ob_item + start * itemsize,
1816c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   other->ob_item, needed * itemsize);
1817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (needed == 0) {
1820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Delete slice */
1821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t cur;
1822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t i;
1823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (step < 0) {
1825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            stop = start + 1;
1826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            start = stop + step * (slicelength - 1) - 1;
1827c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            step = -step;
1828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (cur = start, i = 0; i < slicelength;
1830c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             cur += step, i++) {
1831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_ssize_t lim = step - 1;
1832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (cur + step >= (size_t)Py_SIZE(self))
1834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                lim = Py_SIZE(self) - cur - 1;
1835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (cur - i) * itemsize,
1836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + (cur + 1) * itemsize,
1837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                lim * itemsize);
1838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        cur = start + slicelength * step;
1840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cur < (size_t)Py_SIZE(self)) {
1841c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memmove(self->ob_item + (cur-slicelength) * itemsize,
1842c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                self->ob_item + cur * itemsize,
1843c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (Py_SIZE(self) - cur) * itemsize);
1844c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1845c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
1846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1847c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1849c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1850c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t cur, i;
1851c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1852c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (needed != slicelength) {
1853c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_Format(PyExc_ValueError,
1854c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "attempt to assign array of size %zd "
1855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "to extended slice of size %zd",
1856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                needed, slicelength);
1857c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
1858c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1859c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (cur = start, i = 0; i < slicelength;
1860c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou             cur += step, i++) {
1861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(self->ob_item + cur * itemsize,
1862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   other->ob_item + i * itemsize,
1863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   itemsize);
1864c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1865c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1866c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
18679c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson}
18689c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson
18699c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudsonstatic PyMappingMethods array_as_mapping = {
1870c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (lenfunc)array_length,
1871c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (binaryfunc)array_subscr,
1872c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (objobjargproc)array_ass_subscr
18739c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson};
18749c14badc5fed3c28504470ba4bd64bf7acad599fMichael W. Hudson
187501a807db2a4b2d39d8e9473e658b908ff58e1058Raymond Hettingerstatic const void *emptybuf = "";
187601a807db2a4b2d39d8e9473e658b908ff58e1058Raymond Hettinger
187718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
187818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
1879fdf95dd525840559d77637802ff117969db19031Guido van Rossum{
1880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ( index != 0 ) {
1881c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
1882c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "Accessing non-existent array segment");
1883c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1885c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    *ptr = (void *)self->ob_item;
1886c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (*ptr == NULL)
1887c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *ptr = emptybuf;
1888c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_SIZE(self)*self->ob_descr->itemsize;
1889fdf95dd525840559d77637802ff117969db19031Guido van Rossum}
1890fdf95dd525840559d77637802ff117969db19031Guido van Rossum
189118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
189218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
1893fdf95dd525840559d77637802ff117969db19031Guido van Rossum{
1894c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ( index != 0 ) {
1895c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
1896c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "Accessing non-existent array segment");
1897c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
1898c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1899c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    *ptr = (void *)self->ob_item;
1900c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (*ptr == NULL)
1901c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *ptr = emptybuf;
1902c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_SIZE(self)*self->ob_descr->itemsize;
1903fdf95dd525840559d77637802ff117969db19031Guido van Rossum}
1904fdf95dd525840559d77637802ff117969db19031Guido van Rossum
190518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
190618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisarray_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
1907fdf95dd525840559d77637802ff117969db19031Guido van Rossum{
1908c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ( lenp )
1909c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
1910c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1911fdf95dd525840559d77637802ff117969db19031Guido van Rossum}
1912fdf95dd525840559d77637802ff117969db19031Guido van Rossum
19132919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PySequenceMethods array_as_sequence = {
1914c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (lenfunc)array_length,                      /*sq_length*/
1915c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (binaryfunc)array_concat,               /*sq_concat*/
1916c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeargfunc)array_repeat,                 /*sq_repeat*/
1917c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeargfunc)array_item,                           /*sq_item*/
1918c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizessizeargfunc)array_slice,             /*sq_slice*/
1919c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeobjargproc)array_ass_item,                    /*sq_ass_item*/
1920c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizessizeobjargproc)array_ass_slice,      /*sq_ass_slice*/
1921c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (objobjproc)array_contains,                 /*sq_contains*/
1922c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (binaryfunc)array_inplace_concat,           /*sq_inplace_concat*/
1923c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (ssizeargfunc)array_inplace_repeat          /*sq_inplace_repeat*/
1924778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1925778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1926fdf95dd525840559d77637802ff117969db19031Guido van Rossumstatic PyBufferProcs array_as_buffer = {
1927c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (readbufferproc)array_buffer_getreadbuf,
1928c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (writebufferproc)array_buffer_getwritebuf,
1929c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (segcountproc)array_buffer_getsegcount,
1930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    NULL,
1931fdf95dd525840559d77637802ff117969db19031Guido van Rossum};
1932fdf95dd525840559d77637802ff117969db19031Guido van Rossum
19332919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
193499866336094bd432860d32dd368f5934683939e7Martin v. Löwisarray_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1935778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1936b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    int c = -1;
1937b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    PyObject *initial = NULL, *it = NULL, *typecode = NULL;
1938c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct arraydescr *descr;
1939c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1940c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
1941c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1942c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1943b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    if (!PyArg_ParseTuple(args, "O|O:array", &typecode, &initial))
1944c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1945c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1946b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    if (PyString_Check(typecode) && PyString_GET_SIZE(typecode) == 1)
1947b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        c = (unsigned char)*PyString_AS_STRING(typecode);
1948dc967c137cb5e2e0f558cedbb94a13256db3fb75Serhiy Storchaka#ifdef Py_USING_UNICODE
1949b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    else if (PyUnicode_Check(typecode) && PyUnicode_GET_SIZE(typecode) == 1)
1950b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        c = *PyUnicode_AS_UNICODE(typecode);
1951dc967c137cb5e2e0f558cedbb94a13256db3fb75Serhiy Storchaka#endif
1952b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    else {
1953b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        PyErr_Format(PyExc_TypeError,
1954b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka                     "array() argument 1 or typecode must be char (string or "
1955b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka                     "ascii-unicode with length 1), not %s",
1956b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka                     Py_TYPE(typecode)->tp_name);
1957b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka        return NULL;
1958b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka    }
1959b70091a8d5014b1c5d8738c17ae801d79dd5392dSerhiy Storchaka
1960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!(initial == NULL || PyList_Check(initial)
1961c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou          || PyString_Check(initial) || PyTuple_Check(initial)
19624ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky          || (c == 'u' && PyUnicode_Check(initial)))) {
1963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        it = PyObject_GetIter(initial);
1964c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (it == NULL)
1965c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1966c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* We set initial to NULL so that the subsequent code
1967c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           will create an empty array of the appropriate type
1968c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           and afterwards we can use array_iter_extend to populate
1969c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           the array.
1970c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        */
1971c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        initial = NULL;
1972c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1973c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (descr = descriptors; descr->typecode != '\0'; descr++) {
1974c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (descr->typecode == c) {
1975c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *a;
1976c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_ssize_t len;
1977c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
19784ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky            if (initial == NULL || !(PyList_Check(initial)
19794ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky                || PyTuple_Check(initial)))
1980c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                len = 0;
1981c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else
19824ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky                len = PySequence_Size(initial);
1983c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1984c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            a = newarrayobject(type, len, descr);
1985c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (a == NULL)
1986c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
1987c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
19884ea1aacb9438bee068767e93098c11ac7a9c7388Alexander Belopolsky            if (len > 0) {
1989c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_ssize_t i;
1990c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                for (i = 0; i < len; i++) {
1991c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    PyObject *v =
1992c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PySequence_GetItem(initial, i);
1993c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    if (v == NULL) {
1994c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(a);
1995c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        return NULL;
1996c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    }
1997c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    if (setarrayitem(a, i, v) != 0) {
1998c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(v);
1999c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(a);
2000c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        return NULL;
2001c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    }
2002c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(v);
2003c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2004c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            } else if (initial != NULL && PyString_Check(initial)) {
2005c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyObject *t_initial, *v;
2006c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                t_initial = PyTuple_Pack(1, initial);
2007c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (t_initial == NULL) {
2008c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(a);
2009c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return NULL;
2010c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2011c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                v = array_fromstring((arrayobject *)a,
2012c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                         t_initial);
2013c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(t_initial);
2014c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (v == NULL) {
2015c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(a);
2016c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return NULL;
2017c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2018c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(v);
201999866336094bd432860d32dd368f5934683939e7Martin v. Löwis#ifdef Py_USING_UNICODE
2020c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            } else if (initial != NULL && PyUnicode_Check(initial))  {
2021c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
2022c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (n > 0) {
2023c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    arrayobject *self = (arrayobject *)a;
2024c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    char *item = self->ob_item;
2025c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    item = (char *)PyMem_Realloc(item, n);
2026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    if (item == NULL) {
2027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyErr_NoMemory();
2028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        Py_DECREF(a);
2029c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        return NULL;
2030c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    }
2031c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    self->ob_item = item;
2032c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_SIZE(self) = n / sizeof(Py_UNICODE);
2033c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    memcpy(item, PyUnicode_AS_DATA(initial), n);
2034c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    self->allocated = Py_SIZE(self);
2035c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
203699866336094bd432860d32dd368f5934683939e7Martin v. Löwis#endif
2037c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
2038c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (it != NULL) {
2039c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (array_iter_extend((arrayobject *)a, it) == -1) {
2040c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(it);
2041c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    Py_DECREF(a);
2042c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return NULL;
2043c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2044c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(it);
2045c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
2046c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return a;
2047c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2048c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2049c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetString(PyExc_ValueError,
2050c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
2051c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
2052778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
2053778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
2054778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
205514f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(module_doc,
205699866336094bd432860d32dd368f5934683939e7Martin v. Löwis"This module defines an object type which can efficiently represent\n\
2057b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossuman array of basic values: characters, integers, floating point\n\
2058b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumnumbers.  Arrays are sequence types and behave very much like lists,\n\
2059b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumexcept that the type of objects stored in them is constrained.  The\n\
2060b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtype is specified at object creation time by using a type code, which\n\
2061b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumis a single character.  The following type codes are defined:\n\
2062b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2063b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    Type code   C Type             Minimum size in bytes \n\
2064b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'c'         character          1 \n\
2065b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'b'         signed integer     1 \n\
2066b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'B'         unsigned integer   1 \n\
206799866336094bd432860d32dd368f5934683939e7Martin v. Löwis    'u'         Unicode character  2 \n\
2068b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'h'         signed integer     2 \n\
2069b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'H'         unsigned integer   2 \n\
2070b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'i'         signed integer     2 \n\
2071b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'I'         unsigned integer   2 \n\
2072b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'l'         signed integer     4 \n\
2073b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'L'         unsigned integer   4 \n\
2074b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'f'         floating point     4 \n\
2075b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum    'd'         floating point     8 \n\
2076b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
207799866336094bd432860d32dd368f5934683939e7Martin v. LöwisThe constructor is:\n\
2078b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2079b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumarray(typecode [, initializer]) -- create a new array\n\
208014f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwis");
2081b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
208214f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(arraytype_doc,
208399866336094bd432860d32dd368f5934683939e7Martin v. Löwis"array(typecode [, initializer]) -> array\n\
208499866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
208599866336094bd432860d32dd368f5934683939e7Martin v. LöwisReturn a new array whose items are restricted by typecode, and\n\
20866ab78cd0c055462af4f5a6c59b9f310a83734c45Raymond Hettingerinitialized from the optional initializer value, which must be a list,\n\
2087b918bdc92c96a16cd83dfa431e0ab192fb1a6cc7Florent Xiclunastring or iterable over elements of the appropriate type.\n\
208899866336094bd432860d32dd368f5934683939e7Martin v. Löwis\n\
208999866336094bd432860d32dd368f5934683939e7Martin v. LöwisArrays represent basic values and behave very much like lists, except\n\
2090b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumthe type of objects stored in them is constrained.\n\
2091b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2092b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van RossumMethods:\n\
2093b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2094b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumappend() -- append a new item to the end of the array\n\
2095b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumbuffer_info() -- return information giving the current memory info\n\
2096b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumbyteswap() -- byteswap all the items of the array\n\
20973e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinsoncount() -- return number of occurrences of an object\n\
209849f9bd15ffeef67358a319f89faeaa31ad97d575Raymond Hettingerextend() -- extend array by appending multiple elements from an iterable\n\
2099b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumfromfile() -- read items from a file object\n\
2100b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumfromlist() -- append items from the list\n\
2101b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumfromstring() -- append items from the string\n\
21023e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinsonindex() -- return index of first occurrence of an object\n\
2103b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossuminsert() -- insert a new item into the array at a provided position\n\
21045a65c2d43607a5033d7171445848cde21f07d81dPeter Schneider-Kamppop() -- remove and return item (default last)\n\
2105b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumread() -- DEPRECATED, use fromfile()\n\
21063e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinsonremove() -- remove first occurrence of an object\n\
2107b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumreverse() -- reverse the order of the items in the array\n\
2108b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtofile() -- write all items to a file object\n\
2109b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtolist() -- return the array converted to an ordinary list\n\
2110b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtostring() -- return the array converted to a string\n\
2111b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumwrite() -- DEPRECATED, use tofile()\n\
2112b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
211399866336094bd432860d32dd368f5934683939e7Martin v. LöwisAttributes:\n\
2114b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum\n\
2115b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumtypecode -- the typecode character used to create the array\n\
2116b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossumitemsize -- the length in bytes of one array item\n\
211714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. Löwis");
2118b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
2119625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyObject *array_iter(arrayobject *ao);
2120625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
21210c32279626d166fe0e09c571fcfc9af25508b1cdTim Petersstatic PyTypeObject Arraytype = {
2122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyVarObject_HEAD_INIT(NULL, 0)
2123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    "array.array",
2124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sizeof(arrayobject),
2125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,
2126c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (destructor)array_dealloc,                  /* tp_dealloc */
2127c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_print */
2128c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_getattr */
2129c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_setattr */
2130c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_compare */
2131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (reprfunc)array_repr,                       /* tp_repr */
2132c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_as_number*/
2133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    &array_as_sequence,                         /* tp_as_sequence*/
2134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    &array_as_mapping,                          /* tp_as_mapping*/
2135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_hash */
2136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_call */
2137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_str */
2138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GenericGetAttr,                    /* tp_getattro */
2139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_setattro */
2140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    &array_as_buffer,                           /* tp_as_buffer*/
2141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,  /* tp_flags */
2142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arraytype_doc,                              /* tp_doc */
2143c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_traverse */
2144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_clear */
2145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_richcompare,                          /* tp_richcompare */
2146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    offsetof(arrayobject, weakreflist),         /* tp_weaklistoffset */
2147c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (getiterfunc)array_iter,                    /* tp_iter */
2148c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_iternext */
2149c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_methods,                              /* tp_methods */
2150c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_members */
2151c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_getsets,                              /* tp_getset */
2152c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_base */
2153c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_dict */
2154c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_descr_get */
2155c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_descr_set */
2156c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_dictoffset */
2157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_init */
2158c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyType_GenericAlloc,                        /* tp_alloc */
2159c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    array_new,                                  /* tp_new */
2160c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_Del,                               /* tp_free */
2161b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum};
2162b39b90dda25f409fbb62bd77e5c43b2c98dd6ba1Guido van Rossum
2163625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2164625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger/*********************** Array Iterator **************************/
2165625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2166625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingertypedef struct {
2167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_HEAD
2168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t                          index;
2169c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayobject                 *ao;
2170c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject                    * (*getitem)(struct arrayobject *, Py_ssize_t);
2171625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger} arrayiterobject;
2172625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2173625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyTypeObject PyArrayIter_Type;
2174625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2175625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2176625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2177625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyObject *
2178625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarray_iter(arrayobject *ao)
2179625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2180c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arrayiterobject *it;
2181625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2182c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!array_Check(ao)) {
2183c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_BadInternalCall();
2184c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
2185c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2186625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2187c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2188c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (it == NULL)
2189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
2190625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(ao);
2192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it->ao = ao;
2193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it->index = 0;
2194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    it->getitem = ao->ob_descr->getitem;
2195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GC_Track(it);
2196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject *)it;
2197625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2198625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2199625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyObject *
2200625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarrayiter_next(arrayiterobject *it)
2201625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(PyArrayIter_Check(it));
2203c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (it->index < Py_SIZE(it->ao))
2204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return (*it->getitem)(it->ao, it->index++);
2205c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
2206625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2207625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2208625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic void
2209625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarrayiter_dealloc(arrayiterobject *it)
2210625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GC_UnTrack(it);
2212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(it->ao);
2213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GC_Del(it);
2214625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2215625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2216625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic int
2217625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerarrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2218625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger{
2219c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_VISIT(it->ao);
2220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
2221625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger}
2222625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2223625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettingerstatic PyTypeObject PyArrayIter_Type = {
2224c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyVarObject_HEAD_INIT(NULL, 0)
2225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    "arrayiterator",                        /* tp_name */
2226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sizeof(arrayiterobject),                /* tp_basicsize */
2227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_itemsize */
2228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* methods */
2229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (destructor)arrayiter_dealloc,              /* tp_dealloc */
2230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_print */
2231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_getattr */
2232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_setattr */
2233c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_compare */
2234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_repr */
2235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_number */
2236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_sequence */
2237c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_mapping */
2238c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_hash */
2239c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_call */
2240c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_str */
2241c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_GenericGetAttr,                /* tp_getattro */
2242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_setattro */
2243c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_as_buffer */
2244c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2245c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_doc */
2246c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (traverseproc)arrayiter_traverse,           /* tp_traverse */
2247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_clear */
2248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_richcompare */
2249c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                      /* tp_weaklistoffset */
2250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_SelfIter,                          /* tp_iter */
2251c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (iternextfunc)arrayiter_next,               /* tp_iternext */
2252c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    0,                                          /* tp_methods */
2253625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger};
2254625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2255625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
2256625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger/*********************** Install Module **************************/
2257625812f6184438d33ac0f2d70ab1276691a30162Raymond Hettinger
225899866336094bd432860d32dd368f5934683939e7Martin v. Löwis/* No functions in array module. */
225999866336094bd432860d32dd368f5934683939e7Martin v. Löwisstatic PyMethodDef a_methods[] = {
226099866336094bd432860d32dd368f5934683939e7Martin v. Löwis    {NULL, NULL, 0, NULL}        /* Sentinel */
226199866336094bd432860d32dd368f5934683939e7Martin v. Löwis};
226299866336094bd432860d32dd368f5934683939e7Martin v. Löwis
226399866336094bd432860d32dd368f5934683939e7Martin v. Löwis
2264fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark HammondPyMODINIT_FUNC
2265f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas Woutersinitarray(void)
2266778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
2267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *m;
22680d40ba4cdf6899b126297848f27f07a9cc76acb9Fred Drake
2269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Arraytype.ob_type = &PyType_Type;
2270c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyArrayIter_Type.ob_type = &PyType_Type;
2271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    m = Py_InitModule3("array", a_methods, module_doc);
2272c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (m == NULL)
2273c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return;
2274f4e3484692096260e0ea030f4f3490204fb966c6Fred Drake
2275c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF((PyObject *)&Arraytype);
2276c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2277c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF((PyObject *)&Arraytype);
2278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
2279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* No need to check the error here, the caller will do that */
2280778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
2281