1 /* Array object implementation */
2
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 */
5
6 #ifndef Py_BUILD_CORE_BUILTIN
7 # define Py_BUILD_CORE_MODULE 1
8 #endif
9
10 #include "Python.h"
11 #include "pycore_bytesobject.h" // _PyBytes_Repeat
12 #include "pycore_call.h" // _PyObject_CallMethod()
13 #include "pycore_ceval.h" // _PyEval_GetBuiltin()
14 #include "pycore_modsupport.h" // _PyArg_NoKeywords()
15 #include "pycore_moduleobject.h" // _PyModule_GetState()
16
17 #include <stddef.h> // offsetof()
18 #include <stdbool.h>
19
20 /*[clinic input]
21 module array
22 [clinic start generated code]*/
23 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=7d1b8d7f5958fd83]*/
24
25 struct arrayobject; /* Forward */
26 static struct PyModuleDef arraymodule;
27
28 /* All possible arraydescr values are defined in the vector "descriptors"
29 * below. That's defined later because the appropriate get and set
30 * functions aren't visible yet.
31 */
32 struct arraydescr {
33 char typecode;
34 int itemsize;
35 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
36 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
37 int (*compareitems)(const void *, const void *, Py_ssize_t);
38 const char *formats;
39 int is_integer_type;
40 int is_signed;
41 };
42
43 typedef struct arrayobject {
44 PyObject_VAR_HEAD
45 char *ob_item;
46 Py_ssize_t allocated;
47 const struct arraydescr *ob_descr;
48 PyObject *weakreflist; /* List of weak references */
49 Py_ssize_t ob_exports; /* Number of exported buffers */
50 } arrayobject;
51
52 typedef struct {
53 PyObject_HEAD
54 Py_ssize_t index;
55 arrayobject *ao;
56 PyObject* (*getitem)(struct arrayobject *, Py_ssize_t);
57 } arrayiterobject;
58
59 typedef struct {
60 PyTypeObject *ArrayType;
61 PyTypeObject *ArrayIterType;
62
63 PyObject *array_reconstructor;
64
65 PyObject *str_read;
66 PyObject *str_write;
67 PyObject *str___dict__;
68 PyObject *str_iter;
69 } array_state;
70
71 static array_state *
get_array_state(PyObject * module)72 get_array_state(PyObject *module)
73 {
74 return (array_state *)_PyModule_GetState(module);
75 }
76
77 #define find_array_state_by_type(tp) \
78 (get_array_state(PyType_GetModuleByDef(tp, &arraymodule)))
79 #define get_array_state_by_class(cls) \
80 (get_array_state(PyType_GetModule(cls)))
81
82 enum machine_format_code {
83 UNKNOWN_FORMAT = -1,
84 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
85 * array type code cannot be interpreted. When this occurs, a list of
86 * Python objects is used to represent the content of the array
87 * instead of using the memory content of the array directly. In that
88 * case, the array_reconstructor mechanism is bypassed completely, and
89 * the standard array constructor is used instead.
90 *
91 * This is will most likely occur when the machine doesn't use IEEE
92 * floating-point numbers.
93 */
94
95 UNSIGNED_INT8 = 0,
96 SIGNED_INT8 = 1,
97 UNSIGNED_INT16_LE = 2,
98 UNSIGNED_INT16_BE = 3,
99 SIGNED_INT16_LE = 4,
100 SIGNED_INT16_BE = 5,
101 UNSIGNED_INT32_LE = 6,
102 UNSIGNED_INT32_BE = 7,
103 SIGNED_INT32_LE = 8,
104 SIGNED_INT32_BE = 9,
105 UNSIGNED_INT64_LE = 10,
106 UNSIGNED_INT64_BE = 11,
107 SIGNED_INT64_LE = 12,
108 SIGNED_INT64_BE = 13,
109 IEEE_754_FLOAT_LE = 14,
110 IEEE_754_FLOAT_BE = 15,
111 IEEE_754_DOUBLE_LE = 16,
112 IEEE_754_DOUBLE_BE = 17,
113 UTF16_LE = 18,
114 UTF16_BE = 19,
115 UTF32_LE = 20,
116 UTF32_BE = 21
117 };
118 #define MACHINE_FORMAT_CODE_MIN 0
119 #define MACHINE_FORMAT_CODE_MAX 21
120
121
122 /*
123 * Must come after arrayobject, arrayiterobject,
124 * and enum machine_code_type definitions.
125 */
126 #include "clinic/arraymodule.c.h"
127
128 #define array_Check(op, state) PyObject_TypeCheck(op, state->ArrayType)
129
130 static int
array_resize(arrayobject * self,Py_ssize_t newsize)131 array_resize(arrayobject *self, Py_ssize_t newsize)
132 {
133 char *items;
134 size_t _new_size;
135
136 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
137 PyErr_SetString(PyExc_BufferError,
138 "cannot resize an array that is exporting buffers");
139 return -1;
140 }
141
142 /* Bypass realloc() when a previous overallocation is large enough
143 to accommodate the newsize. If the newsize is 16 smaller than the
144 current size, then proceed with the realloc() to shrink the array.
145 */
146
147 if (self->allocated >= newsize &&
148 Py_SIZE(self) < newsize + 16 &&
149 self->ob_item != NULL) {
150 Py_SET_SIZE(self, newsize);
151 return 0;
152 }
153
154 if (newsize == 0) {
155 PyMem_Free(self->ob_item);
156 self->ob_item = NULL;
157 Py_SET_SIZE(self, 0);
158 self->allocated = 0;
159 return 0;
160 }
161
162 /* This over-allocates proportional to the array size, making room
163 * for additional growth. The over-allocation is mild, but is
164 * enough to give linear-time amortized behavior over a long
165 * sequence of appends() in the presence of a poorly-performing
166 * system realloc().
167 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
168 * Note, the pattern starts out the same as for lists but then
169 * grows at a smaller rate so that larger arrays only overallocate
170 * by about 1/16th -- this is done because arrays are presumed to be more
171 * memory critical.
172 */
173
174 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
175 items = self->ob_item;
176 /* XXX The following multiplication and division does not optimize away
177 like it does for lists since the size is not known at compile time */
178 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
179 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
180 else
181 items = NULL;
182 if (items == NULL) {
183 PyErr_NoMemory();
184 return -1;
185 }
186 self->ob_item = items;
187 Py_SET_SIZE(self, newsize);
188 self->allocated = _new_size;
189 return 0;
190 }
191
192 /****************************************************************************
193 Get and Set functions for each type.
194 A Get function takes an arrayobject* and an integer index, returning the
195 array value at that index wrapped in an appropriate PyObject*.
196 A Set function takes an arrayobject, integer index, and PyObject*; sets
197 the array value at that index to the raw C data extracted from the PyObject*,
198 and returns 0 if successful, else nonzero on failure (PyObject* not of an
199 appropriate type or value).
200 Note that the basic Get and Set functions do NOT check that the index is
201 in bounds; that's the responsibility of the caller.
202 ****************************************************************************/
203
204 static PyObject *
b_getitem(arrayobject * ap,Py_ssize_t i)205 b_getitem(arrayobject *ap, Py_ssize_t i)
206 {
207 long x = ((signed char *)ap->ob_item)[i];
208 return PyLong_FromLong(x);
209 }
210
211 static int
b_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)212 b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
213 {
214 short x;
215 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
216 must use the next size up that is signed ('h') and manually do
217 the overflow checking */
218 if (!PyArg_Parse(v, "h;array item must be integer", &x))
219 return -1;
220 else if (x < -128) {
221 PyErr_SetString(PyExc_OverflowError,
222 "signed char is less than minimum");
223 return -1;
224 }
225 else if (x > 127) {
226 PyErr_SetString(PyExc_OverflowError,
227 "signed char is greater than maximum");
228 return -1;
229 }
230 if (i >= 0)
231 ((char *)ap->ob_item)[i] = (char)x;
232 return 0;
233 }
234
235 static PyObject *
BB_getitem(arrayobject * ap,Py_ssize_t i)236 BB_getitem(arrayobject *ap, Py_ssize_t i)
237 {
238 long x = ((unsigned char *)ap->ob_item)[i];
239 return PyLong_FromLong(x);
240 }
241
242 static int
BB_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)243 BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
244 {
245 unsigned char x;
246 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
247 if (!PyArg_Parse(v, "b;array item must be integer", &x))
248 return -1;
249 if (i >= 0)
250 ((unsigned char *)ap->ob_item)[i] = x;
251 return 0;
252 }
253
254 static PyObject *
u_getitem(arrayobject * ap,Py_ssize_t i)255 u_getitem(arrayobject *ap, Py_ssize_t i)
256 {
257 return PyUnicode_FromOrdinal(((wchar_t *) ap->ob_item)[i]);
258 }
259
260 static int
u_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)261 u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
262 {
263 PyObject *u;
264 if (!PyArg_Parse(v, "U;array item must be unicode character", &u)) {
265 return -1;
266 }
267
268 Py_ssize_t len = PyUnicode_AsWideChar(u, NULL, 0);
269 if (len != 2) {
270 PyErr_SetString(PyExc_TypeError,
271 "array item must be unicode character");
272 return -1;
273 }
274
275 wchar_t w;
276 len = PyUnicode_AsWideChar(u, &w, 1);
277 assert(len == 1);
278
279 if (i >= 0) {
280 ((wchar_t *)ap->ob_item)[i] = w;
281 }
282 return 0;
283 }
284
285 static PyObject *
w_getitem(arrayobject * ap,Py_ssize_t i)286 w_getitem(arrayobject *ap, Py_ssize_t i)
287 {
288 return PyUnicode_FromOrdinal(((Py_UCS4 *) ap->ob_item)[i]);
289 }
290
291 static int
w_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)292 w_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
293 {
294 PyObject *u;
295 if (!PyArg_Parse(v, "U;array item must be unicode character", &u)) {
296 return -1;
297 }
298
299 if (PyUnicode_GetLength(u) != 1) {
300 PyErr_SetString(PyExc_TypeError,
301 "array item must be unicode character");
302 return -1;
303 }
304
305 if (i >= 0) {
306 ((Py_UCS4 *)ap->ob_item)[i] = PyUnicode_READ_CHAR(u, 0);
307 }
308 return 0;
309 }
310
311 static PyObject *
h_getitem(arrayobject * ap,Py_ssize_t i)312 h_getitem(arrayobject *ap, Py_ssize_t i)
313 {
314 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
315 }
316
317
318 static int
h_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)319 h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
320 {
321 short x;
322 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
323 if (!PyArg_Parse(v, "h;array item must be integer", &x))
324 return -1;
325 if (i >= 0)
326 ((short *)ap->ob_item)[i] = x;
327 return 0;
328 }
329
330 static PyObject *
HH_getitem(arrayobject * ap,Py_ssize_t i)331 HH_getitem(arrayobject *ap, Py_ssize_t i)
332 {
333 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
334 }
335
336 static int
HH_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)337 HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
338 {
339 int x;
340 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
341 must use the next size up and manually do the overflow checking */
342 if (!PyArg_Parse(v, "i;array item must be integer", &x))
343 return -1;
344 else if (x < 0) {
345 PyErr_SetString(PyExc_OverflowError,
346 "unsigned short is less than minimum");
347 return -1;
348 }
349 else if (x > USHRT_MAX) {
350 PyErr_SetString(PyExc_OverflowError,
351 "unsigned short is greater than maximum");
352 return -1;
353 }
354 if (i >= 0)
355 ((short *)ap->ob_item)[i] = (short)x;
356 return 0;
357 }
358
359 static PyObject *
i_getitem(arrayobject * ap,Py_ssize_t i)360 i_getitem(arrayobject *ap, Py_ssize_t i)
361 {
362 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
363 }
364
365 static int
i_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)366 i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
367 {
368 int x;
369 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
370 if (!PyArg_Parse(v, "i;array item must be integer", &x))
371 return -1;
372 if (i >= 0)
373 ((int *)ap->ob_item)[i] = x;
374 return 0;
375 }
376
377 static PyObject *
II_getitem(arrayobject * ap,Py_ssize_t i)378 II_getitem(arrayobject *ap, Py_ssize_t i)
379 {
380 return PyLong_FromUnsignedLong(
381 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
382 }
383
384 static int
II_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)385 II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
386 {
387 unsigned long x;
388 int do_decref = 0; /* if nb_int was called */
389
390 if (!PyLong_Check(v)) {
391 v = _PyNumber_Index(v);
392 if (NULL == v) {
393 return -1;
394 }
395 do_decref = 1;
396 }
397 x = PyLong_AsUnsignedLong(v);
398 if (x == (unsigned long)-1 && PyErr_Occurred()) {
399 if (do_decref) {
400 Py_DECREF(v);
401 }
402 return -1;
403 }
404 if (x > UINT_MAX) {
405 PyErr_SetString(PyExc_OverflowError,
406 "unsigned int is greater than maximum");
407 if (do_decref) {
408 Py_DECREF(v);
409 }
410 return -1;
411 }
412 if (i >= 0)
413 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
414
415 if (do_decref) {
416 Py_DECREF(v);
417 }
418 return 0;
419 }
420
421 static PyObject *
l_getitem(arrayobject * ap,Py_ssize_t i)422 l_getitem(arrayobject *ap, Py_ssize_t i)
423 {
424 return PyLong_FromLong(((long *)ap->ob_item)[i]);
425 }
426
427 static int
l_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)428 l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
429 {
430 long x;
431 if (!PyArg_Parse(v, "l;array item must be integer", &x))
432 return -1;
433 if (i >= 0)
434 ((long *)ap->ob_item)[i] = x;
435 return 0;
436 }
437
438 static PyObject *
LL_getitem(arrayobject * ap,Py_ssize_t i)439 LL_getitem(arrayobject *ap, Py_ssize_t i)
440 {
441 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
442 }
443
444 static int
LL_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)445 LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
446 {
447 unsigned long x;
448 int do_decref = 0; /* if nb_int was called */
449
450 if (!PyLong_Check(v)) {
451 v = _PyNumber_Index(v);
452 if (NULL == v) {
453 return -1;
454 }
455 do_decref = 1;
456 }
457 x = PyLong_AsUnsignedLong(v);
458 if (x == (unsigned long)-1 && PyErr_Occurred()) {
459 if (do_decref) {
460 Py_DECREF(v);
461 }
462 return -1;
463 }
464 if (i >= 0)
465 ((unsigned long *)ap->ob_item)[i] = x;
466
467 if (do_decref) {
468 Py_DECREF(v);
469 }
470 return 0;
471 }
472
473 static PyObject *
q_getitem(arrayobject * ap,Py_ssize_t i)474 q_getitem(arrayobject *ap, Py_ssize_t i)
475 {
476 return PyLong_FromLongLong(((long long *)ap->ob_item)[i]);
477 }
478
479 static int
q_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)480 q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
481 {
482 long long x;
483 if (!PyArg_Parse(v, "L;array item must be integer", &x))
484 return -1;
485 if (i >= 0)
486 ((long long *)ap->ob_item)[i] = x;
487 return 0;
488 }
489
490 static PyObject *
QQ_getitem(arrayobject * ap,Py_ssize_t i)491 QQ_getitem(arrayobject *ap, Py_ssize_t i)
492 {
493 return PyLong_FromUnsignedLongLong(
494 ((unsigned long long *)ap->ob_item)[i]);
495 }
496
497 static int
QQ_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)498 QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
499 {
500 unsigned long long x;
501 int do_decref = 0; /* if nb_int was called */
502
503 if (!PyLong_Check(v)) {
504 v = _PyNumber_Index(v);
505 if (NULL == v) {
506 return -1;
507 }
508 do_decref = 1;
509 }
510 x = PyLong_AsUnsignedLongLong(v);
511 if (x == (unsigned long long)-1 && PyErr_Occurred()) {
512 if (do_decref) {
513 Py_DECREF(v);
514 }
515 return -1;
516 }
517 if (i >= 0)
518 ((unsigned long long *)ap->ob_item)[i] = x;
519
520 if (do_decref) {
521 Py_DECREF(v);
522 }
523 return 0;
524 }
525
526 static PyObject *
f_getitem(arrayobject * ap,Py_ssize_t i)527 f_getitem(arrayobject *ap, Py_ssize_t i)
528 {
529 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
530 }
531
532 static int
f_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)533 f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
534 {
535 float x;
536 if (!PyArg_Parse(v, "f;array item must be float", &x))
537 return -1;
538 if (i >= 0)
539 ((float *)ap->ob_item)[i] = x;
540 return 0;
541 }
542
543 static PyObject *
d_getitem(arrayobject * ap,Py_ssize_t i)544 d_getitem(arrayobject *ap, Py_ssize_t i)
545 {
546 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
547 }
548
549 static int
d_setitem(arrayobject * ap,Py_ssize_t i,PyObject * v)550 d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
551 {
552 double x;
553 if (!PyArg_Parse(v, "d;array item must be float", &x))
554 return -1;
555 if (i >= 0)
556 ((double *)ap->ob_item)[i] = x;
557 return 0;
558 }
559
560 #define DEFINE_COMPAREITEMS(code, type) \
561 static int \
562 code##_compareitems(const void *lhs, const void *rhs, Py_ssize_t length) \
563 { \
564 const type *a = lhs, *b = rhs; \
565 for (Py_ssize_t i = 0; i < length; ++i) \
566 if (a[i] != b[i]) \
567 return a[i] < b[i] ? -1 : 1; \
568 return 0; \
569 }
570
571 DEFINE_COMPAREITEMS(b, signed char)
572 DEFINE_COMPAREITEMS(BB, unsigned char)
573 DEFINE_COMPAREITEMS(u, wchar_t)
574 DEFINE_COMPAREITEMS(w, Py_UCS4)
575 DEFINE_COMPAREITEMS(h, short)
576 DEFINE_COMPAREITEMS(HH, unsigned short)
577 DEFINE_COMPAREITEMS(i, int)
578 DEFINE_COMPAREITEMS(II, unsigned int)
579 DEFINE_COMPAREITEMS(l, long)
580 DEFINE_COMPAREITEMS(LL, unsigned long)
581 DEFINE_COMPAREITEMS(q, long long)
582 DEFINE_COMPAREITEMS(QQ, unsigned long long)
583
584 /* Description of types.
585 *
586 * Don't forget to update typecode_to_mformat_code() if you add a new
587 * typecode.
588 */
589 static const struct arraydescr descriptors[] = {
590 {'b', 1, b_getitem, b_setitem, b_compareitems, "b", 1, 1},
591 {'B', 1, BB_getitem, BB_setitem, BB_compareitems, "B", 1, 0},
592 {'u', sizeof(wchar_t), u_getitem, u_setitem, u_compareitems, "u", 0, 0},
593 {'w', sizeof(Py_UCS4), w_getitem, w_setitem, w_compareitems, "w", 0, 0,},
594 {'h', sizeof(short), h_getitem, h_setitem, h_compareitems, "h", 1, 1},
595 {'H', sizeof(short), HH_getitem, HH_setitem, HH_compareitems, "H", 1, 0},
596 {'i', sizeof(int), i_getitem, i_setitem, i_compareitems, "i", 1, 1},
597 {'I', sizeof(int), II_getitem, II_setitem, II_compareitems, "I", 1, 0},
598 {'l', sizeof(long), l_getitem, l_setitem, l_compareitems, "l", 1, 1},
599 {'L', sizeof(long), LL_getitem, LL_setitem, LL_compareitems, "L", 1, 0},
600 {'q', sizeof(long long), q_getitem, q_setitem, q_compareitems, "q", 1, 1},
601 {'Q', sizeof(long long), QQ_getitem, QQ_setitem, QQ_compareitems, "Q", 1, 0},
602 {'f', sizeof(float), f_getitem, f_setitem, NULL, "f", 0, 0},
603 {'d', sizeof(double), d_getitem, d_setitem, NULL, "d", 0, 0},
604 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
605 };
606
607 /****************************************************************************
608 Implementations of array object methods.
609 ****************************************************************************/
610 /*[clinic input]
611 class array.array "arrayobject *" "ArrayType"
612 [clinic start generated code]*/
613 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=a5c29edf59f176a3]*/
614
615 static PyObject *
newarrayobject(PyTypeObject * type,Py_ssize_t size,const struct arraydescr * descr)616 newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *descr)
617 {
618 arrayobject *op;
619 size_t nbytes;
620
621 if (size < 0) {
622 PyErr_BadInternalCall();
623 return NULL;
624 }
625
626 /* Check for overflow */
627 if (size > PY_SSIZE_T_MAX / descr->itemsize) {
628 return PyErr_NoMemory();
629 }
630 nbytes = size * descr->itemsize;
631 op = (arrayobject *) type->tp_alloc(type, 0);
632 if (op == NULL) {
633 return NULL;
634 }
635 op->ob_descr = descr;
636 op->allocated = size;
637 op->weakreflist = NULL;
638 Py_SET_SIZE(op, size);
639 if (size <= 0) {
640 op->ob_item = NULL;
641 }
642 else {
643 op->ob_item = PyMem_NEW(char, nbytes);
644 if (op->ob_item == NULL) {
645 Py_DECREF(op);
646 return PyErr_NoMemory();
647 }
648 }
649 op->ob_exports = 0;
650 return (PyObject *) op;
651 }
652
653 static PyObject *
getarrayitem(PyObject * op,Py_ssize_t i)654 getarrayitem(PyObject *op, Py_ssize_t i)
655 {
656 #ifndef NDEBUG
657 array_state *state = find_array_state_by_type(Py_TYPE(op));
658 assert(array_Check(op, state));
659 #endif
660 arrayobject *ap;
661 ap = (arrayobject *)op;
662 assert(i>=0 && i<Py_SIZE(ap));
663 return (*ap->ob_descr->getitem)(ap, i);
664 }
665
666 static int
ins1(arrayobject * self,Py_ssize_t where,PyObject * v)667 ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
668 {
669 char *items;
670 Py_ssize_t n = Py_SIZE(self);
671 if (v == NULL) {
672 PyErr_BadInternalCall();
673 return -1;
674 }
675 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
676 return -1;
677
678 if (array_resize(self, n+1) == -1)
679 return -1;
680 items = self->ob_item;
681 if (where < 0) {
682 where += n;
683 if (where < 0)
684 where = 0;
685 }
686 if (where > n)
687 where = n;
688 /* appends don't need to call memmove() */
689 if (where != n)
690 memmove(items + (where+1)*self->ob_descr->itemsize,
691 items + where*self->ob_descr->itemsize,
692 (n-where)*self->ob_descr->itemsize);
693 return (*self->ob_descr->setitem)(self, where, v);
694 }
695
696 /* Methods */
697
698 static int
array_tp_traverse(arrayobject * op,visitproc visit,void * arg)699 array_tp_traverse(arrayobject *op, visitproc visit, void *arg)
700 {
701 Py_VISIT(Py_TYPE(op));
702 return 0;
703 }
704
705 static void
array_dealloc(arrayobject * op)706 array_dealloc(arrayobject *op)
707 {
708 PyTypeObject *tp = Py_TYPE(op);
709 PyObject_GC_UnTrack(op);
710
711 if (op->weakreflist != NULL)
712 PyObject_ClearWeakRefs((PyObject *) op);
713 if (op->ob_item != NULL)
714 PyMem_Free(op->ob_item);
715 tp->tp_free(op);
716 Py_DECREF(tp);
717 }
718
719 static PyObject *
array_richcompare(PyObject * v,PyObject * w,int op)720 array_richcompare(PyObject *v, PyObject *w, int op)
721 {
722 array_state *state = find_array_state_by_type(Py_TYPE(v));
723 arrayobject *va, *wa;
724 PyObject *vi = NULL;
725 PyObject *wi = NULL;
726 Py_ssize_t i, k;
727 PyObject *res;
728
729 if (!array_Check(v, state) || !array_Check(w, state))
730 Py_RETURN_NOTIMPLEMENTED;
731
732 va = (arrayobject *)v;
733 wa = (arrayobject *)w;
734
735 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
736 /* Shortcut: if the lengths differ, the arrays differ */
737 if (op == Py_EQ)
738 res = Py_False;
739 else
740 res = Py_True;
741 return Py_NewRef(res);
742 }
743
744 if (va->ob_descr == wa->ob_descr && va->ob_descr->compareitems != NULL) {
745 /* Fast path:
746 arrays with same types can have their buffers compared directly */
747 Py_ssize_t common_length = Py_MIN(Py_SIZE(va), Py_SIZE(wa));
748 int result = va->ob_descr->compareitems(va->ob_item, wa->ob_item,
749 common_length);
750 if (result == 0)
751 goto compare_sizes;
752
753 int cmp;
754 switch (op) {
755 case Py_LT: cmp = result < 0; break;
756 case Py_LE: cmp = result <= 0; break;
757 case Py_EQ: cmp = result == 0; break;
758 case Py_NE: cmp = result != 0; break;
759 case Py_GT: cmp = result > 0; break;
760 case Py_GE: cmp = result >= 0; break;
761 default: return NULL; /* cannot happen */
762 }
763 PyObject *res = cmp ? Py_True : Py_False;
764 return Py_NewRef(res);
765 }
766
767
768 /* Search for the first index where items are different */
769 k = 1;
770 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
771 vi = getarrayitem(v, i);
772 if (vi == NULL) {
773 return NULL;
774 }
775 wi = getarrayitem(w, i);
776 if (wi == NULL) {
777 Py_DECREF(vi);
778 return NULL;
779 }
780 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
781 if (k == 0)
782 break; /* Keeping vi and wi alive! */
783 Py_DECREF(vi);
784 Py_DECREF(wi);
785 if (k < 0)
786 return NULL;
787 }
788
789 if (k) {
790 /* No more items to compare -- compare sizes */
791 compare_sizes: ;
792 Py_ssize_t vs = Py_SIZE(va);
793 Py_ssize_t ws = Py_SIZE(wa);
794 int cmp;
795 switch (op) {
796 case Py_LT: cmp = vs < ws; break;
797 case Py_LE: cmp = vs <= ws; break;
798 /* If the lengths were not equal,
799 the earlier fast-path check would have caught that. */
800 case Py_EQ: assert(vs == ws); cmp = 1; break;
801 case Py_NE: assert(vs == ws); cmp = 0; break;
802 case Py_GT: cmp = vs > ws; break;
803 case Py_GE: cmp = vs >= ws; break;
804 default: return NULL; /* cannot happen */
805 }
806 if (cmp)
807 res = Py_True;
808 else
809 res = Py_False;
810 return Py_NewRef(res);
811 }
812
813 /* We have an item that differs. First, shortcuts for EQ/NE */
814 if (op == Py_EQ) {
815 res = Py_NewRef(Py_False);
816 }
817 else if (op == Py_NE) {
818 res = Py_NewRef(Py_True);
819 }
820 else {
821 /* Compare the final item again using the proper operator */
822 res = PyObject_RichCompare(vi, wi, op);
823 }
824 Py_DECREF(vi);
825 Py_DECREF(wi);
826 return res;
827 }
828
829 static Py_ssize_t
array_length(arrayobject * a)830 array_length(arrayobject *a)
831 {
832 return Py_SIZE(a);
833 }
834
835 static PyObject *
array_item(arrayobject * a,Py_ssize_t i)836 array_item(arrayobject *a, Py_ssize_t i)
837 {
838 if (i < 0 || i >= Py_SIZE(a)) {
839 PyErr_SetString(PyExc_IndexError, "array index out of range");
840 return NULL;
841 }
842 return getarrayitem((PyObject *)a, i);
843 }
844
845 static PyObject *
array_slice(arrayobject * a,Py_ssize_t ilow,Py_ssize_t ihigh)846 array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
847 {
848 array_state *state = find_array_state_by_type(Py_TYPE(a));
849 arrayobject *np;
850
851 if (ilow < 0)
852 ilow = 0;
853 else if (ilow > Py_SIZE(a))
854 ilow = Py_SIZE(a);
855 if (ihigh < 0)
856 ihigh = 0;
857 if (ihigh < ilow)
858 ihigh = ilow;
859 else if (ihigh > Py_SIZE(a))
860 ihigh = Py_SIZE(a);
861 np = (arrayobject *) newarrayobject(state->ArrayType, ihigh - ilow, a->ob_descr);
862 if (np == NULL)
863 return NULL;
864 if (ihigh > ilow) {
865 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
866 (ihigh-ilow) * a->ob_descr->itemsize);
867 }
868 return (PyObject *)np;
869 }
870
871 /*[clinic input]
872 array.array.clear
873
874 Remove all items from the array.
875 [clinic start generated code]*/
876
877 static PyObject *
array_array_clear_impl(arrayobject * self)878 array_array_clear_impl(arrayobject *self)
879 /*[clinic end generated code: output=5efe0417062210a9 input=5dffa30e94e717a4]*/
880 {
881 if (array_resize(self, 0) == -1) {
882 return NULL;
883 }
884 Py_RETURN_NONE;
885 }
886
887 /*[clinic input]
888 array.array.__copy__
889
890 Return a copy of the array.
891 [clinic start generated code]*/
892
893 static PyObject *
array_array___copy___impl(arrayobject * self)894 array_array___copy___impl(arrayobject *self)
895 /*[clinic end generated code: output=dec7c3f925d9619e input=ad1ee5b086965f09]*/
896 {
897 return array_slice(self, 0, Py_SIZE(self));
898 }
899
900 /*[clinic input]
901 array.array.__deepcopy__
902
903 unused: object
904 /
905
906 Return a copy of the array.
907 [clinic start generated code]*/
908
909 static PyObject *
array_array___deepcopy__(arrayobject * self,PyObject * unused)910 array_array___deepcopy__(arrayobject *self, PyObject *unused)
911 /*[clinic end generated code: output=1ec748d8e14a9faa input=2405ecb4933748c4]*/
912 {
913 return array_array___copy___impl(self);
914 }
915
916 static PyObject *
array_concat(arrayobject * a,PyObject * bb)917 array_concat(arrayobject *a, PyObject *bb)
918 {
919 array_state *state = find_array_state_by_type(Py_TYPE(a));
920 Py_ssize_t size;
921 arrayobject *np;
922 if (!array_Check(bb, state)) {
923 PyErr_Format(PyExc_TypeError,
924 "can only append array (not \"%.200s\") to array",
925 Py_TYPE(bb)->tp_name);
926 return NULL;
927 }
928 #define b ((arrayobject *)bb)
929 if (a->ob_descr != b->ob_descr) {
930 PyErr_BadArgument();
931 return NULL;
932 }
933 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
934 return PyErr_NoMemory();
935 }
936 size = Py_SIZE(a) + Py_SIZE(b);
937 np = (arrayobject *) newarrayobject(state->ArrayType, size, a->ob_descr);
938 if (np == NULL) {
939 return NULL;
940 }
941 if (Py_SIZE(a) > 0) {
942 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
943 }
944 if (Py_SIZE(b) > 0) {
945 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
946 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
947 }
948 return (PyObject *)np;
949 #undef b
950 }
951
952 static PyObject *
array_repeat(arrayobject * a,Py_ssize_t n)953 array_repeat(arrayobject *a, Py_ssize_t n)
954 {
955 array_state *state = find_array_state_by_type(Py_TYPE(a));
956
957 if (n < 0)
958 n = 0;
959 const Py_ssize_t array_length = Py_SIZE(a);
960 if ((array_length != 0) && (n > PY_SSIZE_T_MAX / array_length)) {
961 return PyErr_NoMemory();
962 }
963 Py_ssize_t size = array_length * n;
964 arrayobject* np = (arrayobject *) newarrayobject(state->ArrayType, size, a->ob_descr);
965 if (np == NULL)
966 return NULL;
967 if (size == 0)
968 return (PyObject *)np;
969
970 const Py_ssize_t oldbytes = array_length * a->ob_descr->itemsize;
971 const Py_ssize_t newbytes = oldbytes * n;
972 _PyBytes_Repeat(np->ob_item, newbytes, a->ob_item, oldbytes);
973
974 return (PyObject *)np;
975 }
976
977 static int
array_del_slice(arrayobject * a,Py_ssize_t ilow,Py_ssize_t ihigh)978 array_del_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
979 {
980 char *item;
981 Py_ssize_t d; /* Change in size */
982 if (ilow < 0)
983 ilow = 0;
984 else if (ilow > Py_SIZE(a))
985 ilow = Py_SIZE(a);
986 if (ihigh < 0)
987 ihigh = 0;
988 if (ihigh < ilow)
989 ihigh = ilow;
990 else if (ihigh > Py_SIZE(a))
991 ihigh = Py_SIZE(a);
992 item = a->ob_item;
993 d = ihigh-ilow;
994 /* Issue #4509: If the array has exported buffers and the slice
995 assignment would change the size of the array, fail early to make
996 sure we don't modify it. */
997 if (d != 0 && a->ob_exports > 0) {
998 PyErr_SetString(PyExc_BufferError,
999 "cannot resize an array that is exporting buffers");
1000 return -1;
1001 }
1002 if (d > 0) { /* Delete d items */
1003 memmove(item + (ihigh-d)*a->ob_descr->itemsize,
1004 item + ihigh*a->ob_descr->itemsize,
1005 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
1006 if (array_resize(a, Py_SIZE(a) - d) == -1)
1007 return -1;
1008 }
1009 return 0;
1010 }
1011
1012 static int
array_ass_item(arrayobject * a,Py_ssize_t i,PyObject * v)1013 array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
1014 {
1015 if (i < 0 || i >= Py_SIZE(a)) {
1016 PyErr_SetString(PyExc_IndexError,
1017 "array assignment index out of range");
1018 return -1;
1019 }
1020 if (v == NULL)
1021 return array_del_slice(a, i, i+1);
1022 return (*a->ob_descr->setitem)(a, i, v);
1023 }
1024
1025 static int
setarrayitem(PyObject * a,Py_ssize_t i,PyObject * v)1026 setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
1027 {
1028 #ifndef NDEBUG
1029 array_state *state = find_array_state_by_type(Py_TYPE(a));
1030 assert(array_Check(a, state));
1031 #endif
1032 return array_ass_item((arrayobject *)a, i, v);
1033 }
1034
1035 static int
array_iter_extend(arrayobject * self,PyObject * bb)1036 array_iter_extend(arrayobject *self, PyObject *bb)
1037 {
1038 PyObject *it, *v;
1039
1040 it = PyObject_GetIter(bb);
1041 if (it == NULL)
1042 return -1;
1043
1044 while ((v = PyIter_Next(it)) != NULL) {
1045 if (ins1(self, Py_SIZE(self), v) != 0) {
1046 Py_DECREF(v);
1047 Py_DECREF(it);
1048 return -1;
1049 }
1050 Py_DECREF(v);
1051 }
1052 Py_DECREF(it);
1053 if (PyErr_Occurred())
1054 return -1;
1055 return 0;
1056 }
1057
1058 static int
array_do_extend(array_state * state,arrayobject * self,PyObject * bb)1059 array_do_extend(array_state *state, arrayobject *self, PyObject *bb)
1060 {
1061 Py_ssize_t size, oldsize, bbsize;
1062
1063 if (!array_Check(bb, state))
1064 return array_iter_extend(self, bb);
1065 #define b ((arrayobject *)bb)
1066 if (self->ob_descr != b->ob_descr) {
1067 PyErr_SetString(PyExc_TypeError,
1068 "can only extend with array of same kind");
1069 return -1;
1070 }
1071 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
1072 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
1073 PyErr_NoMemory();
1074 return -1;
1075 }
1076 oldsize = Py_SIZE(self);
1077 /* Get the size of bb before resizing the array since bb could be self. */
1078 bbsize = Py_SIZE(bb);
1079 size = oldsize + Py_SIZE(b);
1080 if (array_resize(self, size) == -1)
1081 return -1;
1082 if (bbsize > 0) {
1083 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
1084 b->ob_item, bbsize * b->ob_descr->itemsize);
1085 }
1086
1087 return 0;
1088 #undef b
1089 }
1090
1091 static PyObject *
array_inplace_concat(arrayobject * self,PyObject * bb)1092 array_inplace_concat(arrayobject *self, PyObject *bb)
1093 {
1094 array_state *state = find_array_state_by_type(Py_TYPE(self));
1095
1096 if (!array_Check(bb, state)) {
1097 PyErr_Format(PyExc_TypeError,
1098 "can only extend array with array (not \"%.200s\")",
1099 Py_TYPE(bb)->tp_name);
1100 return NULL;
1101 }
1102 if (array_do_extend(state, self, bb) == -1)
1103 return NULL;
1104 return Py_NewRef(self);
1105 }
1106
1107 static PyObject *
array_inplace_repeat(arrayobject * self,Py_ssize_t n)1108 array_inplace_repeat(arrayobject *self, Py_ssize_t n)
1109 {
1110 const Py_ssize_t array_size = Py_SIZE(self);
1111
1112 if (array_size > 0 && n != 1 ) {
1113 if (n < 0)
1114 n = 0;
1115 if ((self->ob_descr->itemsize != 0) &&
1116 (array_size > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
1117 return PyErr_NoMemory();
1118 }
1119 Py_ssize_t size = array_size * self->ob_descr->itemsize;
1120 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
1121 return PyErr_NoMemory();
1122 }
1123 if (array_resize(self, n * array_size) == -1)
1124 return NULL;
1125
1126 _PyBytes_Repeat(self->ob_item, n*size, self->ob_item, size);
1127 }
1128 return Py_NewRef(self);
1129 }
1130
1131
1132 static PyObject *
ins(arrayobject * self,Py_ssize_t where,PyObject * v)1133 ins(arrayobject *self, Py_ssize_t where, PyObject *v)
1134 {
1135 if (ins1(self, where, v) != 0)
1136 return NULL;
1137 Py_RETURN_NONE;
1138 }
1139
1140 /*[clinic input]
1141 array.array.count
1142
1143 v: object
1144 /
1145
1146 Return number of occurrences of v in the array.
1147 [clinic start generated code]*/
1148
1149 static PyObject *
array_array_count(arrayobject * self,PyObject * v)1150 array_array_count(arrayobject *self, PyObject *v)
1151 /*[clinic end generated code: output=3dd3624bf7135a3a input=d9bce9d65e39d1f5]*/
1152 {
1153 Py_ssize_t count = 0;
1154 Py_ssize_t i;
1155
1156 for (i = 0; i < Py_SIZE(self); i++) {
1157 PyObject *selfi;
1158 int cmp;
1159
1160 selfi = getarrayitem((PyObject *)self, i);
1161 if (selfi == NULL)
1162 return NULL;
1163 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1164 Py_DECREF(selfi);
1165 if (cmp > 0)
1166 count++;
1167 else if (cmp < 0)
1168 return NULL;
1169 }
1170 return PyLong_FromSsize_t(count);
1171 }
1172
1173
1174 /*[clinic input]
1175 array.array.index
1176
1177 v: object
1178 start: slice_index(accept={int}) = 0
1179 stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
1180 /
1181
1182 Return index of first occurrence of v in the array.
1183
1184 Raise ValueError if the value is not present.
1185 [clinic start generated code]*/
1186
1187 static PyObject *
array_array_index_impl(arrayobject * self,PyObject * v,Py_ssize_t start,Py_ssize_t stop)1188 array_array_index_impl(arrayobject *self, PyObject *v, Py_ssize_t start,
1189 Py_ssize_t stop)
1190 /*[clinic end generated code: output=c45e777880c99f52 input=089dff7baa7e5a7e]*/
1191 {
1192 if (start < 0) {
1193 start += Py_SIZE(self);
1194 if (start < 0) {
1195 start = 0;
1196 }
1197 }
1198 if (stop < 0) {
1199 stop += Py_SIZE(self);
1200 }
1201 // Use Py_SIZE() for every iteration in case the array is mutated
1202 // during PyObject_RichCompareBool()
1203 for (Py_ssize_t i = start; i < stop && i < Py_SIZE(self); i++) {
1204 PyObject *selfi;
1205 int cmp;
1206
1207 selfi = getarrayitem((PyObject *)self, i);
1208 if (selfi == NULL)
1209 return NULL;
1210 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1211 Py_DECREF(selfi);
1212 if (cmp > 0) {
1213 return PyLong_FromSsize_t(i);
1214 }
1215 else if (cmp < 0)
1216 return NULL;
1217 }
1218 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
1219 return NULL;
1220 }
1221
1222 static int
array_contains(arrayobject * self,PyObject * v)1223 array_contains(arrayobject *self, PyObject *v)
1224 {
1225 Py_ssize_t i;
1226 int cmp;
1227
1228 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1229 PyObject *selfi = getarrayitem((PyObject *)self, i);
1230 if (selfi == NULL)
1231 return -1;
1232 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1233 Py_DECREF(selfi);
1234 }
1235 return cmp;
1236 }
1237
1238 /*[clinic input]
1239 array.array.remove
1240
1241 v: object
1242 /
1243
1244 Remove the first occurrence of v in the array.
1245 [clinic start generated code]*/
1246
1247 static PyObject *
array_array_remove(arrayobject * self,PyObject * v)1248 array_array_remove(arrayobject *self, PyObject *v)
1249 /*[clinic end generated code: output=bef06be9fdf9dceb input=0b1e5aed25590027]*/
1250 {
1251 Py_ssize_t i;
1252
1253 for (i = 0; i < Py_SIZE(self); i++) {
1254 PyObject *selfi;
1255 int cmp;
1256
1257 selfi = getarrayitem((PyObject *)self,i);
1258 if (selfi == NULL)
1259 return NULL;
1260 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1261 Py_DECREF(selfi);
1262 if (cmp > 0) {
1263 if (array_del_slice(self, i, i+1) != 0)
1264 return NULL;
1265 Py_RETURN_NONE;
1266 }
1267 else if (cmp < 0)
1268 return NULL;
1269 }
1270 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
1271 return NULL;
1272 }
1273
1274 /*[clinic input]
1275 array.array.pop
1276
1277 i: Py_ssize_t = -1
1278 /
1279
1280 Return the i-th element and delete it from the array.
1281
1282 i defaults to -1.
1283 [clinic start generated code]*/
1284
1285 static PyObject *
array_array_pop_impl(arrayobject * self,Py_ssize_t i)1286 array_array_pop_impl(arrayobject *self, Py_ssize_t i)
1287 /*[clinic end generated code: output=bc1f0c54fe5308e4 input=8e5feb4c1a11cd44]*/
1288 {
1289 PyObject *v;
1290
1291 if (Py_SIZE(self) == 0) {
1292 /* Special-case most common failure cause */
1293 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1294 return NULL;
1295 }
1296 if (i < 0)
1297 i += Py_SIZE(self);
1298 if (i < 0 || i >= Py_SIZE(self)) {
1299 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1300 return NULL;
1301 }
1302 v = getarrayitem((PyObject *)self, i);
1303 if (v == NULL)
1304 return NULL;
1305 if (array_del_slice(self, i, i+1) != 0) {
1306 Py_DECREF(v);
1307 return NULL;
1308 }
1309 return v;
1310 }
1311
1312 /*[clinic input]
1313 array.array.extend
1314
1315 cls: defining_class
1316 bb: object
1317 /
1318
1319 Append items to the end of the array.
1320 [clinic start generated code]*/
1321
1322 static PyObject *
array_array_extend_impl(arrayobject * self,PyTypeObject * cls,PyObject * bb)1323 array_array_extend_impl(arrayobject *self, PyTypeObject *cls, PyObject *bb)
1324 /*[clinic end generated code: output=e65eb7588f0bc266 input=8eb6817ec4d2cb62]*/
1325 {
1326 array_state *state = get_array_state_by_class(cls);
1327
1328 if (array_do_extend(state, self, bb) == -1)
1329 return NULL;
1330 Py_RETURN_NONE;
1331 }
1332
1333 /*[clinic input]
1334 array.array.insert
1335
1336 i: Py_ssize_t
1337 v: object
1338 /
1339
1340 Insert a new item v into the array before position i.
1341 [clinic start generated code]*/
1342
1343 static PyObject *
array_array_insert_impl(arrayobject * self,Py_ssize_t i,PyObject * v)1344 array_array_insert_impl(arrayobject *self, Py_ssize_t i, PyObject *v)
1345 /*[clinic end generated code: output=5a3648e278348564 input=5577d1b4383e9313]*/
1346 {
1347 return ins(self, i, v);
1348 }
1349
1350 /*[clinic input]
1351 array.array.buffer_info
1352
1353 Return a tuple (address, length) giving the current memory address and the length in items of the buffer used to hold array's contents.
1354
1355 The length should be multiplied by the itemsize attribute to calculate
1356 the buffer length in bytes.
1357 [clinic start generated code]*/
1358
1359 static PyObject *
array_array_buffer_info_impl(arrayobject * self)1360 array_array_buffer_info_impl(arrayobject *self)
1361 /*[clinic end generated code: output=9b2a4ec3ae7e98e7 input=a58bae5c6e1ac6a6]*/
1362 {
1363 PyObject *retval = NULL, *v;
1364
1365 retval = PyTuple_New(2);
1366 if (!retval)
1367 return NULL;
1368
1369 v = PyLong_FromVoidPtr(self->ob_item);
1370 if (v == NULL) {
1371 Py_DECREF(retval);
1372 return NULL;
1373 }
1374 PyTuple_SET_ITEM(retval, 0, v);
1375
1376 v = PyLong_FromSsize_t(Py_SIZE(self));
1377 if (v == NULL) {
1378 Py_DECREF(retval);
1379 return NULL;
1380 }
1381 PyTuple_SET_ITEM(retval, 1, v);
1382
1383 return retval;
1384 }
1385
1386 /*[clinic input]
1387 array.array.append
1388
1389 v: object
1390 /
1391
1392 Append new value v to the end of the array.
1393 [clinic start generated code]*/
1394
1395 static PyObject *
array_array_append(arrayobject * self,PyObject * v)1396 array_array_append(arrayobject *self, PyObject *v)
1397 /*[clinic end generated code: output=745a0669bf8db0e2 input=0b98d9d78e78f0fa]*/
1398 {
1399 return ins(self, Py_SIZE(self), v);
1400 }
1401
1402 /*[clinic input]
1403 array.array.byteswap
1404
1405 Byteswap all items of the array.
1406
1407 If the items in the array are not 1, 2, 4, or 8 bytes in size, RuntimeError is
1408 raised.
1409 [clinic start generated code]*/
1410
1411 static PyObject *
array_array_byteswap_impl(arrayobject * self)1412 array_array_byteswap_impl(arrayobject *self)
1413 /*[clinic end generated code: output=5f8236cbdf0d90b5 input=6a85591b950a0186]*/
1414 {
1415 char *p;
1416 Py_ssize_t i;
1417
1418 switch (self->ob_descr->itemsize) {
1419 case 1:
1420 break;
1421 case 2:
1422 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1423 char p0 = p[0];
1424 p[0] = p[1];
1425 p[1] = p0;
1426 }
1427 break;
1428 case 4:
1429 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1430 char p0 = p[0];
1431 char p1 = p[1];
1432 p[0] = p[3];
1433 p[1] = p[2];
1434 p[2] = p1;
1435 p[3] = p0;
1436 }
1437 break;
1438 case 8:
1439 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1440 char p0 = p[0];
1441 char p1 = p[1];
1442 char p2 = p[2];
1443 char p3 = p[3];
1444 p[0] = p[7];
1445 p[1] = p[6];
1446 p[2] = p[5];
1447 p[3] = p[4];
1448 p[4] = p3;
1449 p[5] = p2;
1450 p[6] = p1;
1451 p[7] = p0;
1452 }
1453 break;
1454 default:
1455 PyErr_SetString(PyExc_RuntimeError,
1456 "don't know how to byteswap this array type");
1457 return NULL;
1458 }
1459 Py_RETURN_NONE;
1460 }
1461
1462 /*[clinic input]
1463 array.array.reverse
1464
1465 Reverse the order of the items in the array.
1466 [clinic start generated code]*/
1467
1468 static PyObject *
array_array_reverse_impl(arrayobject * self)1469 array_array_reverse_impl(arrayobject *self)
1470 /*[clinic end generated code: output=c04868b36f6f4089 input=cd904f01b27d966a]*/
1471 {
1472 Py_ssize_t itemsize = self->ob_descr->itemsize;
1473 char *p, *q;
1474 /* little buffer to hold items while swapping */
1475 char tmp[256]; /* 8 is probably enough -- but why skimp */
1476 assert((size_t)itemsize <= sizeof(tmp));
1477
1478 if (Py_SIZE(self) > 1) {
1479 for (p = self->ob_item,
1480 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1481 p < q;
1482 p += itemsize, q -= itemsize) {
1483 /* memory areas guaranteed disjoint, so memcpy
1484 * is safe (& memmove may be slower).
1485 */
1486 memcpy(tmp, p, itemsize);
1487 memcpy(p, q, itemsize);
1488 memcpy(q, tmp, itemsize);
1489 }
1490 }
1491
1492 Py_RETURN_NONE;
1493 }
1494
1495 /*[clinic input]
1496 array.array.fromfile
1497
1498 cls: defining_class
1499 f: object
1500 n: Py_ssize_t
1501 /
1502
1503 Read n objects from the file object f and append them to the end of the array.
1504 [clinic start generated code]*/
1505
1506 static PyObject *
array_array_fromfile_impl(arrayobject * self,PyTypeObject * cls,PyObject * f,Py_ssize_t n)1507 array_array_fromfile_impl(arrayobject *self, PyTypeObject *cls, PyObject *f,
1508 Py_ssize_t n)
1509 /*[clinic end generated code: output=83a667080b345ebc input=3822e907c1c11f1a]*/
1510 {
1511 PyObject *b, *res;
1512 Py_ssize_t itemsize = self->ob_descr->itemsize;
1513 Py_ssize_t nbytes;
1514 int not_enough_bytes;
1515
1516 if (n < 0) {
1517 PyErr_SetString(PyExc_ValueError, "negative count");
1518 return NULL;
1519 }
1520 if (n > PY_SSIZE_T_MAX / itemsize) {
1521 PyErr_NoMemory();
1522 return NULL;
1523 }
1524
1525
1526 array_state *state = get_array_state_by_class(cls);
1527 assert(state != NULL);
1528
1529 nbytes = n * itemsize;
1530
1531 b = _PyObject_CallMethod(f, state->str_read, "n", nbytes);
1532 if (b == NULL)
1533 return NULL;
1534
1535 if (!PyBytes_Check(b)) {
1536 PyErr_SetString(PyExc_TypeError,
1537 "read() didn't return bytes");
1538 Py_DECREF(b);
1539 return NULL;
1540 }
1541
1542 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
1543
1544 res = array_array_frombytes(self, b);
1545 Py_DECREF(b);
1546 if (res == NULL)
1547 return NULL;
1548
1549 if (not_enough_bytes) {
1550 PyErr_SetString(PyExc_EOFError,
1551 "read() didn't return enough bytes");
1552 Py_DECREF(res);
1553 return NULL;
1554 }
1555
1556 return res;
1557 }
1558
1559 /*[clinic input]
1560 array.array.tofile
1561
1562 cls: defining_class
1563 f: object
1564 /
1565
1566 Write all items (as machine values) to the file object f.
1567 [clinic start generated code]*/
1568
1569 static PyObject *
array_array_tofile_impl(arrayobject * self,PyTypeObject * cls,PyObject * f)1570 array_array_tofile_impl(arrayobject *self, PyTypeObject *cls, PyObject *f)
1571 /*[clinic end generated code: output=4560c628d9c18bc2 input=5a24da7a7b407b52]*/
1572 {
1573 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1574 /* Write 64K blocks at a time */
1575 /* XXX Make the block size settable */
1576 int BLOCKSIZE = 64*1024;
1577 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1578 Py_ssize_t i;
1579
1580 if (Py_SIZE(self) == 0)
1581 goto done;
1582
1583
1584 array_state *state = get_array_state_by_class(cls);
1585 assert(state != NULL);
1586
1587 for (i = 0; i < nblocks; i++) {
1588 char* ptr = self->ob_item + i*BLOCKSIZE;
1589 Py_ssize_t size = BLOCKSIZE;
1590 PyObject *bytes, *res;
1591
1592 if (i*BLOCKSIZE + size > nbytes)
1593 size = nbytes - i*BLOCKSIZE;
1594 bytes = PyBytes_FromStringAndSize(ptr, size);
1595 if (bytes == NULL)
1596 return NULL;
1597 res = PyObject_CallMethodOneArg(f, state->str_write, bytes);
1598 Py_DECREF(bytes);
1599 if (res == NULL)
1600 return NULL;
1601 Py_DECREF(res); /* drop write result */
1602 }
1603
1604 done:
1605 Py_RETURN_NONE;
1606 }
1607
1608 /*[clinic input]
1609 array.array.fromlist
1610
1611 list: object
1612 /
1613
1614 Append items to array from list.
1615 [clinic start generated code]*/
1616
1617 static PyObject *
array_array_fromlist(arrayobject * self,PyObject * list)1618 array_array_fromlist(arrayobject *self, PyObject *list)
1619 /*[clinic end generated code: output=26411c2d228a3e3f input=be2605a96c49680f]*/
1620 {
1621 Py_ssize_t n;
1622
1623 if (!PyList_Check(list)) {
1624 PyErr_SetString(PyExc_TypeError, "arg must be list");
1625 return NULL;
1626 }
1627 n = PyList_Size(list);
1628 if (n > 0) {
1629 Py_ssize_t i, old_size;
1630 old_size = Py_SIZE(self);
1631 if (array_resize(self, old_size + n) == -1)
1632 return NULL;
1633 for (i = 0; i < n; i++) {
1634 PyObject *v = PyList_GET_ITEM(list, i);
1635 if ((*self->ob_descr->setitem)(self,
1636 Py_SIZE(self) - n + i, v) != 0) {
1637 array_resize(self, old_size);
1638 return NULL;
1639 }
1640 if (n != PyList_GET_SIZE(list)) {
1641 PyErr_SetString(PyExc_RuntimeError,
1642 "list changed size during iteration");
1643 array_resize(self, old_size);
1644 return NULL;
1645 }
1646 }
1647 }
1648 Py_RETURN_NONE;
1649 }
1650
1651 /*[clinic input]
1652 array.array.tolist
1653
1654 Convert array to an ordinary list with the same items.
1655 [clinic start generated code]*/
1656
1657 static PyObject *
array_array_tolist_impl(arrayobject * self)1658 array_array_tolist_impl(arrayobject *self)
1659 /*[clinic end generated code: output=00b60cc9eab8ef89 input=a8d7784a94f86b53]*/
1660 {
1661 PyObject *list = PyList_New(Py_SIZE(self));
1662 Py_ssize_t i;
1663
1664 if (list == NULL)
1665 return NULL;
1666 for (i = 0; i < Py_SIZE(self); i++) {
1667 PyObject *v = getarrayitem((PyObject *)self, i);
1668 if (v == NULL)
1669 goto error;
1670 PyList_SET_ITEM(list, i, v);
1671 }
1672 return list;
1673
1674 error:
1675 Py_DECREF(list);
1676 return NULL;
1677 }
1678
1679 static PyObject *
frombytes(arrayobject * self,Py_buffer * buffer)1680 frombytes(arrayobject *self, Py_buffer *buffer)
1681 {
1682 int itemsize = self->ob_descr->itemsize;
1683 Py_ssize_t n;
1684 if (buffer->itemsize != 1) {
1685 PyBuffer_Release(buffer);
1686 PyErr_SetString(PyExc_TypeError, "a bytes-like object is required");
1687 return NULL;
1688 }
1689 n = buffer->len;
1690 if (n % itemsize != 0) {
1691 PyBuffer_Release(buffer);
1692 PyErr_SetString(PyExc_ValueError,
1693 "bytes length not a multiple of item size");
1694 return NULL;
1695 }
1696 n = n / itemsize;
1697 if (n > 0) {
1698 Py_ssize_t old_size = Py_SIZE(self);
1699 if ((n > PY_SSIZE_T_MAX - old_size) ||
1700 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
1701 PyBuffer_Release(buffer);
1702 return PyErr_NoMemory();
1703 }
1704 if (array_resize(self, old_size + n) == -1) {
1705 PyBuffer_Release(buffer);
1706 return NULL;
1707 }
1708 memcpy(self->ob_item + old_size * itemsize,
1709 buffer->buf, n * itemsize);
1710 }
1711 PyBuffer_Release(buffer);
1712 Py_RETURN_NONE;
1713 }
1714
1715 /*[clinic input]
1716 array.array.frombytes
1717
1718 buffer: Py_buffer
1719 /
1720
1721 Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method.
1722 [clinic start generated code]*/
1723
1724 static PyObject *
array_array_frombytes_impl(arrayobject * self,Py_buffer * buffer)1725 array_array_frombytes_impl(arrayobject *self, Py_buffer *buffer)
1726 /*[clinic end generated code: output=d9842c8f7510a516 input=378db226dfac949e]*/
1727 {
1728 return frombytes(self, buffer);
1729 }
1730
1731 /*[clinic input]
1732 array.array.tobytes
1733
1734 Convert the array to an array of machine values and return the bytes representation.
1735 [clinic start generated code]*/
1736
1737 static PyObject *
array_array_tobytes_impl(arrayobject * self)1738 array_array_tobytes_impl(arrayobject *self)
1739 /*[clinic end generated code: output=87318e4edcdc2bb6 input=90ee495f96de34f5]*/
1740 {
1741 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1742 return PyBytes_FromStringAndSize(self->ob_item,
1743 Py_SIZE(self) * self->ob_descr->itemsize);
1744 } else {
1745 return PyErr_NoMemory();
1746 }
1747 }
1748
1749 /*[clinic input]
1750 array.array.fromunicode
1751
1752 ustr: unicode
1753 /
1754
1755 Extends this array with data from the unicode string ustr.
1756
1757 The array must be a unicode type array; otherwise a ValueError is raised.
1758 Use array.frombytes(ustr.encode(...)) to append Unicode data to an array of
1759 some other type.
1760 [clinic start generated code]*/
1761
1762 static PyObject *
array_array_fromunicode_impl(arrayobject * self,PyObject * ustr)1763 array_array_fromunicode_impl(arrayobject *self, PyObject *ustr)
1764 /*[clinic end generated code: output=24359f5e001a7f2b input=025db1fdade7a4ce]*/
1765 {
1766 int typecode = self->ob_descr->typecode;
1767 if (typecode != 'u' && typecode != 'w') {
1768 PyErr_SetString(PyExc_ValueError,
1769 "fromunicode() may only be called on "
1770 "unicode type arrays ('u' or 'w')");
1771 return NULL;
1772 }
1773
1774 if (typecode == 'u') {
1775 Py_ssize_t ustr_length = PyUnicode_AsWideChar(ustr, NULL, 0);
1776 assert(ustr_length > 0);
1777 if (ustr_length > 1) {
1778 ustr_length--; /* trim trailing NUL character */
1779 Py_ssize_t old_size = Py_SIZE(self);
1780 if (array_resize(self, old_size + ustr_length) == -1) {
1781 return NULL;
1782 }
1783
1784 // must not fail
1785 PyUnicode_AsWideChar(
1786 ustr, ((wchar_t *)self->ob_item) + old_size, ustr_length);
1787 }
1788 }
1789 else { // typecode == 'w'
1790 Py_ssize_t ustr_length = PyUnicode_GetLength(ustr);
1791 Py_ssize_t old_size = Py_SIZE(self);
1792 Py_ssize_t new_size = old_size + ustr_length;
1793
1794 if (new_size < 0 || (size_t)new_size > PY_SSIZE_T_MAX / sizeof(Py_UCS4)) {
1795 return PyErr_NoMemory();
1796 }
1797 if (array_resize(self, new_size) == -1) {
1798 return NULL;
1799 }
1800
1801 // must not fail
1802 Py_UCS4 *u = PyUnicode_AsUCS4(ustr, ((Py_UCS4*)self->ob_item) + old_size,
1803 ustr_length, 0);
1804 assert(u != NULL);
1805 (void)u; // Suppress unused_variable warning.
1806 }
1807
1808 Py_RETURN_NONE;
1809 }
1810
1811 /*[clinic input]
1812 array.array.tounicode
1813
1814 Extends this array with data from the unicode string ustr.
1815
1816 Convert the array to a unicode string. The array must be a unicode type array;
1817 otherwise a ValueError is raised. Use array.tobytes().decode() to obtain a
1818 unicode string from an array of some other type.
1819 [clinic start generated code]*/
1820
1821 static PyObject *
array_array_tounicode_impl(arrayobject * self)1822 array_array_tounicode_impl(arrayobject *self)
1823 /*[clinic end generated code: output=08e442378336e1ef input=127242eebe70b66d]*/
1824 {
1825 int typecode = self->ob_descr->typecode;
1826 if (typecode != 'u' && typecode != 'w') {
1827 PyErr_SetString(PyExc_ValueError,
1828 "tounicode() may only be called on unicode type arrays ('u' or 'w')");
1829 return NULL;
1830 }
1831 if (typecode == 'u') {
1832 return PyUnicode_FromWideChar((wchar_t *) self->ob_item, Py_SIZE(self));
1833 }
1834 else { // typecode == 'w'
1835 int byteorder = 0; // native byteorder
1836 return PyUnicode_DecodeUTF32((const char *) self->ob_item, Py_SIZE(self) * 4,
1837 NULL, &byteorder);
1838 }
1839 }
1840
1841 /*[clinic input]
1842 array.array.__sizeof__
1843
1844 Size of the array in memory, in bytes.
1845 [clinic start generated code]*/
1846
1847 static PyObject *
array_array___sizeof___impl(arrayobject * self)1848 array_array___sizeof___impl(arrayobject *self)
1849 /*[clinic end generated code: output=d8e1c61ebbe3eaed input=805586565bf2b3c6]*/
1850 {
1851 size_t res = _PyObject_SIZE(Py_TYPE(self));
1852 res += (size_t)self->allocated * (size_t)self->ob_descr->itemsize;
1853 return PyLong_FromSize_t(res);
1854 }
1855
1856
1857 /*********************** Pickling support ************************/
1858
1859 static const struct mformatdescr {
1860 size_t size;
1861 int is_signed;
1862 int is_big_endian;
1863 } mformat_descriptors[] = {
1864 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1865 {1, 1, 0}, /* 1: SIGNED_INT8 */
1866 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1867 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1868 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1869 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1870 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1871 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1872 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1873 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1874 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1875 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1876 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1877 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1878 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1879 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1880 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1881 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1882 {4, 0, 0}, /* 18: UTF16_LE */
1883 {4, 0, 1}, /* 19: UTF16_BE */
1884 {8, 0, 0}, /* 20: UTF32_LE */
1885 {8, 0, 1} /* 21: UTF32_BE */
1886 };
1887
1888
1889 /*
1890 * Internal: This function is used to find the machine format of a given
1891 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1892 * be found.
1893 */
1894 static enum machine_format_code
typecode_to_mformat_code(char typecode)1895 typecode_to_mformat_code(char typecode)
1896 {
1897 const int is_big_endian = PY_BIG_ENDIAN;
1898
1899 size_t intsize;
1900 int is_signed;
1901
1902 switch (typecode) {
1903 case 'b':
1904 return SIGNED_INT8;
1905 case 'B':
1906 return UNSIGNED_INT8;
1907
1908 case 'u':
1909 if (sizeof(wchar_t) == 2) {
1910 return UTF16_LE + is_big_endian;
1911 }
1912 if (sizeof(wchar_t) == 4) {
1913 return UTF32_LE + is_big_endian;
1914 }
1915 return UNKNOWN_FORMAT;
1916
1917 case 'w':
1918 return UTF32_LE + is_big_endian;
1919
1920 case 'f':
1921 if (sizeof(float) == 4) {
1922 const float y = 16711938.0;
1923 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1924 return IEEE_754_FLOAT_BE;
1925 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1926 return IEEE_754_FLOAT_LE;
1927 }
1928 return UNKNOWN_FORMAT;
1929
1930 case 'd':
1931 if (sizeof(double) == 8) {
1932 const double x = 9006104071832581.0;
1933 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1934 return IEEE_754_DOUBLE_BE;
1935 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1936 return IEEE_754_DOUBLE_LE;
1937 }
1938 return UNKNOWN_FORMAT;
1939
1940 /* Integers */
1941 case 'h':
1942 intsize = sizeof(short);
1943 is_signed = 1;
1944 break;
1945 case 'H':
1946 intsize = sizeof(short);
1947 is_signed = 0;
1948 break;
1949 case 'i':
1950 intsize = sizeof(int);
1951 is_signed = 1;
1952 break;
1953 case 'I':
1954 intsize = sizeof(int);
1955 is_signed = 0;
1956 break;
1957 case 'l':
1958 intsize = sizeof(long);
1959 is_signed = 1;
1960 break;
1961 case 'L':
1962 intsize = sizeof(long);
1963 is_signed = 0;
1964 break;
1965 case 'q':
1966 intsize = sizeof(long long);
1967 is_signed = 1;
1968 break;
1969 case 'Q':
1970 intsize = sizeof(long long);
1971 is_signed = 0;
1972 break;
1973 default:
1974 return UNKNOWN_FORMAT;
1975 }
1976 switch (intsize) {
1977 case 2:
1978 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1979 case 4:
1980 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1981 case 8:
1982 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1983 default:
1984 return UNKNOWN_FORMAT;
1985 }
1986 }
1987
1988 /* Forward declaration. */
1989 static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1990
1991 /*
1992 * Internal: This function wraps the array constructor--i.e., array_new()--to
1993 * allow the creation of array objects from C code without having to deal
1994 * directly the tuple argument of array_new(). The typecode argument is a
1995 * Unicode character value, like 'i' or 'f' for example, representing an array
1996 * type code. The items argument is a bytes or a list object from which
1997 * contains the initial value of the array.
1998 *
1999 * On success, this functions returns the array object created. Otherwise,
2000 * NULL is returned to indicate a failure.
2001 */
2002 static PyObject *
make_array(PyTypeObject * arraytype,char typecode,PyObject * items)2003 make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
2004 {
2005 PyObject *new_args;
2006 PyObject *array_obj;
2007 PyObject *typecode_obj;
2008
2009 assert(arraytype != NULL);
2010 assert(items != NULL);
2011
2012 typecode_obj = PyUnicode_FromOrdinal(typecode);
2013 if (typecode_obj == NULL)
2014 return NULL;
2015
2016 new_args = PyTuple_New(2);
2017 if (new_args == NULL) {
2018 Py_DECREF(typecode_obj);
2019 return NULL;
2020 }
2021 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
2022 PyTuple_SET_ITEM(new_args, 1, Py_NewRef(items));
2023
2024 array_obj = array_new(arraytype, new_args, NULL);
2025 Py_DECREF(new_args);
2026 if (array_obj == NULL)
2027 return NULL;
2028
2029 return array_obj;
2030 }
2031
2032 /*
2033 * This functions is a special constructor used when unpickling an array. It
2034 * provides a portable way to rebuild an array from its memory representation.
2035 */
2036 /*[clinic input]
2037 array._array_reconstructor
2038
2039 arraytype: object(type="PyTypeObject *")
2040 typecode: int(accept={str})
2041 mformat_code: int(type="enum machine_format_code")
2042 items: object
2043 /
2044
2045 Internal. Used for pickling support.
2046 [clinic start generated code]*/
2047
2048 static PyObject *
array__array_reconstructor_impl(PyObject * module,PyTypeObject * arraytype,int typecode,enum machine_format_code mformat_code,PyObject * items)2049 array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype,
2050 int typecode,
2051 enum machine_format_code mformat_code,
2052 PyObject *items)
2053 /*[clinic end generated code: output=e05263141ba28365 input=2464dc8f4c7736b5]*/
2054 {
2055 array_state *state = get_array_state(module);
2056 PyObject *converted_items;
2057 PyObject *result;
2058 const struct arraydescr *descr;
2059
2060 if (!PyType_Check(arraytype)) {
2061 PyErr_Format(PyExc_TypeError,
2062 "first argument must be a type object, not %.200s",
2063 Py_TYPE(arraytype)->tp_name);
2064 return NULL;
2065 }
2066 if (!PyType_IsSubtype(arraytype, state->ArrayType)) {
2067 PyErr_Format(PyExc_TypeError,
2068 "%.200s is not a subtype of %.200s",
2069 arraytype->tp_name, state->ArrayType->tp_name);
2070 return NULL;
2071 }
2072 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2073 if ((int)descr->typecode == typecode)
2074 break;
2075 }
2076 if (descr->typecode == '\0') {
2077 PyErr_SetString(PyExc_ValueError,
2078 "second argument must be a valid type code");
2079 return NULL;
2080 }
2081 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
2082 mformat_code > MACHINE_FORMAT_CODE_MAX) {
2083 PyErr_SetString(PyExc_ValueError,
2084 "third argument must be a valid machine format code.");
2085 return NULL;
2086 }
2087 if (!PyBytes_Check(items)) {
2088 PyErr_Format(PyExc_TypeError,
2089 "fourth argument should be bytes, not %.200s",
2090 Py_TYPE(items)->tp_name);
2091 return NULL;
2092 }
2093
2094 /* Fast path: No decoding has to be done. */
2095 if (mformat_code == typecode_to_mformat_code((char)typecode) ||
2096 mformat_code == UNKNOWN_FORMAT) {
2097 return make_array(arraytype, (char)typecode, items);
2098 }
2099
2100 /* Slow path: Decode the byte string according to the given machine
2101 * format code. This occurs when the computer unpickling the array
2102 * object is architecturally different from the one that pickled the
2103 * array.
2104 */
2105 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
2106 PyErr_SetString(PyExc_ValueError,
2107 "string length not a multiple of item size");
2108 return NULL;
2109 }
2110 switch (mformat_code) {
2111 case IEEE_754_FLOAT_LE:
2112 case IEEE_754_FLOAT_BE: {
2113 Py_ssize_t i;
2114 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
2115 Py_ssize_t itemcount = Py_SIZE(items) / 4;
2116 const char *memstr = PyBytes_AS_STRING(items);
2117
2118 converted_items = PyList_New(itemcount);
2119 if (converted_items == NULL)
2120 return NULL;
2121 for (i = 0; i < itemcount; i++) {
2122 PyObject *pyfloat = PyFloat_FromDouble(
2123 PyFloat_Unpack4(&memstr[i * 4], le));
2124 if (pyfloat == NULL) {
2125 Py_DECREF(converted_items);
2126 return NULL;
2127 }
2128 PyList_SET_ITEM(converted_items, i, pyfloat);
2129 }
2130 break;
2131 }
2132 case IEEE_754_DOUBLE_LE:
2133 case IEEE_754_DOUBLE_BE: {
2134 Py_ssize_t i;
2135 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
2136 Py_ssize_t itemcount = Py_SIZE(items) / 8;
2137 const char *memstr = PyBytes_AS_STRING(items);
2138
2139 converted_items = PyList_New(itemcount);
2140 if (converted_items == NULL)
2141 return NULL;
2142 for (i = 0; i < itemcount; i++) {
2143 PyObject *pyfloat = PyFloat_FromDouble(
2144 PyFloat_Unpack8(&memstr[i * 8], le));
2145 if (pyfloat == NULL) {
2146 Py_DECREF(converted_items);
2147 return NULL;
2148 }
2149 PyList_SET_ITEM(converted_items, i, pyfloat);
2150 }
2151 break;
2152 }
2153 case UTF16_LE:
2154 case UTF16_BE: {
2155 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
2156 converted_items = PyUnicode_DecodeUTF16(
2157 PyBytes_AS_STRING(items), Py_SIZE(items),
2158 "strict", &byteorder);
2159 if (converted_items == NULL)
2160 return NULL;
2161 break;
2162 }
2163 case UTF32_LE:
2164 case UTF32_BE: {
2165 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
2166 converted_items = PyUnicode_DecodeUTF32(
2167 PyBytes_AS_STRING(items), Py_SIZE(items),
2168 "strict", &byteorder);
2169 if (converted_items == NULL)
2170 return NULL;
2171 break;
2172 }
2173
2174 case UNSIGNED_INT8:
2175 case SIGNED_INT8:
2176 case UNSIGNED_INT16_LE:
2177 case UNSIGNED_INT16_BE:
2178 case SIGNED_INT16_LE:
2179 case SIGNED_INT16_BE:
2180 case UNSIGNED_INT32_LE:
2181 case UNSIGNED_INT32_BE:
2182 case SIGNED_INT32_LE:
2183 case SIGNED_INT32_BE:
2184 case UNSIGNED_INT64_LE:
2185 case UNSIGNED_INT64_BE:
2186 case SIGNED_INT64_LE:
2187 case SIGNED_INT64_BE: {
2188 Py_ssize_t i;
2189 const struct mformatdescr mf_descr =
2190 mformat_descriptors[mformat_code];
2191 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
2192 const unsigned char *memstr =
2193 (unsigned char *)PyBytes_AS_STRING(items);
2194 const struct arraydescr *descr;
2195
2196 /* If possible, try to pack array's items using a data type
2197 * that fits better. This may result in an array with narrower
2198 * or wider elements.
2199 *
2200 * For example, if a 32-bit machine pickles an L-code array of
2201 * unsigned longs, then the array will be unpickled by 64-bit
2202 * machine as an I-code array of unsigned ints.
2203 *
2204 * XXX: Is it possible to write a unit test for this?
2205 */
2206 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2207 if (descr->is_integer_type &&
2208 (size_t)descr->itemsize == mf_descr.size &&
2209 descr->is_signed == mf_descr.is_signed)
2210 typecode = descr->typecode;
2211 }
2212
2213 converted_items = PyList_New(itemcount);
2214 if (converted_items == NULL)
2215 return NULL;
2216 for (i = 0; i < itemcount; i++) {
2217 PyObject *pylong;
2218
2219 pylong = _PyLong_FromByteArray(
2220 &memstr[i * mf_descr.size],
2221 mf_descr.size,
2222 !mf_descr.is_big_endian,
2223 mf_descr.is_signed);
2224 if (pylong == NULL) {
2225 Py_DECREF(converted_items);
2226 return NULL;
2227 }
2228 PyList_SET_ITEM(converted_items, i, pylong);
2229 }
2230 break;
2231 }
2232 case UNKNOWN_FORMAT:
2233 /* Impossible, but needed to shut up GCC about the unhandled
2234 * enumeration value.
2235 */
2236 default:
2237 PyErr_BadArgument();
2238 return NULL;
2239 }
2240
2241 result = make_array(arraytype, (char)typecode, converted_items);
2242 Py_DECREF(converted_items);
2243 return result;
2244 }
2245
2246 /*[clinic input]
2247 array.array.__reduce_ex__
2248
2249 cls: defining_class
2250 value: object
2251 /
2252
2253 Return state information for pickling.
2254 [clinic start generated code]*/
2255
2256 static PyObject *
array_array___reduce_ex___impl(arrayobject * self,PyTypeObject * cls,PyObject * value)2257 array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls,
2258 PyObject *value)
2259 /*[clinic end generated code: output=4958ee5d79452ad5 input=19968cf0f91d3eea]*/
2260 {
2261 PyObject *dict;
2262 PyObject *result;
2263 PyObject *array_str;
2264 int typecode = self->ob_descr->typecode;
2265 int mformat_code;
2266 long protocol;
2267
2268 array_state *state = get_array_state_by_class(cls);
2269 assert(state != NULL);
2270
2271 if (state->array_reconstructor == NULL) {
2272 state->array_reconstructor = _PyImport_GetModuleAttrString(
2273 "array", "_array_reconstructor");
2274 if (state->array_reconstructor == NULL) {
2275 return NULL;
2276 }
2277 }
2278
2279 if (!PyLong_Check(value)) {
2280 PyErr_SetString(PyExc_TypeError,
2281 "__reduce_ex__ argument should be an integer");
2282 return NULL;
2283 }
2284 protocol = PyLong_AsLong(value);
2285 if (protocol == -1 && PyErr_Occurred())
2286 return NULL;
2287
2288 if (PyObject_GetOptionalAttr((PyObject *)self, state->str___dict__, &dict) < 0) {
2289 return NULL;
2290 }
2291 if (dict == NULL) {
2292 dict = Py_NewRef(Py_None);
2293 }
2294
2295 mformat_code = typecode_to_mformat_code(typecode);
2296 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
2297 /* Convert the array to a list if we got something weird
2298 * (e.g., non-IEEE floats), or we are pickling the array using
2299 * a Python 2.x compatible protocol.
2300 *
2301 * It is necessary to use a list representation for Python 2.x
2302 * compatible pickle protocol, since Python 2's str objects
2303 * are unpickled as unicode by Python 3. Thus it is impossible
2304 * to make arrays unpicklable by Python 3 by using their memory
2305 * representation, unless we resort to ugly hacks such as
2306 * coercing unicode objects to bytes in array_reconstructor.
2307 */
2308 PyObject *list;
2309 list = array_array_tolist_impl(self);
2310 if (list == NULL) {
2311 Py_DECREF(dict);
2312 return NULL;
2313 }
2314 result = Py_BuildValue(
2315 "O(CO)O", Py_TYPE(self), typecode, list, dict);
2316 Py_DECREF(list);
2317 Py_DECREF(dict);
2318 return result;
2319 }
2320
2321 array_str = array_array_tobytes_impl(self);
2322 if (array_str == NULL) {
2323 Py_DECREF(dict);
2324 return NULL;
2325 }
2326
2327 assert(state->array_reconstructor != NULL);
2328 result = Py_BuildValue(
2329 "O(OCiN)O", state->array_reconstructor, Py_TYPE(self), typecode,
2330 mformat_code, array_str, dict);
2331 Py_DECREF(dict);
2332 return result;
2333 }
2334
2335 static PyObject *
array_get_typecode(arrayobject * a,void * closure)2336 array_get_typecode(arrayobject *a, void *closure)
2337 {
2338 char typecode = a->ob_descr->typecode;
2339 return PyUnicode_FromOrdinal(typecode);
2340 }
2341
2342 static PyObject *
array_get_itemsize(arrayobject * a,void * closure)2343 array_get_itemsize(arrayobject *a, void *closure)
2344 {
2345 return PyLong_FromLong((long)a->ob_descr->itemsize);
2346 }
2347
2348 static PyGetSetDef array_getsets [] = {
2349 {"typecode", (getter) array_get_typecode, NULL,
2350 "the typecode character used to create the array"},
2351 {"itemsize", (getter) array_get_itemsize, NULL,
2352 "the size, in bytes, of one array item"},
2353 {NULL}
2354 };
2355
2356 static PyMethodDef array_methods[] = {
2357 ARRAY_ARRAY_APPEND_METHODDEF
2358 ARRAY_ARRAY_BUFFER_INFO_METHODDEF
2359 ARRAY_ARRAY_BYTESWAP_METHODDEF
2360 ARRAY_ARRAY_CLEAR_METHODDEF
2361 ARRAY_ARRAY___COPY___METHODDEF
2362 ARRAY_ARRAY_COUNT_METHODDEF
2363 ARRAY_ARRAY___DEEPCOPY___METHODDEF
2364 ARRAY_ARRAY_EXTEND_METHODDEF
2365 ARRAY_ARRAY_FROMFILE_METHODDEF
2366 ARRAY_ARRAY_FROMLIST_METHODDEF
2367 ARRAY_ARRAY_FROMBYTES_METHODDEF
2368 ARRAY_ARRAY_FROMUNICODE_METHODDEF
2369 ARRAY_ARRAY_INDEX_METHODDEF
2370 ARRAY_ARRAY_INSERT_METHODDEF
2371 ARRAY_ARRAY_POP_METHODDEF
2372 ARRAY_ARRAY___REDUCE_EX___METHODDEF
2373 ARRAY_ARRAY_REMOVE_METHODDEF
2374 ARRAY_ARRAY_REVERSE_METHODDEF
2375 ARRAY_ARRAY_TOFILE_METHODDEF
2376 ARRAY_ARRAY_TOLIST_METHODDEF
2377 ARRAY_ARRAY_TOBYTES_METHODDEF
2378 ARRAY_ARRAY_TOUNICODE_METHODDEF
2379 ARRAY_ARRAY___SIZEOF___METHODDEF
2380 {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
2381 {NULL, NULL} /* sentinel */
2382 };
2383
2384 static PyObject *
array_repr(arrayobject * a)2385 array_repr(arrayobject *a)
2386 {
2387 char typecode;
2388 PyObject *s, *v = NULL;
2389 Py_ssize_t len;
2390
2391 len = Py_SIZE(a);
2392 typecode = a->ob_descr->typecode;
2393 if (len == 0) {
2394 return PyUnicode_FromFormat("%s('%c')",
2395 _PyType_Name(Py_TYPE(a)), (int)typecode);
2396 }
2397 if (typecode == 'u' || typecode == 'w') {
2398 v = array_array_tounicode_impl(a);
2399 } else {
2400 v = array_array_tolist_impl(a);
2401 }
2402 if (v == NULL)
2403 return NULL;
2404
2405 s = PyUnicode_FromFormat("%s('%c', %R)",
2406 _PyType_Name(Py_TYPE(a)), (int)typecode, v);
2407 Py_DECREF(v);
2408 return s;
2409 }
2410
2411 static PyObject*
array_subscr(arrayobject * self,PyObject * item)2412 array_subscr(arrayobject* self, PyObject* item)
2413 {
2414 array_state *state = find_array_state_by_type(Py_TYPE(self));
2415
2416 if (PyIndex_Check(item)) {
2417 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2418 if (i==-1 && PyErr_Occurred()) {
2419 return NULL;
2420 }
2421 if (i < 0)
2422 i += Py_SIZE(self);
2423 return array_item(self, i);
2424 }
2425 else if (PySlice_Check(item)) {
2426 Py_ssize_t start, stop, step, slicelength, i;
2427 size_t cur;
2428 PyObject* result;
2429 arrayobject* ar;
2430 int itemsize = self->ob_descr->itemsize;
2431
2432 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2433 return NULL;
2434 }
2435 slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2436 step);
2437
2438 if (slicelength <= 0) {
2439 return newarrayobject(state->ArrayType, 0, self->ob_descr);
2440 }
2441 else if (step == 1) {
2442 PyObject *result = newarrayobject(state->ArrayType,
2443 slicelength, self->ob_descr);
2444 if (result == NULL)
2445 return NULL;
2446 memcpy(((arrayobject *)result)->ob_item,
2447 self->ob_item + start * itemsize,
2448 slicelength * itemsize);
2449 return result;
2450 }
2451 else {
2452 result = newarrayobject(state->ArrayType, slicelength, self->ob_descr);
2453 if (!result) return NULL;
2454
2455 ar = (arrayobject*)result;
2456
2457 for (cur = start, i = 0; i < slicelength;
2458 cur += step, i++) {
2459 memcpy(ar->ob_item + i*itemsize,
2460 self->ob_item + cur*itemsize,
2461 itemsize);
2462 }
2463
2464 return result;
2465 }
2466 }
2467 else {
2468 PyErr_SetString(PyExc_TypeError,
2469 "array indices must be integers");
2470 return NULL;
2471 }
2472 }
2473
2474 static int
array_ass_subscr(arrayobject * self,PyObject * item,PyObject * value)2475 array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2476 {
2477 Py_ssize_t start, stop, step, slicelength, needed;
2478 array_state* state = find_array_state_by_type(Py_TYPE(self));
2479 arrayobject* other;
2480 int itemsize;
2481
2482 if (PyIndex_Check(item)) {
2483 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2484
2485 if (i == -1 && PyErr_Occurred())
2486 return -1;
2487 if (i < 0)
2488 i += Py_SIZE(self);
2489 if (i < 0 || i >= Py_SIZE(self)) {
2490 PyErr_SetString(PyExc_IndexError,
2491 "array assignment index out of range");
2492 return -1;
2493 }
2494 if (value == NULL) {
2495 /* Fall through to slice assignment */
2496 start = i;
2497 stop = i + 1;
2498 step = 1;
2499 slicelength = 1;
2500 }
2501 else
2502 return (*self->ob_descr->setitem)(self, i, value);
2503 }
2504 else if (PySlice_Check(item)) {
2505 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2506 return -1;
2507 }
2508 slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2509 step);
2510 }
2511 else {
2512 PyErr_SetString(PyExc_TypeError,
2513 "array indices must be integers");
2514 return -1;
2515 }
2516 if (value == NULL) {
2517 other = NULL;
2518 needed = 0;
2519 }
2520 else if (array_Check(value, state)) {
2521 other = (arrayobject *)value;
2522 needed = Py_SIZE(other);
2523 if (self == other) {
2524 /* Special case "self[i:j] = self" -- copy self first */
2525 int ret;
2526 value = array_slice(other, 0, needed);
2527 if (value == NULL)
2528 return -1;
2529 ret = array_ass_subscr(self, item, value);
2530 Py_DECREF(value);
2531 return ret;
2532 }
2533 if (other->ob_descr != self->ob_descr) {
2534 PyErr_BadArgument();
2535 return -1;
2536 }
2537 }
2538 else {
2539 PyErr_Format(PyExc_TypeError,
2540 "can only assign array (not \"%.200s\") to array slice",
2541 Py_TYPE(value)->tp_name);
2542 return -1;
2543 }
2544 itemsize = self->ob_descr->itemsize;
2545 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2546 if ((step > 0 && stop < start) ||
2547 (step < 0 && stop > start))
2548 stop = start;
2549
2550 /* Issue #4509: If the array has exported buffers and the slice
2551 assignment would change the size of the array, fail early to make
2552 sure we don't modify it. */
2553 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2554 PyErr_SetString(PyExc_BufferError,
2555 "cannot resize an array that is exporting buffers");
2556 return -1;
2557 }
2558
2559 if (step == 1) {
2560 if (slicelength > needed) {
2561 memmove(self->ob_item + (start + needed) * itemsize,
2562 self->ob_item + stop * itemsize,
2563 (Py_SIZE(self) - stop) * itemsize);
2564 if (array_resize(self, Py_SIZE(self) +
2565 needed - slicelength) < 0)
2566 return -1;
2567 }
2568 else if (slicelength < needed) {
2569 if (array_resize(self, Py_SIZE(self) +
2570 needed - slicelength) < 0)
2571 return -1;
2572 memmove(self->ob_item + (start + needed) * itemsize,
2573 self->ob_item + stop * itemsize,
2574 (Py_SIZE(self) - start - needed) * itemsize);
2575 }
2576 if (needed > 0)
2577 memcpy(self->ob_item + start * itemsize,
2578 other->ob_item, needed * itemsize);
2579 return 0;
2580 }
2581 else if (needed == 0) {
2582 /* Delete slice */
2583 size_t cur;
2584 Py_ssize_t i;
2585
2586 if (step < 0) {
2587 stop = start + 1;
2588 start = stop + step * (slicelength - 1) - 1;
2589 step = -step;
2590 }
2591 for (cur = start, i = 0; i < slicelength;
2592 cur += step, i++) {
2593 Py_ssize_t lim = step - 1;
2594
2595 if (cur + step >= (size_t)Py_SIZE(self))
2596 lim = Py_SIZE(self) - cur - 1;
2597 memmove(self->ob_item + (cur - i) * itemsize,
2598 self->ob_item + (cur + 1) * itemsize,
2599 lim * itemsize);
2600 }
2601 cur = start + (size_t)slicelength * step;
2602 if (cur < (size_t)Py_SIZE(self)) {
2603 memmove(self->ob_item + (cur-slicelength) * itemsize,
2604 self->ob_item + cur * itemsize,
2605 (Py_SIZE(self) - cur) * itemsize);
2606 }
2607 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2608 return -1;
2609 return 0;
2610 }
2611 else {
2612 size_t cur;
2613 Py_ssize_t i;
2614
2615 if (needed != slicelength) {
2616 PyErr_Format(PyExc_ValueError,
2617 "attempt to assign array of size %zd "
2618 "to extended slice of size %zd",
2619 needed, slicelength);
2620 return -1;
2621 }
2622 for (cur = start, i = 0; i < slicelength;
2623 cur += step, i++) {
2624 memcpy(self->ob_item + cur * itemsize,
2625 other->ob_item + i * itemsize,
2626 itemsize);
2627 }
2628 return 0;
2629 }
2630 }
2631
2632 static const void *emptybuf = "";
2633
2634
2635 static int
array_buffer_getbuf(arrayobject * self,Py_buffer * view,int flags)2636 array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
2637 {
2638 if (view == NULL) {
2639 PyErr_SetString(PyExc_BufferError,
2640 "array_buffer_getbuf: view==NULL argument is obsolete");
2641 return -1;
2642 }
2643
2644 view->buf = (void *)self->ob_item;
2645 view->obj = Py_NewRef(self);
2646 if (view->buf == NULL)
2647 view->buf = (void *)emptybuf;
2648 view->len = Py_SIZE(self) * self->ob_descr->itemsize;
2649 view->readonly = 0;
2650 view->ndim = 1;
2651 view->itemsize = self->ob_descr->itemsize;
2652 view->suboffsets = NULL;
2653 view->shape = NULL;
2654 if ((flags & PyBUF_ND)==PyBUF_ND) {
2655 view->shape = &((PyVarObject*)self)->ob_size;
2656 }
2657 view->strides = NULL;
2658 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2659 view->strides = &(view->itemsize);
2660 view->format = NULL;
2661 view->internal = NULL;
2662 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
2663 view->format = (char *)self->ob_descr->formats;
2664 #ifdef Py_UNICODE_WIDE
2665 if (self->ob_descr->typecode == 'u') {
2666 view->format = "w";
2667 }
2668 #endif
2669 }
2670
2671 self->ob_exports++;
2672 return 0;
2673 }
2674
2675 static void
array_buffer_relbuf(arrayobject * self,Py_buffer * view)2676 array_buffer_relbuf(arrayobject *self, Py_buffer *view)
2677 {
2678 self->ob_exports--;
2679 }
2680
2681 static PyObject *
array_new(PyTypeObject * type,PyObject * args,PyObject * kwds)2682 array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2683 {
2684 array_state *state = find_array_state_by_type(type);
2685 int c;
2686 PyObject *initial = NULL, *it = NULL;
2687 const struct arraydescr *descr;
2688
2689 if ((type == state->ArrayType ||
2690 type->tp_init == state->ArrayType->tp_init) &&
2691 !_PyArg_NoKeywords("array.array", kwds))
2692 return NULL;
2693
2694 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2695 return NULL;
2696
2697 if (PySys_Audit("array.__new__", "CO",
2698 c, initial ? initial : Py_None) < 0) {
2699 return NULL;
2700 }
2701
2702 if (c == 'u') {
2703 if (PyErr_WarnEx(PyExc_DeprecationWarning,
2704 "The 'u' type code is deprecated and "
2705 "will be removed in Python 3.16",
2706 1)) {
2707 return NULL;
2708 }
2709 }
2710
2711 bool is_unicode = c == 'u' || c == 'w';
2712
2713 if (initial && !is_unicode) {
2714 if (PyUnicode_Check(initial)) {
2715 PyErr_Format(PyExc_TypeError, "cannot use a str to initialize "
2716 "an array with typecode '%c'", c);
2717 return NULL;
2718 }
2719 else if (array_Check(initial, state)) {
2720 int ic = ((arrayobject*)initial)->ob_descr->typecode;
2721 if (ic == 'u' || ic == 'w') {
2722 PyErr_Format(PyExc_TypeError, "cannot use a unicode array to "
2723 "initialize an array with typecode '%c'", c);
2724 return NULL;
2725 }
2726 }
2727 }
2728
2729 if (!(initial == NULL || PyList_Check(initial)
2730 || PyByteArray_Check(initial)
2731 || PyBytes_Check(initial)
2732 || PyTuple_Check(initial)
2733 || (is_unicode && PyUnicode_Check(initial))
2734 || (array_Check(initial, state)
2735 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
2736 it = PyObject_GetIter(initial);
2737 if (it == NULL)
2738 return NULL;
2739 /* We set initial to NULL so that the subsequent code
2740 will create an empty array of the appropriate type
2741 and afterwards we can use array_iter_extend to populate
2742 the array.
2743 */
2744 initial = NULL;
2745 }
2746 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2747 if (descr->typecode == c) {
2748 PyObject *a;
2749 Py_ssize_t len;
2750
2751 if (initial == NULL)
2752 len = 0;
2753 else if (PyList_Check(initial))
2754 len = PyList_GET_SIZE(initial);
2755 else if (PyTuple_Check(initial) || array_Check(initial, state))
2756 len = Py_SIZE(initial);
2757 else
2758 len = 0;
2759
2760 a = newarrayobject(type, len, descr);
2761 if (a == NULL)
2762 return NULL;
2763
2764 if (len > 0 && !array_Check(initial, state)) {
2765 Py_ssize_t i;
2766 for (i = 0; i < len; i++) {
2767 PyObject *v =
2768 PySequence_GetItem(initial, i);
2769 if (v == NULL) {
2770 Py_DECREF(a);
2771 return NULL;
2772 }
2773 if (setarrayitem(a, i, v) != 0) {
2774 Py_DECREF(v);
2775 Py_DECREF(a);
2776 return NULL;
2777 }
2778 Py_DECREF(v);
2779 }
2780 }
2781 else if (initial != NULL && (PyByteArray_Check(initial) ||
2782 PyBytes_Check(initial))) {
2783 PyObject *v;
2784 v = array_array_frombytes((arrayobject *)a,
2785 initial);
2786 if (v == NULL) {
2787 Py_DECREF(a);
2788 return NULL;
2789 }
2790 Py_DECREF(v);
2791 }
2792 else if (initial != NULL && PyUnicode_Check(initial)) {
2793 if (c == 'u') {
2794 Py_ssize_t n;
2795 wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n);
2796 if (ustr == NULL) {
2797 Py_DECREF(a);
2798 return NULL;
2799 }
2800
2801 if (n > 0) {
2802 arrayobject *self = (arrayobject *)a;
2803 // self->ob_item may be NULL but it is safe.
2804 PyMem_Free(self->ob_item);
2805 self->ob_item = (char *)ustr;
2806 Py_SET_SIZE(self, n);
2807 self->allocated = n;
2808 }
2809 }
2810 else { // c == 'w'
2811 Py_ssize_t n = PyUnicode_GET_LENGTH(initial);
2812 Py_UCS4 *ustr = PyUnicode_AsUCS4Copy(initial);
2813 if (ustr == NULL) {
2814 Py_DECREF(a);
2815 return NULL;
2816 }
2817
2818 arrayobject *self = (arrayobject *)a;
2819 // self->ob_item may be NULL but it is safe.
2820 PyMem_Free(self->ob_item);
2821 self->ob_item = (char *)ustr;
2822 Py_SET_SIZE(self, n);
2823 self->allocated = n;
2824 }
2825 }
2826 else if (initial != NULL && array_Check(initial, state) && len > 0) {
2827 arrayobject *self = (arrayobject *)a;
2828 arrayobject *other = (arrayobject *)initial;
2829 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2830 }
2831 if (it != NULL) {
2832 if (array_iter_extend((arrayobject *)a, it) == -1) {
2833 Py_DECREF(it);
2834 Py_DECREF(a);
2835 return NULL;
2836 }
2837 Py_DECREF(it);
2838 }
2839 return a;
2840 }
2841 }
2842 PyErr_SetString(PyExc_ValueError,
2843 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
2844 return NULL;
2845 }
2846
2847
2848 PyDoc_STRVAR(module_doc,
2849 "This module defines an object type which can efficiently represent\n\
2850 an array of basic values: characters, integers, floating-point\n\
2851 numbers. Arrays are sequence types and behave very much like lists,\n\
2852 except that the type of objects stored in them is constrained.\n");
2853
2854 PyDoc_STRVAR(arraytype_doc,
2855 "array(typecode [, initializer]) -> array\n\
2856 \n\
2857 Return a new array whose items are restricted by typecode, and\n\
2858 initialized from the optional initializer value, which must be a list,\n\
2859 string or iterable over elements of the appropriate type.\n\
2860 \n\
2861 Arrays represent basic values and behave very much like lists, except\n\
2862 the type of objects stored in them is constrained. The type is specified\n\
2863 at object creation time by using a type code, which is a single character.\n\
2864 The following type codes are defined:\n\
2865 \n\
2866 Type code C Type Minimum size in bytes\n\
2867 'b' signed integer 1\n\
2868 'B' unsigned integer 1\n\
2869 'u' Unicode character 2 (see note)\n\
2870 'h' signed integer 2\n\
2871 'H' unsigned integer 2\n\
2872 'i' signed integer 2\n\
2873 'I' unsigned integer 2\n\
2874 'l' signed integer 4\n\
2875 'L' unsigned integer 4\n\
2876 'q' signed integer 8 (see note)\n\
2877 'Q' unsigned integer 8 (see note)\n\
2878 'f' floating-point 4\n\
2879 'd' floating-point 8\n\
2880 \n\
2881 NOTE: The 'u' typecode corresponds to Python's unicode character. On\n\
2882 narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2883 \n\
2884 NOTE: The 'q' and 'Q' type codes are only available if the platform\n\
2885 C compiler used to build Python supports 'long long', or, on Windows,\n\
2886 '__int64'.\n\
2887 \n\
2888 Methods:\n\
2889 \n\
2890 append() -- append a new item to the end of the array\n\
2891 buffer_info() -- return information giving the current memory info\n\
2892 byteswap() -- byteswap all the items of the array\n\
2893 count() -- return number of occurrences of an object\n\
2894 extend() -- extend array by appending multiple elements from an iterable\n\
2895 fromfile() -- read items from a file object\n\
2896 fromlist() -- append items from the list\n\
2897 frombytes() -- append items from the string\n\
2898 index() -- return index of first occurrence of an object\n\
2899 insert() -- insert a new item into the array at a provided position\n\
2900 pop() -- remove and return item (default last)\n\
2901 remove() -- remove first occurrence of an object\n\
2902 reverse() -- reverse the order of the items in the array\n\
2903 tofile() -- write all items to a file object\n\
2904 tolist() -- return the array converted to an ordinary list\n\
2905 tobytes() -- return the array converted to a string\n\
2906 \n\
2907 Attributes:\n\
2908 \n\
2909 typecode -- the typecode character used to create the array\n\
2910 itemsize -- the length in bytes of one array item\n\
2911 ");
2912
2913 static PyObject *array_iter(arrayobject *ao);
2914
2915 static struct PyMemberDef array_members[] = {
2916 {"__weaklistoffset__", Py_T_PYSSIZET, offsetof(arrayobject, weakreflist), Py_READONLY},
2917 {NULL},
2918 };
2919
2920 static PyType_Slot array_slots[] = {
2921 {Py_tp_dealloc, array_dealloc},
2922 {Py_tp_repr, array_repr},
2923 {Py_tp_getattro, PyObject_GenericGetAttr},
2924 {Py_tp_doc, (void *)arraytype_doc},
2925 {Py_tp_richcompare, array_richcompare},
2926 {Py_tp_iter, array_iter},
2927 {Py_tp_methods, array_methods},
2928 {Py_tp_members, array_members},
2929 {Py_tp_getset, array_getsets},
2930 {Py_tp_alloc, PyType_GenericAlloc},
2931 {Py_tp_new, array_new},
2932 {Py_tp_traverse, array_tp_traverse},
2933
2934 /* as sequence */
2935 {Py_sq_length, array_length},
2936 {Py_sq_concat, array_concat},
2937 {Py_sq_repeat, array_repeat},
2938 {Py_sq_item, array_item},
2939 {Py_sq_ass_item, array_ass_item},
2940 {Py_sq_contains, array_contains},
2941 {Py_sq_inplace_concat, array_inplace_concat},
2942 {Py_sq_inplace_repeat, array_inplace_repeat},
2943
2944 /* as mapping */
2945 {Py_mp_length, array_length},
2946 {Py_mp_subscript, array_subscr},
2947 {Py_mp_ass_subscript, array_ass_subscr},
2948
2949 /* as buffer */
2950 {Py_bf_getbuffer, array_buffer_getbuf},
2951 {Py_bf_releasebuffer, array_buffer_relbuf},
2952
2953 {0, NULL},
2954 };
2955
2956 static PyType_Spec array_spec = {
2957 .name = "array.array",
2958 .basicsize = sizeof(arrayobject),
2959 .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
2960 Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC |
2961 Py_TPFLAGS_SEQUENCE),
2962 .slots = array_slots,
2963 };
2964
2965 /*********************** Array Iterator **************************/
2966
2967 /*[clinic input]
2968 class array.arrayiterator "arrayiterobject *" "find_array_state_by_type(type)->ArrayIterType"
2969 [clinic start generated code]*/
2970 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=fb46d5ef98dd95ff]*/
2971
2972 static PyObject *
array_iter(arrayobject * ao)2973 array_iter(arrayobject *ao)
2974 {
2975 array_state *state = find_array_state_by_type(Py_TYPE(ao));
2976 arrayiterobject *it;
2977
2978 if (!array_Check(ao, state)) {
2979 PyErr_BadInternalCall();
2980 return NULL;
2981 }
2982
2983 it = PyObject_GC_New(arrayiterobject, state->ArrayIterType);
2984 if (it == NULL)
2985 return NULL;
2986
2987 it->ao = (arrayobject*)Py_NewRef(ao);
2988 it->index = 0;
2989 it->getitem = ao->ob_descr->getitem;
2990 PyObject_GC_Track(it);
2991 return (PyObject *)it;
2992 }
2993
2994 static PyObject *
arrayiter_next(arrayiterobject * it)2995 arrayiter_next(arrayiterobject *it)
2996 {
2997 arrayobject *ao;
2998
2999 assert(it != NULL);
3000 #ifndef NDEBUG
3001 array_state *state = find_array_state_by_type(Py_TYPE(it));
3002 assert(PyObject_TypeCheck(it, state->ArrayIterType));
3003 #endif
3004 ao = it->ao;
3005 if (ao == NULL) {
3006 return NULL;
3007 }
3008 #ifndef NDEBUG
3009 assert(array_Check(ao, state));
3010 #endif
3011 if (it->index < Py_SIZE(ao)) {
3012 return (*it->getitem)(ao, it->index++);
3013 }
3014 it->ao = NULL;
3015 Py_DECREF(ao);
3016 return NULL;
3017 }
3018
3019 static void
arrayiter_dealloc(arrayiterobject * it)3020 arrayiter_dealloc(arrayiterobject *it)
3021 {
3022 PyTypeObject *tp = Py_TYPE(it);
3023
3024 PyObject_GC_UnTrack(it);
3025 Py_XDECREF(it->ao);
3026 PyObject_GC_Del(it);
3027 Py_DECREF(tp);
3028 }
3029
3030 static int
arrayiter_traverse(arrayiterobject * it,visitproc visit,void * arg)3031 arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
3032 {
3033 Py_VISIT(Py_TYPE(it));
3034 Py_VISIT(it->ao);
3035 return 0;
3036 }
3037
3038 /*[clinic input]
3039 array.arrayiterator.__reduce__
3040
3041 cls: defining_class
3042 /
3043
3044 Return state information for pickling.
3045 [clinic start generated code]*/
3046
3047 static PyObject *
array_arrayiterator___reduce___impl(arrayiterobject * self,PyTypeObject * cls)3048 array_arrayiterator___reduce___impl(arrayiterobject *self, PyTypeObject *cls)
3049 /*[clinic end generated code: output=4b032417a2c8f5e6 input=ac64e65a87ad452e]*/
3050 {
3051
3052 array_state *state = get_array_state_by_class(cls);
3053 assert(state != NULL);
3054 PyObject *func = _PyEval_GetBuiltin(state->str_iter);
3055 if (self->ao == NULL) {
3056 return Py_BuildValue("N(())", func);
3057 }
3058 return Py_BuildValue("N(O)n", func, self->ao, self->index);
3059 }
3060
3061 /*[clinic input]
3062 array.arrayiterator.__setstate__
3063
3064 state: object
3065 /
3066
3067 Set state information for unpickling.
3068 [clinic start generated code]*/
3069
3070 static PyObject *
array_arrayiterator___setstate__(arrayiterobject * self,PyObject * state)3071 array_arrayiterator___setstate__(arrayiterobject *self, PyObject *state)
3072 /*[clinic end generated code: output=397da9904e443cbe input=f47d5ceda19e787b]*/
3073 {
3074 Py_ssize_t index = PyLong_AsSsize_t(state);
3075 if (index == -1 && PyErr_Occurred())
3076 return NULL;
3077 if (index < 0)
3078 index = 0;
3079 else if (index > Py_SIZE(self->ao))
3080 index = Py_SIZE(self->ao); /* iterator exhausted */
3081 self->index = index;
3082 Py_RETURN_NONE;
3083 }
3084
3085 static PyMethodDef arrayiter_methods[] = {
3086 ARRAY_ARRAYITERATOR___REDUCE___METHODDEF
3087 ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF
3088 {NULL, NULL} /* sentinel */
3089 };
3090
3091 static PyType_Slot arrayiter_slots[] = {
3092 {Py_tp_dealloc, arrayiter_dealloc},
3093 {Py_tp_getattro, PyObject_GenericGetAttr},
3094 {Py_tp_traverse, arrayiter_traverse},
3095 {Py_tp_iter, PyObject_SelfIter},
3096 {Py_tp_iternext, arrayiter_next},
3097 {Py_tp_methods, arrayiter_methods},
3098 {0, NULL},
3099 };
3100
3101 static PyType_Spec arrayiter_spec = {
3102 .name = "array.arrayiterator",
3103 .basicsize = sizeof(arrayiterobject),
3104 .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3105 Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE),
3106 .slots = arrayiter_slots,
3107 };
3108
3109
3110 /*********************** Install Module **************************/
3111
3112 static int
array_traverse(PyObject * module,visitproc visit,void * arg)3113 array_traverse(PyObject *module, visitproc visit, void *arg)
3114 {
3115 array_state *state = get_array_state(module);
3116 Py_VISIT(state->ArrayType);
3117 Py_VISIT(state->ArrayIterType);
3118 Py_VISIT(state->array_reconstructor);
3119 return 0;
3120 }
3121
3122 static int
array_clear(PyObject * module)3123 array_clear(PyObject *module)
3124 {
3125 array_state *state = get_array_state(module);
3126 Py_CLEAR(state->ArrayType);
3127 Py_CLEAR(state->ArrayIterType);
3128 Py_CLEAR(state->array_reconstructor);
3129 Py_CLEAR(state->str_read);
3130 Py_CLEAR(state->str_write);
3131 Py_CLEAR(state->str___dict__);
3132 Py_CLEAR(state->str_iter);
3133 return 0;
3134 }
3135
3136 static void
array_free(void * module)3137 array_free(void *module)
3138 {
3139 array_clear((PyObject *)module);
3140 }
3141
3142 /* No functions in array module. */
3143 static PyMethodDef a_methods[] = {
3144 ARRAY__ARRAY_RECONSTRUCTOR_METHODDEF
3145 {NULL, NULL, 0, NULL} /* Sentinel */
3146 };
3147
3148 #define CREATE_TYPE(module, type, spec) \
3149 do { \
3150 type = (PyTypeObject *)PyType_FromModuleAndSpec(module, spec, NULL); \
3151 if (type == NULL) { \
3152 return -1; \
3153 } \
3154 } while (0)
3155
3156 #define ADD_INTERNED(state, string) \
3157 do { \
3158 PyObject *tmp = PyUnicode_InternFromString(#string); \
3159 if (tmp == NULL) { \
3160 return -1; \
3161 } \
3162 state->str_ ## string = tmp; \
3163 } while (0)
3164
3165 static int
array_modexec(PyObject * m)3166 array_modexec(PyObject *m)
3167 {
3168 array_state *state = get_array_state(m);
3169 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
3170 PyObject *typecodes;
3171 const struct arraydescr *descr;
3172
3173 state->array_reconstructor = NULL;
3174 /* Add interned strings */
3175 ADD_INTERNED(state, read);
3176 ADD_INTERNED(state, write);
3177 ADD_INTERNED(state, __dict__);
3178 ADD_INTERNED(state, iter);
3179
3180 CREATE_TYPE(m, state->ArrayType, &array_spec);
3181 CREATE_TYPE(m, state->ArrayIterType, &arrayiter_spec);
3182 Py_SET_TYPE(state->ArrayIterType, &PyType_Type);
3183
3184 if (PyModule_AddObjectRef(m, "ArrayType",
3185 (PyObject *)state->ArrayType) < 0) {
3186 return -1;
3187 }
3188
3189 PyObject *mutablesequence = _PyImport_GetModuleAttrString(
3190 "collections.abc", "MutableSequence");
3191 if (!mutablesequence) {
3192 Py_DECREF((PyObject *)state->ArrayType);
3193 return -1;
3194 }
3195 PyObject *res = PyObject_CallMethod(mutablesequence, "register", "O",
3196 (PyObject *)state->ArrayType);
3197 Py_DECREF(mutablesequence);
3198 if (!res) {
3199 Py_DECREF((PyObject *)state->ArrayType);
3200 return -1;
3201 }
3202 Py_DECREF(res);
3203
3204 if (PyModule_AddType(m, state->ArrayType) < 0) {
3205 return -1;
3206 }
3207
3208 p = buffer;
3209 for (descr = descriptors; descr->typecode != '\0'; descr++) {
3210 *p++ = (char)descr->typecode;
3211 }
3212 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
3213 if (PyModule_Add(m, "typecodes", typecodes) < 0) {
3214 return -1;
3215 }
3216
3217 return 0;
3218 }
3219
3220 static PyModuleDef_Slot arrayslots[] = {
3221 {Py_mod_exec, array_modexec},
3222 {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
3223 {Py_mod_gil, Py_MOD_GIL_NOT_USED},
3224 {0, NULL}
3225 };
3226
3227
3228 static struct PyModuleDef arraymodule = {
3229 .m_base = PyModuleDef_HEAD_INIT,
3230 .m_name = "array",
3231 .m_size = sizeof(array_state),
3232 .m_doc = module_doc,
3233 .m_methods = a_methods,
3234 .m_slots = arrayslots,
3235 .m_traverse = array_traverse,
3236 .m_clear = array_clear,
3237 .m_free = array_free,
3238 };
3239
3240
3241 PyMODINIT_FUNC
PyInit_array(void)3242 PyInit_array(void)
3243 {
3244 return PyModuleDef_Init(&arraymodule);
3245 }
3246