1 /* Array object implementation */
3 /* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
6 #define PY_SSIZE_T_CLEAN
8 #include "structmember.h"
12 #else /* !STDC_HEADERS */
13 #ifdef HAVE_SYS_TYPES_H
14 #include <sys/types.h> /* For size_t */
15 #endif /* HAVE_SYS_TYPES_H */
16 #endif /* !STDC_HEADERS */
18 struct arrayobject
; /* Forward */
20 /* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
27 PyObject
* (*getitem
)(struct arrayobject
*, Py_ssize_t
);
28 int (*setitem
)(struct arrayobject
*, Py_ssize_t
, PyObject
*);
32 typedef struct arrayobject
{
36 struct arraydescr
*ob_descr
;
37 PyObject
*weakreflist
; /* List of weak references */
38 int ob_exports
; /* Number of exported buffers */
41 static PyTypeObject Arraytype
;
43 #define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
44 #define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
47 array_resize(arrayobject
*self
, Py_ssize_t newsize
)
52 if (self
->ob_exports
> 0 && newsize
!= Py_SIZE(self
)) {
53 PyErr_SetString(PyExc_BufferError
,
54 "cannot resize an array that is exporting buffers");
58 /* Bypass realloc() when a previous overallocation is large enough
59 to accommodate the newsize. If the newsize is 16 smaller than the
60 current size, then proceed with the realloc() to shrink the array.
63 if (self
->allocated
>= newsize
&&
64 Py_SIZE(self
) < newsize
+ 16 &&
65 self
->ob_item
!= NULL
) {
66 Py_SIZE(self
) = newsize
;
71 PyMem_FREE(self
->ob_item
);
78 /* This over-allocates proportional to the array size, making room
79 * for additional growth. The over-allocation is mild, but is
80 * enough to give linear-time amortized behavior over a long
81 * sequence of appends() in the presence of a poorly-performing
83 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
84 * Note, the pattern starts out the same as for lists but then
85 * grows at a smaller rate so that larger arrays only overallocate
86 * by about 1/16th -- this is done because arrays are presumed to be more
90 _new_size
= (newsize
>> 4) + (Py_SIZE(self
) < 8 ? 3 : 7) + newsize
;
91 items
= self
->ob_item
;
92 /* XXX The following multiplication and division does not optimize away
93 like it does for lists since the size is not known at compile time */
94 if (_new_size
<= ((~(size_t)0) / self
->ob_descr
->itemsize
))
95 PyMem_RESIZE(items
, char, (_new_size
* self
->ob_descr
->itemsize
));
102 self
->ob_item
= items
;
103 Py_SIZE(self
) = newsize
;
104 self
->allocated
= _new_size
;
108 /****************************************************************************
109 Get and Set functions for each type.
110 A Get function takes an arrayobject* and an integer index, returning the
111 array value at that index wrapped in an appropriate PyObject*.
112 A Set function takes an arrayobject, integer index, and PyObject*; sets
113 the array value at that index to the raw C data extracted from the PyObject*,
114 and returns 0 if successful, else nonzero on failure (PyObject* not of an
115 appropriate type or value).
116 Note that the basic Get and Set functions do NOT check that the index is
117 in bounds; that's the responsibility of the caller.
118 ****************************************************************************/
121 b_getitem(arrayobject
*ap
, Py_ssize_t i
)
123 long x
= ((char *)ap
->ob_item
)[i
];
126 return PyLong_FromLong(x
);
130 b_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
133 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
134 must use the next size up that is signed ('h') and manually do
135 the overflow checking */
136 if (!PyArg_Parse(v
, "h;array item must be integer", &x
))
139 PyErr_SetString(PyExc_OverflowError
,
140 "signed char is less than minimum");
144 PyErr_SetString(PyExc_OverflowError
,
145 "signed char is greater than maximum");
149 ((char *)ap
->ob_item
)[i
] = (char)x
;
154 BB_getitem(arrayobject
*ap
, Py_ssize_t i
)
156 long x
= ((unsigned char *)ap
->ob_item
)[i
];
157 return PyLong_FromLong(x
);
161 BB_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
164 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
165 if (!PyArg_Parse(v
, "b;array item must be integer", &x
))
168 ((char *)ap
->ob_item
)[i
] = x
;
173 u_getitem(arrayobject
*ap
, Py_ssize_t i
)
175 return PyUnicode_FromUnicode(&((Py_UNICODE
*) ap
->ob_item
)[i
], 1);
179 u_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
184 if (!PyArg_Parse(v
, "u#;array item must be unicode character", &p
, &len
))
187 PyErr_SetString(PyExc_TypeError
,
188 "array item must be unicode character");
192 ((Py_UNICODE
*)ap
->ob_item
)[i
] = p
[0];
198 h_getitem(arrayobject
*ap
, Py_ssize_t i
)
200 return PyLong_FromLong((long) ((short *)ap
->ob_item
)[i
]);
205 h_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
208 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
209 if (!PyArg_Parse(v
, "h;array item must be integer", &x
))
212 ((short *)ap
->ob_item
)[i
] = x
;
217 HH_getitem(arrayobject
*ap
, Py_ssize_t i
)
219 return PyLong_FromLong((long) ((unsigned short *)ap
->ob_item
)[i
]);
223 HH_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
226 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
227 must use the next size up and manually do the overflow checking */
228 if (!PyArg_Parse(v
, "i;array item must be integer", &x
))
231 PyErr_SetString(PyExc_OverflowError
,
232 "unsigned short is less than minimum");
235 else if (x
> USHRT_MAX
) {
236 PyErr_SetString(PyExc_OverflowError
,
237 "unsigned short is greater than maximum");
241 ((short *)ap
->ob_item
)[i
] = (short)x
;
246 i_getitem(arrayobject
*ap
, Py_ssize_t i
)
248 return PyLong_FromLong((long) ((int *)ap
->ob_item
)[i
]);
252 i_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
255 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
256 if (!PyArg_Parse(v
, "i;array item must be integer", &x
))
259 ((int *)ap
->ob_item
)[i
] = x
;
264 II_getitem(arrayobject
*ap
, Py_ssize_t i
)
266 return PyLong_FromUnsignedLong(
267 (unsigned long) ((unsigned int *)ap
->ob_item
)[i
]);
271 II_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
274 if (PyLong_Check(v
)) {
275 x
= PyLong_AsUnsignedLong(v
);
276 if (x
== (unsigned long) -1 && PyErr_Occurred())
281 if (!PyArg_Parse(v
, "l;array item must be integer", &y
))
284 PyErr_SetString(PyExc_OverflowError
,
285 "unsigned int is less than minimum");
288 x
= (unsigned long)y
;
292 PyErr_SetString(PyExc_OverflowError
,
293 "unsigned int is greater than maximum");
298 ((unsigned int *)ap
->ob_item
)[i
] = (unsigned int)x
;
303 l_getitem(arrayobject
*ap
, Py_ssize_t i
)
305 return PyLong_FromLong(((long *)ap
->ob_item
)[i
]);
309 l_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
312 if (!PyArg_Parse(v
, "l;array item must be integer", &x
))
315 ((long *)ap
->ob_item
)[i
] = x
;
320 LL_getitem(arrayobject
*ap
, Py_ssize_t i
)
322 return PyLong_FromUnsignedLong(((unsigned long *)ap
->ob_item
)[i
]);
326 LL_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
329 if (PyLong_Check(v
)) {
330 x
= PyLong_AsUnsignedLong(v
);
331 if (x
== (unsigned long) -1 && PyErr_Occurred())
336 if (!PyArg_Parse(v
, "l;array item must be integer", &y
))
339 PyErr_SetString(PyExc_OverflowError
,
340 "unsigned long is less than minimum");
343 x
= (unsigned long)y
;
347 PyErr_SetString(PyExc_OverflowError
,
348 "unsigned long is greater than maximum");
353 ((unsigned long *)ap
->ob_item
)[i
] = x
;
358 f_getitem(arrayobject
*ap
, Py_ssize_t i
)
360 return PyFloat_FromDouble((double) ((float *)ap
->ob_item
)[i
]);
364 f_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
367 if (!PyArg_Parse(v
, "f;array item must be float", &x
))
370 ((float *)ap
->ob_item
)[i
] = x
;
375 d_getitem(arrayobject
*ap
, Py_ssize_t i
)
377 return PyFloat_FromDouble(((double *)ap
->ob_item
)[i
]);
381 d_setitem(arrayobject
*ap
, Py_ssize_t i
, PyObject
*v
)
384 if (!PyArg_Parse(v
, "d;array item must be float", &x
))
387 ((double *)ap
->ob_item
)[i
] = x
;
392 /* Description of types */
393 static struct arraydescr descriptors
[] = {
394 {'b', 1, b_getitem
, b_setitem
, "b"},
395 {'B', 1, BB_getitem
, BB_setitem
, "B"},
396 {'u', sizeof(Py_UNICODE
), u_getitem
, u_setitem
, "u"},
397 {'h', sizeof(short), h_getitem
, h_setitem
, "h"},
398 {'H', sizeof(short), HH_getitem
, HH_setitem
, "H"},
399 {'i', sizeof(int), i_getitem
, i_setitem
, "i"},
400 {'I', sizeof(int), II_getitem
, II_setitem
, "I"},
401 {'l', sizeof(long), l_getitem
, l_setitem
, "l"},
402 {'L', sizeof(long), LL_getitem
, LL_setitem
, "L"},
403 {'f', sizeof(float), f_getitem
, f_setitem
, "f"},
404 {'d', sizeof(double), d_getitem
, d_setitem
, "d"},
405 {'\0', 0, 0, 0, 0} /* Sentinel */
408 /****************************************************************************
409 Implementations of array object methods.
410 ****************************************************************************/
413 newarrayobject(PyTypeObject
*type
, Py_ssize_t size
, struct arraydescr
*descr
)
419 PyErr_BadInternalCall();
423 nbytes
= size
* descr
->itemsize
;
424 /* Check for overflow */
425 if (nbytes
/ descr
->itemsize
!= (size_t)size
) {
426 return PyErr_NoMemory();
428 op
= (arrayobject
*) type
->tp_alloc(type
, 0);
432 op
->ob_descr
= descr
;
433 op
->allocated
= size
;
434 op
->weakreflist
= NULL
;
440 op
->ob_item
= PyMem_NEW(char, nbytes
);
441 if (op
->ob_item
== NULL
) {
443 return PyErr_NoMemory();
447 return (PyObject
*) op
;
451 getarrayitem(PyObject
*op
, Py_ssize_t i
)
453 register arrayobject
*ap
;
454 assert(array_Check(op
));
455 ap
= (arrayobject
*)op
;
456 assert(i
>=0 && i
<Py_SIZE(ap
));
457 return (*ap
->ob_descr
->getitem
)(ap
, i
);
461 ins1(arrayobject
*self
, Py_ssize_t where
, PyObject
*v
)
464 Py_ssize_t n
= Py_SIZE(self
);
466 PyErr_BadInternalCall();
469 if ((*self
->ob_descr
->setitem
)(self
, -1, v
) < 0)
472 if (array_resize(self
, n
+1) == -1)
474 items
= self
->ob_item
;
482 /* appends don't need to call memmove() */
484 memmove(items
+ (where
+1)*self
->ob_descr
->itemsize
,
485 items
+ where
*self
->ob_descr
->itemsize
,
486 (n
-where
)*self
->ob_descr
->itemsize
);
487 return (*self
->ob_descr
->setitem
)(self
, where
, v
);
493 array_dealloc(arrayobject
*op
)
495 if (op
->weakreflist
!= NULL
)
496 PyObject_ClearWeakRefs((PyObject
*) op
);
497 if (op
->ob_item
!= NULL
)
498 PyMem_DEL(op
->ob_item
);
499 Py_TYPE(op
)->tp_free((PyObject
*)op
);
503 array_richcompare(PyObject
*v
, PyObject
*w
, int op
)
505 arrayobject
*va
, *wa
;
511 if (!array_Check(v
) || !array_Check(w
)) {
512 Py_INCREF(Py_NotImplemented
);
513 return Py_NotImplemented
;
516 va
= (arrayobject
*)v
;
517 wa
= (arrayobject
*)w
;
519 if (Py_SIZE(va
) != Py_SIZE(wa
) && (op
== Py_EQ
|| op
== Py_NE
)) {
520 /* Shortcut: if the lengths differ, the arrays differ */
529 /* Search for the first index where items are different */
531 for (i
= 0; i
< Py_SIZE(va
) && i
< Py_SIZE(wa
); i
++) {
532 vi
= getarrayitem(v
, i
);
533 wi
= getarrayitem(w
, i
);
534 if (vi
== NULL
|| wi
== NULL
) {
539 k
= PyObject_RichCompareBool(vi
, wi
, Py_EQ
);
541 break; /* Keeping vi and wi alive! */
549 /* No more items to compare -- compare sizes */
550 Py_ssize_t vs
= Py_SIZE(va
);
551 Py_ssize_t ws
= Py_SIZE(wa
);
554 case Py_LT
: cmp
= vs
< ws
; break;
555 case Py_LE
: cmp
= vs
<= ws
; break;
556 case Py_EQ
: cmp
= vs
== ws
; break;
557 case Py_NE
: cmp
= vs
!= ws
; break;
558 case Py_GT
: cmp
= vs
> ws
; break;
559 case Py_GE
: cmp
= vs
>= ws
; break;
560 default: return NULL
; /* cannot happen */
570 /* We have an item that differs. First, shortcuts for EQ/NE */
575 else if (op
== Py_NE
) {
580 /* Compare the final item again using the proper operator */
581 res
= PyObject_RichCompare(vi
, wi
, op
);
589 array_length(arrayobject
*a
)
595 array_item(arrayobject
*a
, Py_ssize_t i
)
597 if (i
< 0 || i
>= Py_SIZE(a
)) {
598 PyErr_SetString(PyExc_IndexError
, "array index out of range");
601 return getarrayitem((PyObject
*)a
, i
);
605 array_slice(arrayobject
*a
, Py_ssize_t ilow
, Py_ssize_t ihigh
)
610 else if (ilow
> Py_SIZE(a
))
616 else if (ihigh
> Py_SIZE(a
))
618 np
= (arrayobject
*) newarrayobject(&Arraytype
, ihigh
- ilow
, a
->ob_descr
);
621 memcpy(np
->ob_item
, a
->ob_item
+ ilow
* a
->ob_descr
->itemsize
,
622 (ihigh
-ilow
) * a
->ob_descr
->itemsize
);
623 return (PyObject
*)np
;
627 array_copy(arrayobject
*a
, PyObject
*unused
)
629 return array_slice(a
, 0, Py_SIZE(a
));
632 PyDoc_STRVAR(copy_doc
,
635 Return a copy of the array.");
638 array_concat(arrayobject
*a
, PyObject
*bb
)
642 if (!array_Check(bb
)) {
643 PyErr_Format(PyExc_TypeError
,
644 "can only append array (not \"%.200s\") to array",
645 Py_TYPE(bb
)->tp_name
);
648 #define b ((arrayobject *)bb)
649 if (a
->ob_descr
!= b
->ob_descr
) {
653 if (Py_SIZE(a
) > PY_SSIZE_T_MAX
- Py_SIZE(b
)) {
654 return PyErr_NoMemory();
656 size
= Py_SIZE(a
) + Py_SIZE(b
);
657 np
= (arrayobject
*) newarrayobject(&Arraytype
, size
, a
->ob_descr
);
661 memcpy(np
->ob_item
, a
->ob_item
, Py_SIZE(a
)*a
->ob_descr
->itemsize
);
662 memcpy(np
->ob_item
+ Py_SIZE(a
)*a
->ob_descr
->itemsize
,
663 b
->ob_item
, Py_SIZE(b
)*b
->ob_descr
->itemsize
);
664 return (PyObject
*)np
;
669 array_repeat(arrayobject
*a
, Py_ssize_t n
)
678 if ((Py_SIZE(a
) != 0) && (n
> PY_SSIZE_T_MAX
/ Py_SIZE(a
))) {
679 return PyErr_NoMemory();
681 size
= Py_SIZE(a
) * n
;
682 np
= (arrayobject
*) newarrayobject(&Arraytype
, size
, a
->ob_descr
);
686 nbytes
= Py_SIZE(a
) * a
->ob_descr
->itemsize
;
687 for (i
= 0; i
< n
; i
++) {
688 memcpy(p
, a
->ob_item
, nbytes
);
691 return (PyObject
*) np
;
695 array_ass_slice(arrayobject
*a
, Py_ssize_t ilow
, Py_ssize_t ihigh
, PyObject
*v
)
698 Py_ssize_t n
; /* Size of replacement array */
699 Py_ssize_t d
; /* Change in size */
700 #define b ((arrayobject *)v)
703 else if (array_Check(v
)) {
706 /* Special case "a[i:j] = a" -- copy b first */
708 v
= array_slice(b
, 0, n
);
711 ret
= array_ass_slice(a
, ilow
, ihigh
, v
);
715 if (b
->ob_descr
!= a
->ob_descr
) {
721 PyErr_Format(PyExc_TypeError
,
722 "can only assign array (not \"%.200s\") to array slice",
723 Py_TYPE(v
)->tp_name
);
728 else if (ilow
> Py_SIZE(a
))
734 else if (ihigh
> Py_SIZE(a
))
737 d
= n
- (ihigh
-ilow
);
738 if (d
< 0) { /* Delete -d items */
739 memmove(item
+ (ihigh
+d
)*a
->ob_descr
->itemsize
,
740 item
+ ihigh
*a
->ob_descr
->itemsize
,
741 (Py_SIZE(a
)-ihigh
)*a
->ob_descr
->itemsize
);
742 if (array_resize(a
, Py_SIZE(a
) + d
) == -1)
745 else if (d
> 0) { /* Insert d items */
746 if (array_resize(a
, Py_SIZE(a
) + d
))
748 memmove(item
+ (ihigh
+d
)*a
->ob_descr
->itemsize
,
749 item
+ ihigh
*a
->ob_descr
->itemsize
,
750 (Py_SIZE(a
)-ihigh
)*a
->ob_descr
->itemsize
);
753 memcpy(item
+ ilow
*a
->ob_descr
->itemsize
, b
->ob_item
,
754 n
*b
->ob_descr
->itemsize
);
760 array_ass_item(arrayobject
*a
, Py_ssize_t i
, PyObject
*v
)
762 if (i
< 0 || i
>= Py_SIZE(a
)) {
763 PyErr_SetString(PyExc_IndexError
,
764 "array assignment index out of range");
768 return array_ass_slice(a
, i
, i
+1, v
);
769 return (*a
->ob_descr
->setitem
)(a
, i
, v
);
773 setarrayitem(PyObject
*a
, Py_ssize_t i
, PyObject
*v
)
775 assert(array_Check(a
));
776 return array_ass_item((arrayobject
*)a
, i
, v
);
780 array_iter_extend(arrayobject
*self
, PyObject
*bb
)
784 it
= PyObject_GetIter(bb
);
788 while ((v
= PyIter_Next(it
)) != NULL
) {
789 if (ins1(self
, (int) Py_SIZE(self
), v
) != 0) {
797 if (PyErr_Occurred())
803 array_do_extend(arrayobject
*self
, PyObject
*bb
)
805 Py_ssize_t size
, oldsize
;
807 if (!array_Check(bb
))
808 return array_iter_extend(self
, bb
);
809 #define b ((arrayobject *)bb)
810 if (self
->ob_descr
!= b
->ob_descr
) {
811 PyErr_SetString(PyExc_TypeError
,
812 "can only extend with array of same kind");
815 if ((Py_SIZE(self
) > PY_SSIZE_T_MAX
- Py_SIZE(b
)) ||
816 ((Py_SIZE(self
) + Py_SIZE(b
)) > PY_SSIZE_T_MAX
/ self
->ob_descr
->itemsize
)) {
820 oldsize
= Py_SIZE(self
);
821 size
= oldsize
+ Py_SIZE(b
);
822 if (array_resize(self
, size
) == -1)
824 memcpy(self
->ob_item
+ oldsize
* self
->ob_descr
->itemsize
,
825 b
->ob_item
, Py_SIZE(b
) * b
->ob_descr
->itemsize
);
832 array_inplace_concat(arrayobject
*self
, PyObject
*bb
)
834 if (!array_Check(bb
)) {
835 PyErr_Format(PyExc_TypeError
,
836 "can only extend array with array (not \"%.200s\")",
837 Py_TYPE(bb
)->tp_name
);
840 if (array_do_extend(self
, bb
) == -1)
843 return (PyObject
*)self
;
847 array_inplace_repeat(arrayobject
*self
, Py_ssize_t n
)
852 if (Py_SIZE(self
) > 0) {
855 items
= self
->ob_item
;
856 if ((self
->ob_descr
->itemsize
!= 0) &&
857 (Py_SIZE(self
) > PY_SSIZE_T_MAX
/ self
->ob_descr
->itemsize
)) {
858 return PyErr_NoMemory();
860 size
= Py_SIZE(self
) * self
->ob_descr
->itemsize
;
861 if (n
> 0 && size
> PY_SSIZE_T_MAX
/ n
) {
862 return PyErr_NoMemory();
864 if (array_resize(self
, n
* Py_SIZE(self
)) == -1)
866 items
= p
= self
->ob_item
;
867 for (i
= 1; i
< n
; i
++) {
869 memcpy(p
, items
, size
);
873 return (PyObject
*)self
;
878 ins(arrayobject
*self
, Py_ssize_t where
, PyObject
*v
)
880 if (ins1(self
, where
, v
) != 0)
887 array_count(arrayobject
*self
, PyObject
*v
)
889 Py_ssize_t count
= 0;
892 for (i
= 0; i
< Py_SIZE(self
); i
++) {
893 PyObject
*selfi
= getarrayitem((PyObject
*)self
, i
);
894 int cmp
= PyObject_RichCompareBool(selfi
, v
, Py_EQ
);
901 return PyLong_FromSsize_t(count
);
904 PyDoc_STRVAR(count_doc
,
907 Return number of occurrences of x in the array.");
910 array_index(arrayobject
*self
, PyObject
*v
)
914 for (i
= 0; i
< Py_SIZE(self
); i
++) {
915 PyObject
*selfi
= getarrayitem((PyObject
*)self
, i
);
916 int cmp
= PyObject_RichCompareBool(selfi
, v
, Py_EQ
);
919 return PyLong_FromLong((long)i
);
924 PyErr_SetString(PyExc_ValueError
, "array.index(x): x not in list");
928 PyDoc_STRVAR(index_doc
,
931 Return index of first occurrence of x in the array.");
934 array_contains(arrayobject
*self
, PyObject
*v
)
939 for (i
= 0, cmp
= 0 ; cmp
== 0 && i
< Py_SIZE(self
); i
++) {
940 PyObject
*selfi
= getarrayitem((PyObject
*)self
, i
);
941 cmp
= PyObject_RichCompareBool(selfi
, v
, Py_EQ
);
948 array_remove(arrayobject
*self
, PyObject
*v
)
952 for (i
= 0; i
< Py_SIZE(self
); i
++) {
953 PyObject
*selfi
= getarrayitem((PyObject
*)self
,i
);
954 int cmp
= PyObject_RichCompareBool(selfi
, v
, Py_EQ
);
957 if (array_ass_slice(self
, i
, i
+1,
958 (PyObject
*)NULL
) != 0)
966 PyErr_SetString(PyExc_ValueError
, "array.remove(x): x not in list");
970 PyDoc_STRVAR(remove_doc
,
973 Remove the first occurrence of x in the array.");
976 array_pop(arrayobject
*self
, PyObject
*args
)
980 if (!PyArg_ParseTuple(args
, "|n:pop", &i
))
982 if (Py_SIZE(self
) == 0) {
983 /* Special-case most common failure cause */
984 PyErr_SetString(PyExc_IndexError
, "pop from empty array");
989 if (i
< 0 || i
>= Py_SIZE(self
)) {
990 PyErr_SetString(PyExc_IndexError
, "pop index out of range");
993 v
= getarrayitem((PyObject
*)self
,i
);
994 if (array_ass_slice(self
, i
, i
+1, (PyObject
*)NULL
) != 0) {
1001 PyDoc_STRVAR(pop_doc
,
1004 Return the i-th element and delete it from the array. i defaults to -1.");
1007 array_extend(arrayobject
*self
, PyObject
*bb
)
1009 if (array_do_extend(self
, bb
) == -1)
1015 PyDoc_STRVAR(extend_doc
,
1016 "extend(array or iterable)\n\
1018 Append items to the end of the array.");
1021 array_insert(arrayobject
*self
, PyObject
*args
)
1025 if (!PyArg_ParseTuple(args
, "nO:insert", &i
, &v
))
1027 return ins(self
, i
, v
);
1030 PyDoc_STRVAR(insert_doc
,
1033 Insert a new item x into the array before position i.");
1037 array_buffer_info(arrayobject
*self
, PyObject
*unused
)
1039 PyObject
* retval
= NULL
;
1040 retval
= PyTuple_New(2);
1044 PyTuple_SET_ITEM(retval
, 0, PyLong_FromVoidPtr(self
->ob_item
));
1045 PyTuple_SET_ITEM(retval
, 1, PyLong_FromLong((long)(Py_SIZE(self
))));
1050 PyDoc_STRVAR(buffer_info_doc
,
1051 "buffer_info() -> (address, length)\n\
1053 Return a tuple (address, length) giving the current memory address and\n\
1054 the length in items of the buffer used to hold array's contents\n\
1055 The length should be multiplied by the itemsize attribute to calculate\n\
1056 the buffer length in bytes.");
1060 array_append(arrayobject
*self
, PyObject
*v
)
1062 return ins(self
, (int) Py_SIZE(self
), v
);
1065 PyDoc_STRVAR(append_doc
,
1068 Append new value x to the end of the array.");
1072 array_byteswap(arrayobject
*self
, PyObject
*unused
)
1077 switch (self
->ob_descr
->itemsize
) {
1081 for (p
= self
->ob_item
, i
= Py_SIZE(self
); --i
>= 0; p
+= 2) {
1088 for (p
= self
->ob_item
, i
= Py_SIZE(self
); --i
>= 0; p
+= 4) {
1098 for (p
= self
->ob_item
, i
= Py_SIZE(self
); --i
>= 0; p
+= 8) {
1114 PyErr_SetString(PyExc_RuntimeError
,
1115 "don't know how to byteswap this array type");
1122 PyDoc_STRVAR(byteswap_doc
,
1125 Byteswap all items of the array. If the items in the array are not 1, 2,\n\
1126 4, or 8 bytes in size, RuntimeError is raised.");
1129 array_reduce(arrayobject
*array
)
1131 PyObject
*dict
, *result
;
1133 dict
= PyObject_GetAttrString((PyObject
*)array
, "__dict__");
1139 if (Py_SIZE(array
) > 0) {
1140 if (array
->ob_descr
->itemsize
1141 > PY_SSIZE_T_MAX
/ Py_SIZE(array
)) {
1142 return PyErr_NoMemory();
1144 result
= Py_BuildValue("O(cy#)O",
1146 array
->ob_descr
->typecode
,
1148 Py_SIZE(array
) * array
->ob_descr
->itemsize
,
1151 result
= Py_BuildValue("O(c)O",
1153 array
->ob_descr
->typecode
,
1160 PyDoc_STRVAR(array_doc
, "Return state information for pickling.");
1163 array_reverse(arrayobject
*self
, PyObject
*unused
)
1165 register Py_ssize_t itemsize
= self
->ob_descr
->itemsize
;
1166 register char *p
, *q
;
1167 /* little buffer to hold items while swapping */
1168 char tmp
[256]; /* 8 is probably enough -- but why skimp */
1169 assert((size_t)itemsize
<= sizeof(tmp
));
1171 if (Py_SIZE(self
) > 1) {
1172 for (p
= self
->ob_item
,
1173 q
= self
->ob_item
+ (Py_SIZE(self
) - 1)*itemsize
;
1175 p
+= itemsize
, q
-= itemsize
) {
1176 /* memory areas guaranteed disjoint, so memcpy
1177 * is safe (& memmove may be slower).
1179 memcpy(tmp
, p
, itemsize
);
1180 memcpy(p
, q
, itemsize
);
1181 memcpy(q
, tmp
, itemsize
);
1189 PyDoc_STRVAR(reverse_doc
,
1192 Reverse the order of the items in the array.");
1196 static PyObject
*array_fromstring(arrayobject
*self
, PyObject
*args
);
1199 array_fromfile(arrayobject
*self
, PyObject
*args
)
1201 PyObject
*f
, *b
, *res
;
1202 Py_ssize_t itemsize
= self
->ob_descr
->itemsize
;
1203 Py_ssize_t n
, nbytes
;
1204 int not_enough_bytes
;
1206 if (!PyArg_ParseTuple(args
, "On:fromfile", &f
, &n
))
1209 nbytes
= n
* itemsize
;
1210 if (nbytes
< 0 || nbytes
/itemsize
!= n
) {
1215 b
= PyObject_CallMethod(f
, "read", "n", nbytes
);
1219 if (!PyBytes_Check(b
)) {
1220 PyErr_SetString(PyExc_TypeError
,
1221 "read() didn't return bytes");
1226 not_enough_bytes
= (PyBytes_GET_SIZE(b
) != nbytes
);
1228 args
= Py_BuildValue("(O)", b
);
1233 res
= array_fromstring(self
, args
);
1238 if (not_enough_bytes
) {
1239 PyErr_SetString(PyExc_EOFError
,
1240 "read() didn't return enough bytes");
1248 PyDoc_STRVAR(fromfile_doc
,
1251 Read n objects from the file object f and append them to the end of the\n\
1256 array_tofile(arrayobject
*self
, PyObject
*f
)
1258 Py_ssize_t nbytes
= Py_SIZE(self
) * self
->ob_descr
->itemsize
;
1259 /* Write 64K blocks at a time */
1260 /* XXX Make the block size settable */
1261 int BLOCKSIZE
= 64*1024;
1262 Py_ssize_t nblocks
= (nbytes
+ BLOCKSIZE
- 1) / BLOCKSIZE
;
1265 if (Py_SIZE(self
) == 0)
1268 for (i
= 0; i
< nblocks
; i
++) {
1269 char* ptr
= self
->ob_item
+ i
*BLOCKSIZE
;
1270 Py_ssize_t size
= BLOCKSIZE
;
1271 PyObject
*bytes
, *res
;
1272 if (i
*BLOCKSIZE
+ size
> nbytes
)
1273 size
= nbytes
- i
*BLOCKSIZE
;
1274 bytes
= PyBytes_FromStringAndSize(ptr
, size
);
1277 res
= PyObject_CallMethod(f
, "write", "O", bytes
);
1281 Py_DECREF(res
); /* drop write result */
1289 PyDoc_STRVAR(tofile_doc
,
1292 Write all items (as machine values) to the file object f.");
1296 array_fromlist(arrayobject
*self
, PyObject
*list
)
1300 if (!PyList_Check(list
)) {
1301 PyErr_SetString(PyExc_TypeError
, "arg must be list");
1304 n
= PyList_Size(list
);
1306 Py_ssize_t i
, old_size
;
1307 old_size
= Py_SIZE(self
);
1308 if (array_resize(self
, old_size
+ n
) == -1)
1310 for (i
= 0; i
< n
; i
++) {
1311 PyObject
*v
= PyList_GetItem(list
, i
);
1312 if ((*self
->ob_descr
->setitem
)(self
,
1313 Py_SIZE(self
) - n
+ i
, v
) != 0) {
1314 array_resize(self
, old_size
);
1323 PyDoc_STRVAR(fromlist_doc
,
1326 Append items to array from list.");
1329 array_tolist(arrayobject
*self
, PyObject
*unused
)
1331 PyObject
*list
= PyList_New(Py_SIZE(self
));
1336 for (i
= 0; i
< Py_SIZE(self
); i
++) {
1337 PyObject
*v
= getarrayitem((PyObject
*)self
, i
);
1342 PyList_SetItem(list
, i
, v
);
1347 PyDoc_STRVAR(tolist_doc
,
1348 "tolist() -> list\n\
1350 Convert array to an ordinary list with the same items.");
1354 array_fromstring(arrayobject
*self
, PyObject
*args
)
1358 int itemsize
= self
->ob_descr
->itemsize
;
1359 if (!PyArg_ParseTuple(args
, "s#:fromstring", &str
, &n
))
1361 if (n
% itemsize
!= 0) {
1362 PyErr_SetString(PyExc_ValueError
,
1363 "string length not a multiple of item size");
1368 Py_ssize_t old_size
= Py_SIZE(self
);
1369 if ((n
> PY_SSIZE_T_MAX
- old_size
) ||
1370 ((old_size
+ n
) > PY_SSIZE_T_MAX
/ itemsize
)) {
1371 return PyErr_NoMemory();
1373 if (array_resize(self
, old_size
+ n
) == -1)
1375 memcpy(self
->ob_item
+ old_size
* itemsize
,
1382 PyDoc_STRVAR(fromstring_doc
,
1383 "fromstring(string)\n\
1385 Appends items from the string, interpreting it as an array of machine\n\
1386 values, as if it had been read from a file using the fromfile() method).");
1390 array_tostring(arrayobject
*self
, PyObject
*unused
)
1392 if (Py_SIZE(self
) <= PY_SSIZE_T_MAX
/ self
->ob_descr
->itemsize
) {
1393 return PyBytes_FromStringAndSize(self
->ob_item
,
1394 Py_SIZE(self
) * self
->ob_descr
->itemsize
);
1396 return PyErr_NoMemory();
1400 PyDoc_STRVAR(tostring_doc
,
1401 "tostring() -> string\n\
1403 Convert the array to an array of machine values and return the string\n\
1409 array_fromunicode(arrayobject
*self
, PyObject
*args
)
1415 if (!PyArg_ParseTuple(args
, "u#:fromunicode", &ustr
, &n
))
1417 typecode
= self
->ob_descr
->typecode
;
1418 if ((typecode
!= 'u')) {
1419 PyErr_SetString(PyExc_ValueError
,
1420 "fromunicode() may only be called on "
1421 "unicode type arrays");
1425 Py_ssize_t old_size
= Py_SIZE(self
);
1426 if (array_resize(self
, old_size
+ n
) == -1)
1428 memcpy(self
->ob_item
+ old_size
* sizeof(Py_UNICODE
),
1429 ustr
, n
* sizeof(Py_UNICODE
));
1436 PyDoc_STRVAR(fromunicode_doc
,
1437 "fromunicode(ustr)\n\
1439 Extends this array with data from the unicode string ustr.\n\
1440 The array must be a unicode type array; otherwise a ValueError\n\
1441 is raised. Use array.fromstring(ustr.decode(...)) to\n\
1442 append Unicode data to an array of some other type.");
1446 array_tounicode(arrayobject
*self
, PyObject
*unused
)
1449 typecode
= self
->ob_descr
->typecode
;
1450 if ((typecode
!= 'u')) {
1451 PyErr_SetString(PyExc_ValueError
,
1452 "tounicode() may only be called on unicode type arrays");
1455 return PyUnicode_FromUnicode((Py_UNICODE
*) self
->ob_item
, Py_SIZE(self
));
1458 PyDoc_STRVAR(tounicode_doc
,
1459 "tounicode() -> unicode\n\
1461 Convert the array to a unicode string. The array must be\n\
1462 a unicode type array; otherwise a ValueError is raised. Use\n\
1463 array.tostring().decode() to obtain a unicode string from\n\
1464 an array of some other type.");
1469 array_get_typecode(arrayobject
*a
, void *closure
)
1471 char tc
= a
->ob_descr
->typecode
;
1472 return PyUnicode_FromStringAndSize(&tc
, 1);
1476 array_get_itemsize(arrayobject
*a
, void *closure
)
1478 return PyLong_FromLong((long)a
->ob_descr
->itemsize
);
1481 static PyGetSetDef array_getsets
[] = {
1482 {"typecode", (getter
) array_get_typecode
, NULL
,
1483 "the typecode character used to create the array"},
1484 {"itemsize", (getter
) array_get_itemsize
, NULL
,
1485 "the size, in bytes, of one array item"},
1489 static PyMethodDef array_methods
[] = {
1490 {"append", (PyCFunction
)array_append
, METH_O
,
1492 {"buffer_info", (PyCFunction
)array_buffer_info
, METH_NOARGS
,
1494 {"byteswap", (PyCFunction
)array_byteswap
, METH_NOARGS
,
1496 {"__copy__", (PyCFunction
)array_copy
, METH_NOARGS
,
1498 {"count", (PyCFunction
)array_count
, METH_O
,
1500 {"__deepcopy__",(PyCFunction
)array_copy
, METH_O
,
1502 {"extend", (PyCFunction
)array_extend
, METH_O
,
1504 {"fromfile", (PyCFunction
)array_fromfile
, METH_VARARGS
,
1506 {"fromlist", (PyCFunction
)array_fromlist
, METH_O
,
1508 {"fromstring", (PyCFunction
)array_fromstring
, METH_VARARGS
,
1510 {"fromunicode", (PyCFunction
)array_fromunicode
, METH_VARARGS
,
1512 {"index", (PyCFunction
)array_index
, METH_O
,
1514 {"insert", (PyCFunction
)array_insert
, METH_VARARGS
,
1516 {"pop", (PyCFunction
)array_pop
, METH_VARARGS
,
1518 {"__reduce__", (PyCFunction
)array_reduce
, METH_NOARGS
,
1520 {"remove", (PyCFunction
)array_remove
, METH_O
,
1522 {"reverse", (PyCFunction
)array_reverse
, METH_NOARGS
,
1524 /* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1526 {"tofile", (PyCFunction
)array_tofile
, METH_O
,
1528 {"tolist", (PyCFunction
)array_tolist
, METH_NOARGS
,
1530 {"tostring", (PyCFunction
)array_tostring
, METH_NOARGS
,
1532 {"tounicode", (PyCFunction
)array_tounicode
, METH_NOARGS
,
1534 {NULL
, NULL
} /* sentinel */
1538 array_repr(arrayobject
*a
)
1541 PyObject
*s
, *v
= NULL
;
1545 typecode
= a
->ob_descr
->typecode
;
1547 return PyUnicode_FromFormat("array('%c')", typecode
);
1549 if ((typecode
== 'u'))
1550 v
= array_tounicode(a
, NULL
);
1552 v
= array_tolist(a
, NULL
);
1554 s
= PyUnicode_FromFormat("array('%c', %R)", typecode
, v
);
1560 array_subscr(arrayobject
* self
, PyObject
* item
)
1562 if (PyIndex_Check(item
)) {
1563 Py_ssize_t i
= PyNumber_AsSsize_t(item
, PyExc_IndexError
);
1564 if (i
==-1 && PyErr_Occurred()) {
1569 return array_item(self
, i
);
1571 else if (PySlice_Check(item
)) {
1572 Py_ssize_t start
, stop
, step
, slicelength
, cur
, i
;
1575 int itemsize
= self
->ob_descr
->itemsize
;
1577 if (PySlice_GetIndicesEx((PySliceObject
*)item
, Py_SIZE(self
),
1578 &start
, &stop
, &step
, &slicelength
) < 0) {
1582 if (slicelength
<= 0) {
1583 return newarrayobject(&Arraytype
, 0, self
->ob_descr
);
1585 else if (step
== 1) {
1586 PyObject
*result
= newarrayobject(&Arraytype
,
1587 slicelength
, self
->ob_descr
);
1590 memcpy(((arrayobject
*)result
)->ob_item
,
1591 self
->ob_item
+ start
* itemsize
,
1592 slicelength
* itemsize
);
1596 result
= newarrayobject(&Arraytype
, slicelength
, self
->ob_descr
);
1597 if (!result
) return NULL
;
1599 ar
= (arrayobject
*)result
;
1601 for (cur
= start
, i
= 0; i
< slicelength
;
1603 memcpy(ar
->ob_item
+ i
*itemsize
,
1604 self
->ob_item
+ cur
*itemsize
,
1612 PyErr_SetString(PyExc_TypeError
,
1613 "array indices must be integers");
1619 array_ass_subscr(arrayobject
* self
, PyObject
* item
, PyObject
* value
)
1621 Py_ssize_t start
, stop
, step
, slicelength
, needed
;
1625 if (PyIndex_Check(item
)) {
1626 Py_ssize_t i
= PyNumber_AsSsize_t(item
, PyExc_IndexError
);
1628 if (i
== -1 && PyErr_Occurred())
1632 if (i
< 0 || i
>= Py_SIZE(self
)) {
1633 PyErr_SetString(PyExc_IndexError
,
1634 "array assignment index out of range");
1637 if (value
== NULL
) {
1638 /* Fall through to slice assignment */
1645 return (*self
->ob_descr
->setitem
)(self
, i
, value
);
1647 else if (PySlice_Check(item
)) {
1648 if (PySlice_GetIndicesEx((PySliceObject
*)item
,
1649 Py_SIZE(self
), &start
, &stop
,
1650 &step
, &slicelength
) < 0) {
1655 PyErr_SetString(PyExc_TypeError
,
1656 "array indices must be integer");
1659 if (value
== NULL
) {
1663 else if (array_Check(value
)) {
1664 other
= (arrayobject
*)value
;
1665 needed
= Py_SIZE(other
);
1666 if (self
== other
) {
1667 /* Special case "self[i:j] = self" -- copy self first */
1669 value
= array_slice(other
, 0, needed
);
1672 ret
= array_ass_subscr(self
, item
, value
);
1676 if (other
->ob_descr
!= self
->ob_descr
) {
1677 PyErr_BadArgument();
1682 PyErr_Format(PyExc_TypeError
,
1683 "can only assign array (not \"%.200s\") to array slice",
1684 Py_TYPE(value
)->tp_name
);
1687 itemsize
= self
->ob_descr
->itemsize
;
1688 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1689 if ((step
> 0 && stop
< start
) ||
1690 (step
< 0 && stop
> start
))
1693 if (slicelength
> needed
) {
1694 memmove(self
->ob_item
+ (start
+ needed
) * itemsize
,
1695 self
->ob_item
+ stop
* itemsize
,
1696 (Py_SIZE(self
) - stop
) * itemsize
);
1697 if (array_resize(self
, Py_SIZE(self
) +
1698 needed
- slicelength
) < 0)
1701 else if (slicelength
< needed
) {
1702 if (array_resize(self
, Py_SIZE(self
) +
1703 needed
- slicelength
) < 0)
1705 memmove(self
->ob_item
+ (start
+ needed
) * itemsize
,
1706 self
->ob_item
+ stop
* itemsize
,
1707 (Py_SIZE(self
) - start
- needed
) * itemsize
);
1710 memcpy(self
->ob_item
+ start
* itemsize
,
1711 other
->ob_item
, needed
* itemsize
);
1714 else if (needed
== 0) {
1720 start
= stop
+ step
* (slicelength
- 1) - 1;
1723 for (cur
= start
, i
= 0; i
< slicelength
;
1725 Py_ssize_t lim
= step
- 1;
1727 if (cur
+ step
>= Py_SIZE(self
))
1728 lim
= Py_SIZE(self
) - cur
- 1;
1729 memmove(self
->ob_item
+ (cur
- i
) * itemsize
,
1730 self
->ob_item
+ (cur
+ 1) * itemsize
,
1733 cur
= start
+ slicelength
* step
;
1734 if (cur
< Py_SIZE(self
)) {
1735 memmove(self
->ob_item
+ (cur
-slicelength
) * itemsize
,
1736 self
->ob_item
+ cur
* itemsize
,
1737 (Py_SIZE(self
) - cur
) * itemsize
);
1739 if (array_resize(self
, Py_SIZE(self
) - slicelength
) < 0)
1746 if (needed
!= slicelength
) {
1747 PyErr_Format(PyExc_ValueError
,
1748 "attempt to assign array of size %zd "
1749 "to extended slice of size %zd",
1750 needed
, slicelength
);
1753 for (cur
= start
, i
= 0; i
< slicelength
;
1755 memcpy(self
->ob_item
+ cur
* itemsize
,
1756 other
->ob_item
+ i
* itemsize
,
1763 static PyMappingMethods array_as_mapping
= {
1764 (lenfunc
)array_length
,
1765 (binaryfunc
)array_subscr
,
1766 (objobjargproc
)array_ass_subscr
1769 static const void *emptybuf
= "";
1773 array_buffer_getbuf(arrayobject
*self
, Py_buffer
*view
, int flags
)
1775 if (view
==NULL
) goto finish
;
1777 view
->buf
= (void *)self
->ob_item
;
1778 view
->obj
= (PyObject
*)self
;
1780 if (view
->buf
== NULL
)
1781 view
->buf
= (void *)emptybuf
;
1782 view
->len
= (Py_SIZE(self
)) * self
->ob_descr
->itemsize
;
1785 view
->itemsize
= self
->ob_descr
->itemsize
;
1786 view
->suboffsets
= NULL
;
1788 if ((flags
& PyBUF_ND
)==PyBUF_ND
) {
1789 view
->shape
= &((Py_SIZE(self
)));
1791 view
->strides
= NULL
;
1792 if ((flags
& PyBUF_STRIDES
)==PyBUF_STRIDES
)
1793 view
->strides
= &(view
->itemsize
);
1794 view
->format
= NULL
;
1795 view
->internal
= NULL
;
1796 if ((flags
& PyBUF_FORMAT
) == PyBUF_FORMAT
) {
1797 view
->format
= self
->ob_descr
->formats
;
1798 #ifdef Py_UNICODE_WIDE
1799 if (self
->ob_descr
->typecode
== 'u') {
1811 array_buffer_relbuf(arrayobject
*self
, Py_buffer
*view
)
1816 static PySequenceMethods array_as_sequence
= {
1817 (lenfunc
)array_length
, /*sq_length*/
1818 (binaryfunc
)array_concat
, /*sq_concat*/
1819 (ssizeargfunc
)array_repeat
, /*sq_repeat*/
1820 (ssizeargfunc
)array_item
, /*sq_item*/
1822 (ssizeobjargproc
)array_ass_item
, /*sq_ass_item*/
1824 (objobjproc
)array_contains
, /*sq_contains*/
1825 (binaryfunc
)array_inplace_concat
, /*sq_inplace_concat*/
1826 (ssizeargfunc
)array_inplace_repeat
/*sq_inplace_repeat*/
1829 static PyBufferProcs array_as_buffer
= {
1830 (getbufferproc
)array_buffer_getbuf
,
1831 (releasebufferproc
)array_buffer_relbuf
1835 array_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
1838 PyObject
*initial
= NULL
, *it
= NULL
;
1839 struct arraydescr
*descr
;
1841 if (type
== &Arraytype
&& !_PyArg_NoKeywords("array.array()", kwds
))
1844 if (!PyArg_ParseTuple(args
, "C|O:array", &c
, &initial
))
1847 if (!(initial
== NULL
|| PyList_Check(initial
)
1848 || PyByteArray_Check(initial
)
1849 || PyBytes_Check(initial
)
1850 || PyTuple_Check(initial
)
1851 || ((c
=='u') && PyUnicode_Check(initial
)))) {
1852 it
= PyObject_GetIter(initial
);
1855 /* We set initial to NULL so that the subsequent code
1856 will create an empty array of the appropriate type
1857 and afterwards we can use array_iter_extend to populate
1862 for (descr
= descriptors
; descr
->typecode
!= '\0'; descr
++) {
1863 if (descr
->typecode
== c
) {
1867 if (initial
== NULL
|| !(PyList_Check(initial
)
1868 || PyTuple_Check(initial
)))
1871 len
= PySequence_Size(initial
);
1873 a
= newarrayobject(type
, len
, descr
);
1879 for (i
= 0; i
< len
; i
++) {
1881 PySequence_GetItem(initial
, i
);
1886 if (setarrayitem(a
, i
, v
) != 0) {
1894 else if (initial
!= NULL
&& (PyByteArray_Check(initial
) ||
1895 PyBytes_Check(initial
))) {
1896 PyObject
*t_initial
, *v
;
1897 t_initial
= PyTuple_Pack(1, initial
);
1898 if (t_initial
== NULL
) {
1902 v
= array_fromstring((arrayobject
*)a
,
1904 Py_DECREF(t_initial
);
1911 else if (initial
!= NULL
&& PyUnicode_Check(initial
)) {
1912 Py_ssize_t n
= PyUnicode_GET_DATA_SIZE(initial
);
1914 arrayobject
*self
= (arrayobject
*)a
;
1915 char *item
= self
->ob_item
;
1916 item
= (char *)PyMem_Realloc(item
, n
);
1922 self
->ob_item
= item
;
1923 Py_SIZE(self
) = n
/ sizeof(Py_UNICODE
);
1924 memcpy(item
, PyUnicode_AS_DATA(initial
), n
);
1925 self
->allocated
= Py_SIZE(self
);
1929 if (array_iter_extend((arrayobject
*)a
, it
) == -1) {
1939 PyErr_SetString(PyExc_ValueError
,
1940 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
1945 PyDoc_STRVAR(module_doc
,
1946 "This module defines an object type which can efficiently represent\n\
1947 an array of basic values: characters, integers, floating point\n\
1948 numbers. Arrays are sequence types and behave very much like lists,\n\
1949 except that the type of objects stored in them is constrained. The\n\
1950 type is specified at object creation time by using a type code, which\n\
1951 is a single character. The following type codes are defined:\n\
1953 Type code C Type Minimum size in bytes \n\
1954 'b' signed integer 1 \n\
1955 'B' unsigned integer 1 \n\
1956 'u' Unicode character 2 (see note) \n\
1957 'h' signed integer 2 \n\
1958 'H' unsigned integer 2 \n\
1959 'i' signed integer 2 \n\
1960 'I' unsigned integer 2 \n\
1961 'w' unicode character 4 \n\
1962 'l' signed integer 4 \n\
1963 'L' unsigned integer 4 \n\
1964 'f' floating point 4 \n\
1965 'd' floating point 8 \n\
1967 NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
1968 narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
1970 The constructor is:\n\
1972 array(typecode [, initializer]) -- create a new array\n\
1975 PyDoc_STRVAR(arraytype_doc
,
1976 "array(typecode [, initializer]) -> array\n\
1978 Return a new array whose items are restricted by typecode, and\n\
1979 initialized from the optional initializer value, which must be a list,\n\
1980 string. or iterable over elements of the appropriate type.\n\
1982 Arrays represent basic values and behave very much like lists, except\n\
1983 the type of objects stored in them is constrained.\n\
1987 append() -- append a new item to the end of the array\n\
1988 buffer_info() -- return information giving the current memory info\n\
1989 byteswap() -- byteswap all the items of the array\n\
1990 count() -- return number of occurrences of an object\n\
1991 extend() -- extend array by appending multiple elements from an iterable\n\
1992 fromfile() -- read items from a file object\n\
1993 fromlist() -- append items from the list\n\
1994 fromstring() -- append items from the string\n\
1995 index() -- return index of first occurrence of an object\n\
1996 insert() -- insert a new item into the array at a provided position\n\
1997 pop() -- remove and return item (default last)\n\
1998 remove() -- remove first occurrence of an object\n\
1999 reverse() -- reverse the order of the items in the array\n\
2000 tofile() -- write all items to a file object\n\
2001 tolist() -- return the array converted to an ordinary list\n\
2002 tostring() -- return the array converted to a string\n\
2006 typecode -- the typecode character used to create the array\n\
2007 itemsize -- the length in bytes of one array item\n\
2010 static PyObject
*array_iter(arrayobject
*ao
);
2012 static PyTypeObject Arraytype
= {
2013 PyVarObject_HEAD_INIT(NULL
, 0)
2015 sizeof(arrayobject
),
2017 (destructor
)array_dealloc
, /* tp_dealloc */
2021 0, /* tp_reserved */
2022 (reprfunc
)array_repr
, /* tp_repr */
2023 0, /* tp_as_number*/
2024 &array_as_sequence
, /* tp_as_sequence*/
2025 &array_as_mapping
, /* tp_as_mapping*/
2029 PyObject_GenericGetAttr
, /* tp_getattro */
2030 0, /* tp_setattro */
2031 &array_as_buffer
, /* tp_as_buffer*/
2032 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /* tp_flags */
2033 arraytype_doc
, /* tp_doc */
2034 0, /* tp_traverse */
2036 array_richcompare
, /* tp_richcompare */
2037 offsetof(arrayobject
, weakreflist
), /* tp_weaklistoffset */
2038 (getiterfunc
)array_iter
, /* tp_iter */
2039 0, /* tp_iternext */
2040 array_methods
, /* tp_methods */
2042 array_getsets
, /* tp_getset */
2045 0, /* tp_descr_get */
2046 0, /* tp_descr_set */
2047 0, /* tp_dictoffset */
2049 PyType_GenericAlloc
, /* tp_alloc */
2050 array_new
, /* tp_new */
2051 PyObject_Del
, /* tp_free */
2055 /*********************** Array Iterator **************************/
2061 PyObject
* (*getitem
)(struct arrayobject
*, Py_ssize_t
);
2064 static PyTypeObject PyArrayIter_Type
;
2066 #define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2069 array_iter(arrayobject
*ao
)
2071 arrayiterobject
*it
;
2073 if (!array_Check(ao
)) {
2074 PyErr_BadInternalCall();
2078 it
= PyObject_GC_New(arrayiterobject
, &PyArrayIter_Type
);
2085 it
->getitem
= ao
->ob_descr
->getitem
;
2086 PyObject_GC_Track(it
);
2087 return (PyObject
*)it
;
2091 arrayiter_next(arrayiterobject
*it
)
2093 assert(PyArrayIter_Check(it
));
2094 if (it
->index
< Py_SIZE(it
->ao
))
2095 return (*it
->getitem
)(it
->ao
, it
->index
++);
2100 arrayiter_dealloc(arrayiterobject
*it
)
2102 PyObject_GC_UnTrack(it
);
2104 PyObject_GC_Del(it
);
2108 arrayiter_traverse(arrayiterobject
*it
, visitproc visit
, void *arg
)
2114 static PyTypeObject PyArrayIter_Type
= {
2115 PyVarObject_HEAD_INIT(NULL
, 0)
2116 "arrayiterator", /* tp_name */
2117 sizeof(arrayiterobject
), /* tp_basicsize */
2118 0, /* tp_itemsize */
2120 (destructor
)arrayiter_dealloc
, /* tp_dealloc */
2124 0, /* tp_reserved */
2126 0, /* tp_as_number */
2127 0, /* tp_as_sequence */
2128 0, /* tp_as_mapping */
2132 PyObject_GenericGetAttr
, /* tp_getattro */
2133 0, /* tp_setattro */
2134 0, /* tp_as_buffer */
2135 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
,/* tp_flags */
2137 (traverseproc
)arrayiter_traverse
, /* tp_traverse */
2139 0, /* tp_richcompare */
2140 0, /* tp_weaklistoffset */
2141 PyObject_SelfIter
, /* tp_iter */
2142 (iternextfunc
)arrayiter_next
, /* tp_iternext */
2147 /*********************** Install Module **************************/
2149 /* No functions in array module. */
2150 static PyMethodDef a_methods
[] = {
2151 {NULL
, NULL
, 0, NULL
} /* Sentinel */
2154 static struct PyModuleDef arraymodule
= {
2155 PyModuleDef_HEAD_INIT
,
2171 PyObject
*typecodes
;
2172 Py_ssize_t size
= 0;
2173 register Py_UNICODE
*p
;
2174 struct arraydescr
*descr
;
2176 if (PyType_Ready(&Arraytype
) < 0)
2178 Py_TYPE(&PyArrayIter_Type
) = &PyType_Type
;
2179 m
= PyModule_Create(&arraymodule
);
2183 Py_INCREF((PyObject
*)&Arraytype
);
2184 PyModule_AddObject(m
, "ArrayType", (PyObject
*)&Arraytype
);
2185 Py_INCREF((PyObject
*)&Arraytype
);
2186 PyModule_AddObject(m
, "array", (PyObject
*)&Arraytype
);
2188 for (descr
=descriptors
; descr
->typecode
!= '\0'; descr
++) {
2192 typecodes
= PyUnicode_FromStringAndSize(NULL
, size
);
2193 p
= PyUnicode_AS_UNICODE(typecodes
);
2194 for (descr
= descriptors
; descr
->typecode
!= '\0'; descr
++) {
2195 *p
++ = (char)descr
->typecode
;
2198 PyModule_AddObject(m
, "typecodes", (PyObject
*)typecodes
);
2200 if (PyErr_Occurred()) {