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