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