annotate Modules/arraymodule.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 2c87d3944c7a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Array object implementation */
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 /* An array is a uniform list -- all items have the same type.
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 The item type is restricted to simple C types like int or float */
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
6 #define PY_SSIZE_T_CLEAN
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
7 #include "Python.h"
32159
2c169ca5fa69 Add weakref support to array.array and file objects.
Raymond Hettinger <python@rcn.com>
parents: 31660
diff changeset
8 #include "structmember.h"
4634
9facbab152cd Removed some unneeded header files and reedited with a fixed-width font
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4628
diff changeset
9
1797
b167e3350491 Changes for Mac
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
10 #ifdef STDC_HEADERS
b167e3350491 Changes for Mac
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
11 #include <stddef.h>
11242
0061ca4865d7 Tiny patch by Mark Hammond to avoid sys/types.h if we don't have it
Guido van Rossum <guido@python.org>
parents: 10434
diff changeset
12 #else /* !STDC_HEADERS */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39222
diff changeset
13 #ifdef HAVE_SYS_TYPES_H
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
14 #include <sys/types.h> /* For size_t */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39222
diff changeset
15 #endif /* HAVE_SYS_TYPES_H */
11242
0061ca4865d7 Tiny patch by Mark Hammond to avoid sys/types.h if we don't have it
Guido van Rossum <guido@python.org>
parents: 10434
diff changeset
16 #endif /* !STDC_HEADERS */
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
17
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 struct arrayobject; /* Forward */
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
14499
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
20 /* All possible arraydescr values are defined in the vector "descriptors"
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
21 * below. That's defined later because the appropriate get and set
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
22 * functions aren't visible yet.
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
23 */
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 struct arraydescr {
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
25 char typecode;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
26 int itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
27 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
29 char *formats;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
30 int is_integer_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
31 int is_signed;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 };
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 typedef struct arrayobject {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
35 PyObject_VAR_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
36 char *ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
37 Py_ssize_t allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
38 struct arraydescr *ob_descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
39 PyObject *weakreflist; /* List of weak references */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
40 int ob_exports; /* Number of exported buffers */
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 } arrayobject;
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23929
diff changeset
43 static PyTypeObject Arraytype;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
45 #define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
44351
86a2679dca46 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
46 #define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
48 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
49 array_resize(arrayobject *self, Py_ssize_t newsize)
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
50 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
51 char *items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
52 size_t _new_size;
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
53
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
54 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
55 PyErr_SetString(PyExc_BufferError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
56 "cannot resize an array that is exporting buffers");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
57 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
58 }
50214
aebf7124dd32 Merged revisions 67840 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48683
diff changeset
59
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
60 /* Bypass realloc() when a previous overallocation is large enough
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
61 to accommodate the newsize. If the newsize is 16 smaller than the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
62 current size, then proceed with the realloc() to shrink the array.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
63 */
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
64
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
65 if (self->allocated >= newsize &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
66 Py_SIZE(self) < newsize + 16 &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
67 self->ob_item != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
68 Py_SIZE(self) = newsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
69 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
70 }
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
71
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
72 if (newsize == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
73 PyMem_FREE(self->ob_item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
74 self->ob_item = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
75 Py_SIZE(self) = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
76 self->allocated = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
77 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
78 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
79
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
80 /* This over-allocates proportional to the array size, making room
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
81 * for additional growth. The over-allocation is mild, but is
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
82 * enough to give linear-time amortized behavior over a long
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
83 * sequence of appends() in the presence of a poorly-performing
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
84 * system realloc().
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
85 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
86 * Note, the pattern starts out the same as for lists but then
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
87 * grows at a smaller rate so that larger arrays only overallocate
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
88 * by about 1/16th -- this is done because arrays are presumed to be more
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
89 * memory critical.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
90 */
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
91
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
92 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
93 items = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
94 /* XXX The following multiplication and division does not optimize away
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
95 like it does for lists since the size is not known at compile time */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
96 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
97 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
98 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
99 items = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
100 if (items == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
101 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
102 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
103 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
104 self->ob_item = items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
105 Py_SIZE(self) = newsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
106 self->allocated = _new_size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
107 return 0;
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
108 }
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
109
14499
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
110 /****************************************************************************
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
111 Get and Set functions for each type.
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
112 A Get function takes an arrayobject* and an integer index, returning the
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
113 array value at that index wrapped in an appropriate PyObject*.
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
114 A Set function takes an arrayobject, integer index, and PyObject*; sets
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
115 the array value at that index to the raw C data extracted from the PyObject*,
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
116 and returns 0 if successful, else nonzero on failure (PyObject* not of an
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
117 appropriate type or value).
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
118 Note that the basic Get and Set functions do NOT check that the index is
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
119 in bounds; that's the responsibility of the caller.
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
120 ****************************************************************************/
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
122 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
123 b_getitem(arrayobject *ap, Py_ssize_t i)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
125 long x = ((char *)ap->ob_item)[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
126 if (x >= 128)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
127 x -= 256;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
128 return PyLong_FromLong(x);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
132 b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
134 short x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
135 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
136 must use the next size up that is signed ('h') and manually do
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
137 the overflow checking */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
138 if (!PyArg_Parse(v, "h;array item must be integer", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
139 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
140 else if (x < -128) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
141 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
142 "signed char is less than minimum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
143 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
144 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
145 else if (x > 127) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
146 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
147 "signed char is greater than maximum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
148 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
149 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
150 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
151 ((char *)ap->ob_item)[i] = (char)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
152 return 0;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
154
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
155 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
156 BB_getitem(arrayobject *ap, Py_ssize_t i)
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
157 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
158 long x = ((unsigned char *)ap->ob_item)[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
159 return PyLong_FromLong(x);
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
160 }
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
161
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
162 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
163 BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
164 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
165 unsigned char x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
166 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
167 if (!PyArg_Parse(v, "b;array item must be integer", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
168 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
169 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
170 ((char *)ap->ob_item)[i] = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
171 return 0;
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
172 }
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
173
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
174 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
175 u_getitem(arrayobject *ap, Py_ssize_t i)
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
176 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
178 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
179
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
180 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
181 u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
182 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
183 Py_UNICODE *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
184 Py_ssize_t len;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
185
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
187 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
188 if (len != 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
189 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
190 "array item must be unicode character");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
191 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
192 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
193 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
195 return 0;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
196 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
197
43548
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
198
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
199 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
200 h_getitem(arrayobject *ap, Py_ssize_t i)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
202 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
204
43548
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
205
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
207 h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
209 short x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
210 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
211 if (!PyArg_Parse(v, "h;array item must be integer", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
212 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
213 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
214 ((short *)ap->ob_item)[i] = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
215 return 0;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
217
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
218 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
219 HH_getitem(arrayobject *ap, Py_ssize_t i)
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
220 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
221 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
222 }
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
223
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
224 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
225 HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
226 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
227 int x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
228 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
229 must use the next size up and manually do the overflow checking */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
230 if (!PyArg_Parse(v, "i;array item must be integer", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
231 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
232 else if (x < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
233 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
234 "unsigned short is less than minimum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
235 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
236 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
237 else if (x > USHRT_MAX) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
238 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
239 "unsigned short is greater than maximum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
240 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
241 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
242 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
243 ((short *)ap->ob_item)[i] = (short)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
244 return 0;
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
245 }
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
246
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
247 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
248 i_getitem(arrayobject *ap, Py_ssize_t i)
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
249 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
250 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
251 }
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
252
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
253 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
254 i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
255 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
256 int x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
257 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
258 if (!PyArg_Parse(v, "i;array item must be integer", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
259 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
260 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
261 ((int *)ap->ob_item)[i] = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
262 return 0;
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
263 }
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
264
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
265 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
266 II_getitem(arrayobject *ap, Py_ssize_t i)
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
267 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
268 return PyLong_FromUnsignedLong(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
269 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
270 }
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
271
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
272 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
273 II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
274 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
275 unsigned long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
276 if (PyLong_Check(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
277 x = PyLong_AsUnsignedLong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
278 if (x == (unsigned long) -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
279 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
280 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
281 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
282 long y;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
283 if (!PyArg_Parse(v, "l;array item must be integer", &y))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
284 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
285 if (y < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
286 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
287 "unsigned int is less than minimum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
288 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
289 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
290 x = (unsigned long)y;
14499
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
291
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
292 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
293 if (x > UINT_MAX) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
294 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
295 "unsigned int is greater than maximum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
296 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
297 }
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
298
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
299 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
300 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
301 return 0;
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
302 }
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
303
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
304 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
305 l_getitem(arrayobject *ap, Py_ssize_t i)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
307 return PyLong_FromLong(((long *)ap->ob_item)[i]);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
309
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
311 l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
313 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
314 if (!PyArg_Parse(v, "l;array item must be integer", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
315 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
316 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
317 ((long *)ap->ob_item)[i] = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
318 return 0;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
320
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
321 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
322 LL_getitem(arrayobject *ap, Py_ssize_t i)
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
323 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
324 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
325 }
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
326
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
327 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
328 LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
329 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
330 unsigned long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
331 if (PyLong_Check(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
332 x = PyLong_AsUnsignedLong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
333 if (x == (unsigned long) -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
334 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
335 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
336 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
337 long y;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
338 if (!PyArg_Parse(v, "l;array item must be integer", &y))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
339 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
340 if (y < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
341 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
342 "unsigned long is less than minimum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
343 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
344 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
345 x = (unsigned long)y;
14499
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
346
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
347 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
348 if (x > ULONG_MAX) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
349 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
350 "unsigned long is greater than maximum");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
351 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
352 }
14499
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
353
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
354 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
355 ((unsigned long *)ap->ob_item)[i] = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
356 return 0;
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
357 }
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
358
72430
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
359 #ifdef HAVE_LONG_LONG
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
360
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
361 static PyObject *
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
362 q_getitem(arrayobject *ap, Py_ssize_t i)
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
363 {
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
364 return PyLong_FromLongLong(((PY_LONG_LONG *)ap->ob_item)[i]);
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
365 }
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
366
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
367 static int
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
368 q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
369 {
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
370 PY_LONG_LONG x;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
371 if (!PyArg_Parse(v, "L;array item must be integer", &x))
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
372 return -1;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
373 if (i >= 0)
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
374 ((PY_LONG_LONG *)ap->ob_item)[i] = x;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
375 return 0;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
376 }
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
377
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
378 static PyObject *
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
379 QQ_getitem(arrayobject *ap, Py_ssize_t i)
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
380 {
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
381 return PyLong_FromUnsignedLongLong(
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
382 ((unsigned PY_LONG_LONG *)ap->ob_item)[i]);
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
383 }
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
384
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
385 static int
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
386 QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
387 {
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
388 unsigned PY_LONG_LONG x;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
389 if (PyLong_Check(v)) {
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
390 x = PyLong_AsUnsignedLongLong(v);
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
391 if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred())
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
392 return -1;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
393 }
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
394 else {
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
395 PY_LONG_LONG y;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
396 if (!PyArg_Parse(v, "L;array item must be integer", &y))
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
397 return -1;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
398 if (y < 0) {
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
399 PyErr_SetString(PyExc_OverflowError,
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
400 "unsigned long long is less than minimum");
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
401 return -1;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
402 }
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
403 x = (unsigned PY_LONG_LONG)y;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
404 }
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
405
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
406 if (i >= 0)
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
407 ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
408 return 0;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
409 }
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
410 #endif
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
411
4875
911040e1bb11 Add new formats B, H, I, L for unsigned data types (analogous to the
Guido van Rossum <guido@python.org>
parents: 4634
diff changeset
412 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
413 f_getitem(arrayobject *ap, Py_ssize_t i)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
415 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
417
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
419 f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
421 float x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
422 if (!PyArg_Parse(v, "f;array item must be float", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
423 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
424 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
425 ((float *)ap->ob_item)[i] = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
426 return 0;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
428
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
429 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
430 d_getitem(arrayobject *ap, Py_ssize_t i)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
432 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
434
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
436 d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
438 double x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
439 if (!PyArg_Parse(v, "d;array item must be float", &x))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
440 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
441 if (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
442 ((double *)ap->ob_item)[i] = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
443 return 0;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
445
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
446
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
447 /* Description of types.
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
448 *
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
449 * Don't forget to update typecode_to_mformat_code() if you add a new
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
450 * typecode.
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
451 */
1313
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1271
diff changeset
452 static struct arraydescr descriptors[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
453 {'b', 1, b_getitem, b_setitem, "b", 1, 1},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
454 {'B', 1, BB_getitem, BB_setitem, "B", 1, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
455 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u", 0, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
456 {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
457 {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
458 {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
459 {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
460 {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
461 {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
72430
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
462 #ifdef HAVE_LONG_LONG
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
463 {'q', sizeof(PY_LONG_LONG), q_getitem, q_setitem, "q", 1, 1},
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
464 {'Q', sizeof(PY_LONG_LONG), QQ_getitem, QQ_setitem, "Q", 1, 0},
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
465 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
466 {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
467 {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
468 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 };
14499
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
470
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
471 /****************************************************************************
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
472 Implementations of array object methods.
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
473 ****************************************************************************/
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
474
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
475 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
476 newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
478 arrayobject *op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
479 size_t nbytes;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
480
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
481 if (size < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
482 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
483 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
484 }
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
485
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
486 /* Check for overflow */
79529
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
487 if (size > PY_SSIZE_T_MAX / descr->itemsize) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
488 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
489 }
79529
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
490 nbytes = size * descr->itemsize;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
491 op = (arrayobject *) type->tp_alloc(type, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
492 if (op == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
493 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
494 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
495 op->ob_descr = descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
496 op->allocated = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
497 op->weakreflist = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
498 Py_SIZE(op) = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
499 if (size <= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
500 op->ob_item = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
501 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
502 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
503 op->ob_item = PyMem_NEW(char, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
504 if (op->ob_item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
505 Py_DECREF(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
506 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
507 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
508 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
509 op->ob_exports = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
510 return (PyObject *) op;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
512
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
513 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
514 getarrayitem(PyObject *op, Py_ssize_t i)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 {
85157
e7f6cef7a4cc Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84701
diff changeset
516 arrayobject *ap;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
517 assert(array_Check(op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
518 ap = (arrayobject *)op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
519 assert(i>=0 && i<Py_SIZE(ap));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
520 return (*ap->ob_descr->getitem)(ap, i);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
522
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
523 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
524 ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
526 char *items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
527 Py_ssize_t n = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
528 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
529 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
530 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
531 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
532 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
533 return -1;
31659
206d8575f644 Update the array overallocation scheme to match the approach used for
Raymond Hettinger <python@rcn.com>
parents: 31651
diff changeset
534
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
535 if (array_resize(self, n+1) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
536 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
537 items = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
538 if (where < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
539 where += n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
540 if (where < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
541 where = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
542 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
543 if (where > n)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
544 where = n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
545 /* appends don't need to call memmove() */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
546 if (where != n)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
547 memmove(items + (where+1)*self->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
548 items + where*self->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
549 (n-where)*self->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
550 return (*self->ob_descr->setitem)(self, where, v);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
551 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
552
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 /* Methods */
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
554
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 static void
13590
c503d8e474b3 ANSI-fication (got lost in the deep seas of source forge <wink>)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
556 array_dealloc(arrayobject *op)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
558 if (op->weakreflist != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
559 PyObject_ClearWeakRefs((PyObject *) op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
560 if (op->ob_item != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
561 PyMem_DEL(op->ob_item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
562 Py_TYPE(op)->tp_free((PyObject *)op);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
564
15975
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
565 static PyObject *
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
566 array_richcompare(PyObject *v, PyObject *w, int op)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
567 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
568 arrayobject *va, *wa;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
569 PyObject *vi = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
570 PyObject *wi = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
571 Py_ssize_t i, k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
572 PyObject *res;
15975
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
573
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 70710
diff changeset
574 if (!array_Check(v) || !array_Check(w))
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 70710
diff changeset
575 Py_RETURN_NOTIMPLEMENTED;
15975
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
576
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
577 va = (arrayobject *)v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
578 wa = (arrayobject *)w;
15975
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
579
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
580 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
581 /* Shortcut: if the lengths differ, the arrays differ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
582 if (op == Py_EQ)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
583 res = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
584 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
585 res = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
586 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
587 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
588 }
15975
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
589
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
590 /* Search for the first index where items are different */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
591 k = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
592 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
593 vi = getarrayitem(v, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
594 wi = getarrayitem(w, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
595 if (vi == NULL || wi == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
596 Py_XDECREF(vi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
597 Py_XDECREF(wi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
598 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
599 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
600 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
601 if (k == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
602 break; /* Keeping vi and wi alive! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
603 Py_DECREF(vi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
604 Py_DECREF(wi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
605 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
606 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
607 }
15975
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
608
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
609 if (k) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
610 /* No more items to compare -- compare sizes */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
611 Py_ssize_t vs = Py_SIZE(va);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
612 Py_ssize_t ws = Py_SIZE(wa);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
613 int cmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
614 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
615 case Py_LT: cmp = vs < ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
616 case Py_LE: cmp = vs <= ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
617 case Py_EQ: cmp = vs == ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
618 case Py_NE: cmp = vs != ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
619 case Py_GT: cmp = vs > ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
620 case Py_GE: cmp = vs >= ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
621 default: return NULL; /* cannot happen */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
622 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
623 if (cmp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
624 res = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
625 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
626 res = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
627 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
628 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
629 }
15975
54205828b1e1 Same treatment as listobject.c:
Guido van Rossum <guido@python.org>
parents: 15396
diff changeset
630
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
631 /* We have an item that differs. First, shortcuts for EQ/NE */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
632 if (op == Py_EQ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
633 Py_INCREF(Py_False);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
634 res = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
635 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
636 else if (op == Py_NE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
637 Py_INCREF(Py_True);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
638 res = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
639 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
640 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
641 /* Compare the final item again using the proper operator */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
642 res = PyObject_RichCompare(vi, wi, op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
643 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
644 Py_DECREF(vi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
645 Py_DECREF(wi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
646 return res;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
647 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
648
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
649 static Py_ssize_t
13590
c503d8e474b3 ANSI-fication (got lost in the deep seas of source forge <wink>)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
650 array_length(arrayobject *a)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
652 return Py_SIZE(a);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
654
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
655 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
656 array_item(arrayobject *a, Py_ssize_t i)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
658 if (i < 0 || i >= Py_SIZE(a)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
659 PyErr_SetString(PyExc_IndexError, "array index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
660 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
661 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
662 return getarrayitem((PyObject *)a, i);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
664
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
665 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
666 array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
667 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
668 arrayobject *np;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
669 if (ilow < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
670 ilow = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
671 else if (ilow > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
672 ilow = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
673 if (ihigh < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
674 ihigh = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
675 if (ihigh < ilow)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
676 ihigh = ilow;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
677 else if (ihigh > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
678 ihigh = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
679 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
680 if (np == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
681 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
682 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
683 (ihigh-ilow) * a->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
684 return (PyObject *)np;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
685 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
686
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
687 static PyObject *
31651
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
688 array_copy(arrayobject *a, PyObject *unused)
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
689 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
690 return array_slice(a, 0, Py_SIZE(a));
31651
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
691 }
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
692
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
693 PyDoc_STRVAR(copy_doc,
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
694 "copy(array)\n\
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
695 \n\
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
696 Return a copy of the array.");
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
697
35cb8114b45c SF bug #910986: copy.copy fails for array.array
Raymond Hettinger <python@rcn.com>
parents: 30683
diff changeset
698 static PyObject *
13590
c503d8e474b3 ANSI-fication (got lost in the deep seas of source forge <wink>)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
699 array_concat(arrayobject *a, PyObject *bb)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
701 Py_ssize_t size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
702 arrayobject *np;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
703 if (!array_Check(bb)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
704 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
705 "can only append array (not \"%.200s\") to array",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
706 Py_TYPE(bb)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
707 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
708 }
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
709 #define b ((arrayobject *)bb)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
710 if (a->ob_descr != b->ob_descr) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
711 PyErr_BadArgument();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
712 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
713 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
714 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
715 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
716 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
717 size = Py_SIZE(a) + Py_SIZE(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
718 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
719 if (np == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
720 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
721 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
722 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
723 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
724 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
725 return (PyObject *)np;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
726 #undef b
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
727 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
728
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
729 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
730 array_repeat(arrayobject *a, Py_ssize_t n)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
731 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
732 Py_ssize_t size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
733 arrayobject *np;
66688
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
734 Py_ssize_t oldbytes, newbytes;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
735 if (n < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
736 n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
737 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
738 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
739 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
740 size = Py_SIZE(a) * n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
741 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
742 if (np == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
743 return NULL;
66688
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
744 if (n == 0)
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
745 return (PyObject *)np;
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
746 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
747 newbytes = oldbytes * n;
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
748 /* this follows the code in unicode_repeat */
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
749 if (oldbytes == 1) {
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
750 memset(np->ob_item, a->ob_item[0], newbytes);
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
751 } else {
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
752 Py_ssize_t done = oldbytes;
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
753 Py_MEMCPY(np->ob_item, a->ob_item, oldbytes);
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
754 while (done < newbytes) {
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
755 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
756 Py_MEMCPY(np->ob_item+done, np->ob_item, ncopy);
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
757 done += ncopy;
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
758 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
759 }
66688
48c40709417b #1569291: speed up array.repeat() by making only O(log n) memcpy() calls; the code follows unicode_repeat.
Georg Brandl <georg@python.org>
parents: 66664
diff changeset
760 return (PyObject *)np;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
761 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
762
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
763 static int
36518
9f3f87e920a6 Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
764 array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
766 char *item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
767 Py_ssize_t n; /* Size of replacement array */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
768 Py_ssize_t d; /* Change in size */
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
769 #define b ((arrayobject *)v)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
770 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
771 n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
772 else if (array_Check(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
773 n = Py_SIZE(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
774 if (a == b) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
775 /* Special case "a[i:j] = a" -- copy b first */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
776 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
777 v = array_slice(b, 0, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
778 if (!v)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
779 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
780 ret = array_ass_slice(a, ilow, ihigh, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
781 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
782 return ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
783 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
784 if (b->ob_descr != a->ob_descr) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
785 PyErr_BadArgument();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
786 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
787 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
788 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
789 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
790 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
791 "can only assign array (not \"%.200s\") to array slice",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
792 Py_TYPE(v)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
793 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
794 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
795 if (ilow < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
796 ilow = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
797 else if (ilow > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
798 ilow = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
799 if (ihigh < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
800 ihigh = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
801 if (ihigh < ilow)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
802 ihigh = ilow;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
803 else if (ihigh > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
804 ihigh = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
805 item = a->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
806 d = n - (ihigh-ilow);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
807 /* Issue #4509: If the array has exported buffers and the slice
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
808 assignment would change the size of the array, fail early to make
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
809 sure we don't modify it. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
810 if (d != 0 && a->ob_exports > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
811 PyErr_SetString(PyExc_BufferError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
812 "cannot resize an array that is exporting buffers");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
813 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
814 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
815 if (d < 0) { /* Delete -d items */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
816 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
817 item + ihigh*a->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
818 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
819 if (array_resize(a, Py_SIZE(a) + d) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
820 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
821 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
822 else if (d > 0) { /* Insert d items */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
823 if (array_resize(a, Py_SIZE(a) + d))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
824 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
825 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
826 item + ihigh*a->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
827 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
828 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
829 if (n > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
830 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
831 n*b->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
832 return 0;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
833 #undef b
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
834 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
835
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
836 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
837 array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
838 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
839 if (i < 0 || i >= Py_SIZE(a)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
840 PyErr_SetString(PyExc_IndexError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
841 "array assignment index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
842 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
843 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
844 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
845 return array_ass_slice(a, i, i+1, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
846 return (*a->ob_descr->setitem)(a, i, v);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
848
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
850 setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
852 assert(array_Check(a));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
853 return array_ass_item((arrayobject *)a, i, v);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
855
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
856 static int
31660
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
857 array_iter_extend(arrayobject *self, PyObject *bb)
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
858 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
859 PyObject *it, *v;
31660
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
860
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
861 it = PyObject_GetIter(bb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
862 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
863 return -1;
31660
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
864
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
865 while ((v = PyIter_Next(it)) != NULL) {
63766
6b28b88f6c4e Merged revisions 83751-83752 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
866 if (ins1(self, Py_SIZE(self), v) != 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
867 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
868 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
869 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
870 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
871 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
872 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
873 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
874 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
875 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
876 return 0;
31660
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
877 }
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
878
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
879 static int
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
880 array_do_extend(arrayobject *self, PyObject *bb)
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
881 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
882 Py_ssize_t size, oldsize, bbsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
883
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
884 if (!array_Check(bb))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
885 return array_iter_extend(self, bb);
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
886 #define b ((arrayobject *)bb)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
887 if (self->ob_descr != b->ob_descr) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
888 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
889 "can only extend with array of same kind");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
890 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
891 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
892 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
893 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
894 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
895 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
896 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
897 oldsize = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
898 /* Get the size of bb before resizing the array since bb could be self. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
899 bbsize = Py_SIZE(bb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
900 size = oldsize + Py_SIZE(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
901 if (array_resize(self, size) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
902 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
903 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
904 b->ob_item, bbsize * b->ob_descr->itemsize);
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
905
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
906 return 0;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
907 #undef b
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
908 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
909
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
910 static PyObject *
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
911 array_inplace_concat(arrayobject *self, PyObject *bb)
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
912 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
913 if (!array_Check(bb)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
914 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
915 "can only extend array with array (not \"%.200s\")",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
916 Py_TYPE(bb)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
917 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
918 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
919 if (array_do_extend(self, bb) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
920 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
921 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
922 return (PyObject *)self;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
923 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
924
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
925 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
926 array_inplace_repeat(arrayobject *self, Py_ssize_t n)
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
927 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
928 char *items, *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
929 Py_ssize_t size, i;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
930
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
931 if (Py_SIZE(self) > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
932 if (n < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
933 n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
934 if ((self->ob_descr->itemsize != 0) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
935 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
936 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
937 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
938 size = Py_SIZE(self) * self->ob_descr->itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
939 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
940 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
941 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
942 if (array_resize(self, n * Py_SIZE(self)) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
943 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
944 items = p = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
945 for (i = 1; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
946 p += size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
947 memcpy(p, items, size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
948 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
949 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
950 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
951 return (PyObject *)self;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
952 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
953
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
954
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
955 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
956 ins(arrayobject *self, Py_ssize_t where, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
957 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
958 if (ins1(self, where, v) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
959 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
960 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
961 return Py_None;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
962 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
963
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
964 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
965 array_count(arrayobject *self, PyObject *v)
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
966 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
967 Py_ssize_t count = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
968 Py_ssize_t i;
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
969
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
970 for (i = 0; i < Py_SIZE(self); i++) {
84700
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
971 PyObject *selfi;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
972 int cmp;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
973
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
974 selfi = getarrayitem((PyObject *)self, i);
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
975 if (selfi == NULL)
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
976 return NULL;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
977 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
978 Py_DECREF(selfi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
979 if (cmp > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
980 count++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
981 else if (cmp < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
982 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
983 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
984 return PyLong_FromSsize_t(count);
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
985 }
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
986
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
987 PyDoc_STRVAR(count_doc,
14649
1ec6c63347ea arraymodule: Fix SF bug 113960.
Tim Peters <tim.peters@gmail.com>
parents: 14499
diff changeset
988 "count(x)\n\
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
989 \n\
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51271
diff changeset
990 Return number of occurrences of x in the array.");
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
991
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
992 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
993 array_index(arrayobject *self, PyObject *v)
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
994 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
995 Py_ssize_t i;
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
996
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
997 for (i = 0; i < Py_SIZE(self); i++) {
84700
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
998 PyObject *selfi;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
999 int cmp;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1000
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1001 selfi = getarrayitem((PyObject *)self, i);
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1002 if (selfi == NULL)
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1003 return NULL;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1004 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1005 Py_DECREF(selfi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1006 if (cmp > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1007 return PyLong_FromLong((long)i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1008 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1009 else if (cmp < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1010 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1011 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1012 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1013 return NULL;
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1014 }
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1015
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1016 PyDoc_STRVAR(index_doc,
14649
1ec6c63347ea arraymodule: Fix SF bug 113960.
Tim Peters <tim.peters@gmail.com>
parents: 14499
diff changeset
1017 "index(x)\n\
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1018 \n\
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51271
diff changeset
1019 Return index of first occurrence of x in the array.");
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1020
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
1021 static int
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
1022 array_contains(arrayobject *self, PyObject *v)
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
1023 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1024 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1025 int cmp;
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
1026
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1027 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1028 PyObject *selfi = getarrayitem((PyObject *)self, i);
84700
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1029 if (selfi == NULL)
84701
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1030 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1031 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1032 Py_DECREF(selfi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1033 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1034 return cmp;
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
1035 }
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
1036
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1037 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1038 array_remove(arrayobject *self, PyObject *v)
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1039 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1040 int i;
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1041
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1042 for (i = 0; i < Py_SIZE(self); i++) {
84700
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1043 PyObject *selfi;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1044 int cmp;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1045
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1046 selfi = getarrayitem((PyObject *)self,i);
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1047 if (selfi == NULL)
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1048 return NULL;
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1049 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1050 Py_DECREF(selfi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1051 if (cmp > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1052 if (array_ass_slice(self, i, i+1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1053 (PyObject *)NULL) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1054 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1055 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1056 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1057 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1058 else if (cmp < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1059 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1060 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1061 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1062 return NULL;
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1063 }
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1064
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1065 PyDoc_STRVAR(remove_doc,
14649
1ec6c63347ea arraymodule: Fix SF bug 113960.
Tim Peters <tim.peters@gmail.com>
parents: 14499
diff changeset
1066 "remove(x)\n\
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1067 \n\
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51271
diff changeset
1068 Remove the first occurrence of x in the array.");
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1069
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1070 static PyObject *
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1071 array_pop(arrayobject *self, PyObject *args)
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1072 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1073 Py_ssize_t i = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1074 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1075 if (!PyArg_ParseTuple(args, "|n:pop", &i))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1076 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1077 if (Py_SIZE(self) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1078 /* Special-case most common failure cause */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1079 PyErr_SetString(PyExc_IndexError, "pop from empty array");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1080 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1081 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1082 if (i < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1083 i += Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1084 if (i < 0 || i >= Py_SIZE(self)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1085 PyErr_SetString(PyExc_IndexError, "pop index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1086 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1087 }
84700
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1088 v = getarrayitem((PyObject *)self, i);
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1089 if (v == NULL)
d85b0c355052 Issue #18408: Fix array_index(), handle getarrayitem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 82389
diff changeset
1090 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1091 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1092 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1093 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1094 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1095 return v;
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1096 }
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1097
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1098 PyDoc_STRVAR(pop_doc,
14649
1ec6c63347ea arraymodule: Fix SF bug 113960.
Tim Peters <tim.peters@gmail.com>
parents: 14499
diff changeset
1099 "pop([i])\n\
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1100 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1101 Return the i-th element and delete it from the array. i defaults to -1.");
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1102
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1103 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1104 array_extend(arrayobject *self, PyObject *bb)
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1105 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1106 if (array_do_extend(self, bb) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1107 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1108 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1109 return Py_None;
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1110 }
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1111
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1112 PyDoc_STRVAR(extend_doc,
31660
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
1113 "extend(array or iterable)\n\
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1114 \n\
31660
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
1115 Append items to the end of the array.");
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1116
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
1117 static PyObject *
13590
c503d8e474b3 ANSI-fication (got lost in the deep seas of source forge <wink>)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
1118 array_insert(arrayobject *self, PyObject *args)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1119 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1120 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1121 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1122 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1123 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1124 return ins(self, i, v);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1125 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1126
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1127 PyDoc_STRVAR(insert_doc,
14649
1ec6c63347ea arraymodule: Fix SF bug 113960.
Tim Peters <tim.peters@gmail.com>
parents: 14499
diff changeset
1128 "insert(i,x)\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1129 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1130 Insert a new item x into the array before position i.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1131
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1132
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1133 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1134 array_buffer_info(arrayobject *self, PyObject *unused)
5982
6aebd970b7a9 Added buffer_info() method that returns address and length in bytes of
Guido van Rossum <guido@python.org>
parents: 5696
diff changeset
1135 {
87092
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1136 PyObject *retval = NULL, *v;
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1137
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1138 retval = PyTuple_New(2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1139 if (!retval)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1140 return NULL;
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
1141
87092
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1142 v = PyLong_FromVoidPtr(self->ob_item);
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1143 if (v == NULL) {
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1144 Py_DECREF(retval);
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1145 return NULL;
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1146 }
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1147 PyTuple_SET_ITEM(retval, 0, v);
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1148
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1149 v = PyLong_FromLong((long)(Py_SIZE(self)));
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1150 if (v == NULL) {
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1151 Py_DECREF(retval);
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1152 return NULL;
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1153 }
285d28c3620a Issue #19437: Fix array.buffer_info(), handle PyLong_FromVoidPtr() and
Victor Stinner <victor.stinner@gmail.com>
parents: 85157
diff changeset
1154 PyTuple_SET_ITEM(retval, 1, v);
13068
705132667f7b Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12814
diff changeset
1155
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1156 return retval;
5982
6aebd970b7a9 Added buffer_info() method that returns address and length in bytes of
Guido van Rossum <guido@python.org>
parents: 5696
diff changeset
1157 }
6aebd970b7a9 Added buffer_info() method that returns address and length in bytes of
Guido van Rossum <guido@python.org>
parents: 5696
diff changeset
1158
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1159 PyDoc_STRVAR(buffer_info_doc,
14649
1ec6c63347ea arraymodule: Fix SF bug 113960.
Tim Peters <tim.peters@gmail.com>
parents: 14499
diff changeset
1160 "buffer_info() -> (address, length)\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1161 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1162 Return a tuple (address, length) giving the current memory address and\n\
18851
ef2031c54875 Fix buffer_info() docstring to match reality. See SF bug #444842.
Guido van Rossum <guido@python.org>
parents: 18036
diff changeset
1163 the length in items of the buffer used to hold array's contents\n\
ef2031c54875 Fix buffer_info() docstring to match reality. See SF bug #444842.
Guido van Rossum <guido@python.org>
parents: 18036
diff changeset
1164 The length should be multiplied by the itemsize attribute to calculate\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1165 the buffer length in bytes.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1166
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1167
5982
6aebd970b7a9 Added buffer_info() method that returns address and length in bytes of
Guido van Rossum <guido@python.org>
parents: 5696
diff changeset
1168 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1169 array_append(arrayobject *self, PyObject *v)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1170 {
63766
6b28b88f6c4e Merged revisions 83751-83752 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1171 return ins(self, Py_SIZE(self), v);
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1172 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1173
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1174 PyDoc_STRVAR(append_doc,
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1175 "append(x)\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1176 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1177 Append new value x to the end of the array.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1178
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1179
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1180 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1181 array_byteswap(arrayobject *self, PyObject *unused)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1182 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1183 char *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1184 Py_ssize_t i;
11522
cbf58cd0bb57 Correct the docstring for byteswap(); error noted by Bernhard Reiter
Fred Drake <fdrake@acm.org>
parents: 11242
diff changeset
1185
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1186 switch (self->ob_descr->itemsize) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1187 case 1:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1188 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1189 case 2:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1190 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1191 char p0 = p[0];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1192 p[0] = p[1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1193 p[1] = p0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1194 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1195 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1196 case 4:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1197 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1198 char p0 = p[0];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1199 char p1 = p[1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1200 p[0] = p[3];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1201 p[1] = p[2];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1202 p[2] = p1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1203 p[3] = p0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1204 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1205 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1206 case 8:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1207 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1208 char p0 = p[0];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1209 char p1 = p[1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1210 char p2 = p[2];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1211 char p3 = p[3];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1212 p[0] = p[7];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1213 p[1] = p[6];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1214 p[2] = p[5];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1215 p[3] = p[4];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1216 p[4] = p3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1217 p[5] = p2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1218 p[6] = p1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1219 p[7] = p0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1220 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1221 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1222 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1223 PyErr_SetString(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1224 "don't know how to byteswap this array type");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1225 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1226 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1227 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1228 return Py_None;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1229 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1230
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1231 PyDoc_STRVAR(byteswap_doc,
11522
cbf58cd0bb57 Correct the docstring for byteswap(); error noted by Bernhard Reiter
Fred Drake <fdrake@acm.org>
parents: 11242
diff changeset
1232 "byteswap()\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1233 \n\
11522
cbf58cd0bb57 Correct the docstring for byteswap(); error noted by Bernhard Reiter
Fred Drake <fdrake@acm.org>
parents: 11242
diff changeset
1234 Byteswap all items of the array. If the items in the array are not 1, 2,\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1235 4, or 8 bytes in size, RuntimeError is raised.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1236
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1237 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1238 array_reverse(arrayobject *self, PyObject *unused)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1239 {
85157
e7f6cef7a4cc Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84701
diff changeset
1240 Py_ssize_t itemsize = self->ob_descr->itemsize;
e7f6cef7a4cc Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84701
diff changeset
1241 char *p, *q;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1242 /* little buffer to hold items while swapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1243 char tmp[256]; /* 8 is probably enough -- but why skimp */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1244 assert((size_t)itemsize <= sizeof(tmp));
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
1245
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1246 if (Py_SIZE(self) > 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1247 for (p = self->ob_item,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1248 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1249 p < q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1250 p += itemsize, q -= itemsize) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1251 /* memory areas guaranteed disjoint, so memcpy
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1252 * is safe (& memmove may be slower).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1253 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1254 memcpy(tmp, p, itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1255 memcpy(p, q, itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1256 memcpy(q, tmp, itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1257 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1258 }
14499
7f23ec5cd9ca General cleanup in preparation for a bugfix: removed unused code, useless
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
1259
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1260 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1261 return Py_None;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1262 }
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1391
diff changeset
1263
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1264 PyDoc_STRVAR(reverse_doc,
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1265 "reverse()\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1266 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1267 Reverse the order of the items in the array.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1268
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1269
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1270 /* Forward */
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1271 static PyObject *array_frombytes(arrayobject *self, PyObject *args);
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1272
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1273 static PyObject *
13590
c503d8e474b3 ANSI-fication (got lost in the deep seas of source forge <wink>)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
1274 array_fromfile(arrayobject *self, PyObject *args)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1275 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1276 PyObject *f, *b, *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1277 Py_ssize_t itemsize = self->ob_descr->itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1278 Py_ssize_t n, nbytes;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
1279 _Py_IDENTIFIER(read);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1280 int not_enough_bytes;
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1281
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1282 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1283 return NULL;
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1284
79529
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
1285 if (n < 0) {
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
1286 PyErr_SetString(PyExc_ValueError, "negative count");
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
1287 return NULL;
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
1288 }
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
1289 if (n > PY_SSIZE_T_MAX / itemsize) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1290 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1291 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1292 }
79529
152d85b2da3a Issue #16096: Fix several occurrences of potential signed integer overflow. Thanks Serhiy Storchaka.
Mark Dickinson <mdickinson@enthought.com>
parents: 78494
diff changeset
1293 nbytes = n * itemsize;
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1294
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72544
diff changeset
1295 b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1296 if (b == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1297 return NULL;
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1298
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1299 if (!PyBytes_Check(b)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1300 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1301 "read() didn't return bytes");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1302 Py_DECREF(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1303 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1304 }
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1305
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1306 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1307
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1308 args = Py_BuildValue("(O)", b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1309 Py_DECREF(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1310 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1311 return NULL;
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1312
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1313 res = array_frombytes(self, args);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1314 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1315 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1316 return NULL;
52040
9fa7949641d3 Issue #5334: array.fromfile() failed to insert values when EOFError was raised.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
1317
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1318 if (not_enough_bytes) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1319 PyErr_SetString(PyExc_EOFError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1320 "read() didn't return enough bytes");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1321 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1322 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1323 }
41859
e4e8b12770e4 Fixed array.fromfile(); removed references to PyFileObject in array.tofile().
Guido van Rossum <guido@python.org>
parents: 41788
diff changeset
1324
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1325 return res;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1326 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1327
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1328 PyDoc_STRVAR(fromfile_doc,
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1329 "fromfile(f, n)\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1330 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1331 Read n objects from the file object f and append them to the end of the\n\
45083
c66da57b9488 Remove the deprecated array.read/write methods.
Georg Brandl <georg@python.org>
parents: 44351
diff changeset
1332 array.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1333
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1334
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1335 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1336 array_tofile(arrayobject *self, PyObject *f)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1337 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1338 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1339 /* Write 64K blocks at a time */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1340 /* XXX Make the block size settable */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1341 int BLOCKSIZE = 64*1024;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1342 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1343 Py_ssize_t i;
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1344
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1345 if (Py_SIZE(self) == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1346 goto done;
41434
f390793e75de Make array().tofile() work with a new I/O object.
Guido van Rossum <guido@python.org>
parents: 40737
diff changeset
1347
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1348 for (i = 0; i < nblocks; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1349 char* ptr = self->ob_item + i*BLOCKSIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1350 Py_ssize_t size = BLOCKSIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1351 PyObject *bytes, *res;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
1352 _Py_IDENTIFIER(write);
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72544
diff changeset
1353
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1354 if (i*BLOCKSIZE + size > nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1355 size = nbytes - i*BLOCKSIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1356 bytes = PyBytes_FromStringAndSize(ptr, size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1357 if (bytes == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1358 return NULL;
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72544
diff changeset
1359 res = _PyObject_CallMethodId(f, &PyId_write, "O", bytes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1360 Py_DECREF(bytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1361 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1362 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1363 Py_DECREF(res); /* drop write result */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1364 }
41434
f390793e75de Make array().tofile() work with a new I/O object.
Guido van Rossum <guido@python.org>
parents: 40737
diff changeset
1365
f390793e75de Make array().tofile() work with a new I/O object.
Guido van Rossum <guido@python.org>
parents: 40737
diff changeset
1366 done:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1367 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1368 return Py_None;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1369 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1370
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1371 PyDoc_STRVAR(tofile_doc,
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1372 "tofile(f)\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1373 \n\
45083
c66da57b9488 Remove the deprecated array.read/write methods.
Georg Brandl <georg@python.org>
parents: 44351
diff changeset
1374 Write all items (as machine values) to the file object f.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1375
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1376
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1377 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1378 array_fromlist(arrayobject *self, PyObject *list)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1379 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1380 Py_ssize_t n;
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1381
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1382 if (!PyList_Check(list)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1383 PyErr_SetString(PyExc_TypeError, "arg must be list");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1384 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1385 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1386 n = PyList_Size(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1387 if (n > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1388 Py_ssize_t i, old_size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1389 old_size = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1390 if (array_resize(self, old_size + n) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1391 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1392 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1393 PyObject *v = PyList_GetItem(list, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1394 if ((*self->ob_descr->setitem)(self,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1395 Py_SIZE(self) - n + i, v) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1396 array_resize(self, old_size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1397 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1398 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1399 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1400 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1401 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1402 return Py_None;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1403 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1404
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1405 PyDoc_STRVAR(fromlist_doc,
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1406 "fromlist(list)\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1407 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1408 Append items to array from list.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1409
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1410 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1411 array_tolist(arrayobject *self, PyObject *unused)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1412 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1413 PyObject *list = PyList_New(Py_SIZE(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1414 Py_ssize_t i;
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1415
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1416 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1417 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1418 for (i = 0; i < Py_SIZE(self); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1419 PyObject *v = getarrayitem((PyObject *)self, i);
84701
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1420 if (v == NULL)
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1421 goto error;
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1422 if (PyList_SetItem(list, i, v) < 0)
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1423 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1424 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1425 return list;
84701
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1426
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1427 error:
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1428 Py_DECREF(list);
b05a6a6eb525 Issue #18408: Fix array_tolist(), handle PyList_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84700
diff changeset
1429 return NULL;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1430 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1431
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1432 PyDoc_STRVAR(tolist_doc,
9360
4c23ae6c6e82 ACK! There was still an unescaped newline in a docstring.
Guido van Rossum <guido@python.org>
parents: 9343
diff changeset
1433 "tolist() -> list\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1434 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1435 Convert array to an ordinary list with the same items.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1436
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1437 static PyObject *
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1438 frombytes(arrayobject *self, Py_buffer *buffer)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1439 {
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1440 int itemsize = self->ob_descr->itemsize;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1441 Py_ssize_t n;
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1442 if (buffer->itemsize != 1) {
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1443 PyBuffer_Release(buffer);
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1444 PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required.");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1445 return NULL;
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1446 }
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1447 n = buffer->len;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1448 if (n % itemsize != 0) {
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1449 PyBuffer_Release(buffer);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1450 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1451 "string length not a multiple of item size");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1452 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1453 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1454 n = n / itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1455 if (n > 0) {
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1456 Py_ssize_t old_size = Py_SIZE(self);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1457 if ((n > PY_SSIZE_T_MAX - old_size) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1458 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1459 PyBuffer_Release(buffer);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1460 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1461 }
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1462 if (array_resize(self, old_size + n) == -1) {
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1463 PyBuffer_Release(buffer);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1464 return NULL;
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1465 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1466 memcpy(self->ob_item + old_size * itemsize,
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1467 buffer->buf, n * itemsize);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1468 }
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1469 PyBuffer_Release(buffer);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1470 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1471 return Py_None;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1472 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1473
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1474 static PyObject *
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1475 array_fromstring(arrayobject *self, PyObject *args)
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1476 {
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1477 Py_buffer buffer;
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1478 if (PyErr_WarnEx(PyExc_DeprecationWarning,
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1479 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1480 return NULL;
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1481 if (!PyArg_ParseTuple(args, "s*:fromstring", &buffer))
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1482 return NULL;
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1483 else
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1484 return frombytes(self, &buffer);
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1485 }
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1486
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1487 PyDoc_STRVAR(fromstring_doc,
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1488 "fromstring(string)\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1489 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1490 Appends items from the string, interpreting it as an array of machine\n\
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1491 values, as if it had been read from a file using the fromfile() method).\n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1492 \n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1493 This method is deprecated. Use frombytes instead.");
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1494
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1495
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1496 static PyObject *
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1497 array_frombytes(arrayobject *self, PyObject *args)
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1498 {
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1499 Py_buffer buffer;
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1500 if (!PyArg_ParseTuple(args, "y*:frombytes", &buffer))
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1501 return NULL;
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1502 else
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1503 return frombytes(self, &buffer);
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1504 }
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1505
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1506 PyDoc_STRVAR(frombytes_doc,
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1507 "frombytes(bytestring)\n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1508 \n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1509 Appends items from the string, interpreting it as an array of machine\n\
42125
79c2656056f6 Make array.typecode a unicode string.
Walter Dörwald <walter@livinglogic.de>
parents: 42112
diff changeset
1510 values, as if it had been read from a file using the fromfile() method).");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1511
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1512
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1513 static PyObject *
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1514 array_tobytes(arrayobject *self, PyObject *unused)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1515 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1516 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1517 return PyBytes_FromStringAndSize(self->ob_item,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1518 Py_SIZE(self) * self->ob_descr->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1519 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1520 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1521 }
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1522 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1523
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1524 PyDoc_STRVAR(tobytes_doc,
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1525 "tobytes() -> bytes\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1526 \n\
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1527 Convert the array to an array of machine values and return the bytes\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1528 representation.");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
1529
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1530
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1531 static PyObject *
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1532 array_tostring(arrayobject *self, PyObject *unused)
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1533 {
66105
646dfdc48ca8 Issue #10359: Use Py_UNICODE for the typecode in array
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
1534 if (PyErr_WarnEx(PyExc_DeprecationWarning,
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1535 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1536 return NULL;
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1537 return array_tobytes(self, unused);
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1538 }
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1539
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1540 PyDoc_STRVAR(tostring_doc,
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1541 "tostring() -> bytes\n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1542 \n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1543 Convert the array to an array of machine values and return the bytes\n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1544 representation.\n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1545 \n\
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1546 This method is deprecated. Use tobytes instead.");
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
1547
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1548
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1549 static PyObject *
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1550 array_fromunicode(arrayobject *self, PyObject *args)
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1551 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1552 Py_UNICODE *ustr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1553 Py_ssize_t n;
78447
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
1554 char typecode;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1555
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1556 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1557 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1558 typecode = self->ob_descr->typecode;
80825
88dcccb46298 Code style fixup: No need for double ((parenthesis)) and use {} on an if else.
Gregory P. Smith <greg@krypto.org>
parents: 78493
diff changeset
1559 if (typecode != 'u') {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1560 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1561 "fromunicode() may only be called on "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1562 "unicode type arrays");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1563 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1564 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1565 if (n > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1566 Py_ssize_t old_size = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1567 if (array_resize(self, old_size + n) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1568 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1569 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1570 ustr, n * sizeof(Py_UNICODE));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1571 }
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1572
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1573 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1574 return Py_None;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1575 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1576
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1577 PyDoc_STRVAR(fromunicode_doc,
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1578 "fromunicode(ustr)\n\
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1579 \n\
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1580 Extends this array with data from the unicode string ustr.\n\
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
1581 The array must be a unicode type array; otherwise a ValueError\n\
73092
451fa5782145 Issue #13255: wrong docstrings in array module.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 68257
diff changeset
1582 is raised. Use array.frombytes(ustr.encode(...)) to\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1583 append Unicode data to an array of some other type.");
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1584
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1585
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1586 static PyObject *
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1587 array_tounicode(arrayobject *self, PyObject *unused)
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1588 {
78447
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
1589 char typecode;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1590 typecode = self->ob_descr->typecode;
80825
88dcccb46298 Code style fixup: No need for double ((parenthesis)) and use {} on an if else.
Gregory P. Smith <greg@krypto.org>
parents: 78493
diff changeset
1591 if (typecode != 'u') {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1592 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1593 "tounicode() may only be called on unicode type arrays");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1594 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1595 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
1596 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1597 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1598
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1599 PyDoc_STRVAR(tounicode_doc,
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1600 "tounicode() -> unicode\n\
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1601 \n\
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1602 Convert the array to a unicode string. The array must be\n\
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
1603 a unicode type array; otherwise a ValueError is raised. Use\n\
73092
451fa5782145 Issue #13255: wrong docstrings in array module.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 68257
diff changeset
1604 array.tobytes().decode() to obtain a unicode string from\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
1605 an array of some other type.");
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1606
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1607
78493
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1608 static PyObject *
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1609 array_sizeof(arrayobject *self, PyObject *unused)
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1610 {
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1611 Py_ssize_t res;
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1612 res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize;
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1613 return PyLong_FromSsize_t(res);
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1614 }
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1615
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1616 PyDoc_STRVAR(sizeof_doc,
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1617 "__sizeof__() -> int\n\
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1618 \n\
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1619 Size of the array in memory, in bytes.");
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
1620
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
1621
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1622 /*********************** Pickling support ************************/
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1623
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1624 enum machine_format_code {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1625 UNKNOWN_FORMAT = -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1626 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1627 * array type code cannot be interpreted. When this occurs, a list of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1628 * Python objects is used to represent the content of the array
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1629 * instead of using the memory content of the array directly. In that
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1630 * case, the array_reconstructor mechanism is bypassed completely, and
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1631 * the standard array constructor is used instead.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1632 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1633 * This is will most likely occur when the machine doesn't use IEEE
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1634 * floating-point numbers.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1635 */
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1636
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1637 UNSIGNED_INT8 = 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1638 SIGNED_INT8 = 1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1639 UNSIGNED_INT16_LE = 2,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1640 UNSIGNED_INT16_BE = 3,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1641 SIGNED_INT16_LE = 4,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1642 SIGNED_INT16_BE = 5,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1643 UNSIGNED_INT32_LE = 6,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1644 UNSIGNED_INT32_BE = 7,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1645 SIGNED_INT32_LE = 8,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1646 SIGNED_INT32_BE = 9,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1647 UNSIGNED_INT64_LE = 10,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1648 UNSIGNED_INT64_BE = 11,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1649 SIGNED_INT64_LE = 12,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1650 SIGNED_INT64_BE = 13,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1651 IEEE_754_FLOAT_LE = 14,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1652 IEEE_754_FLOAT_BE = 15,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1653 IEEE_754_DOUBLE_LE = 16,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1654 IEEE_754_DOUBLE_BE = 17,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1655 UTF16_LE = 18,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1656 UTF16_BE = 19,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1657 UTF32_LE = 20,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1658 UTF32_BE = 21
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1659 };
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1660 #define MACHINE_FORMAT_CODE_MIN 0
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1661 #define MACHINE_FORMAT_CODE_MAX 21
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1662
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1663 static const struct mformatdescr {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1664 size_t size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1665 int is_signed;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1666 int is_big_endian;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1667 } mformat_descriptors[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1668 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1669 {1, 1, 0}, /* 1: SIGNED_INT8 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1670 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1671 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1672 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1673 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1674 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1675 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1676 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1677 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1678 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1679 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1680 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1681 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1682 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1683 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1684 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1685 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1686 {4, 0, 0}, /* 18: UTF16_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1687 {4, 0, 1}, /* 19: UTF16_BE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1688 {8, 0, 0}, /* 20: UTF32_LE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1689 {8, 0, 1} /* 21: UTF32_BE */
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1690 };
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1691
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1692
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1693 /*
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1694 * Internal: This function is used to find the machine format of a given
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1695 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1696 * be found.
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1697 */
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1698 static enum machine_format_code
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1699 typecode_to_mformat_code(char typecode)
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1700 {
79803
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 79529
diff changeset
1701 const int is_big_endian = PY_BIG_ENDIAN;
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 79529
diff changeset
1702
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1703 size_t intsize;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1704 int is_signed;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1705
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1706 switch (typecode) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1707 case 'b':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1708 return SIGNED_INT8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1709 case 'B':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1710 return UNSIGNED_INT8;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1711
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1712 case 'u':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1713 if (sizeof(Py_UNICODE) == 2) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1714 return UTF16_LE + is_big_endian;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1715 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1716 if (sizeof(Py_UNICODE) == 4) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1717 return UTF32_LE + is_big_endian;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1718 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1719 return UNKNOWN_FORMAT;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1720
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1721 case 'f':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1722 if (sizeof(float) == 4) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1723 const float y = 16711938.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1724 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1725 return IEEE_754_FLOAT_BE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1726 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1727 return IEEE_754_FLOAT_LE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1728 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1729 return UNKNOWN_FORMAT;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1730
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1731 case 'd':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1732 if (sizeof(double) == 8) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1733 const double x = 9006104071832581.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1734 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1735 return IEEE_754_DOUBLE_BE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1736 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1737 return IEEE_754_DOUBLE_LE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1738 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1739 return UNKNOWN_FORMAT;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1740
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1741 /* Integers */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1742 case 'h':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1743 intsize = sizeof(short);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1744 is_signed = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1745 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1746 case 'H':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1747 intsize = sizeof(short);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1748 is_signed = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1749 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1750 case 'i':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1751 intsize = sizeof(int);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1752 is_signed = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1753 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1754 case 'I':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1755 intsize = sizeof(int);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1756 is_signed = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1757 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1758 case 'l':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1759 intsize = sizeof(long);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1760 is_signed = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1761 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1762 case 'L':
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1763 intsize = sizeof(long);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1764 is_signed = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1765 break;
72430
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1766 #if HAVE_LONG_LONG
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1767 case 'q':
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1768 intsize = sizeof(PY_LONG_LONG);
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1769 is_signed = 1;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1770 break;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1771 case 'Q':
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1772 intsize = sizeof(PY_LONG_LONG);
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1773 is_signed = 0;
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
1774 break;
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1775 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1776 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1777 return UNKNOWN_FORMAT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1778 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1779 switch (intsize) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1780 case 2:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1781 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1782 case 4:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1783 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1784 case 8:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1785 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1786 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1787 return UNKNOWN_FORMAT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1788 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1789 }
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1790
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1791 /* Forward declaration. */
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1792 static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1793
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1794 /*
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1795 * Internal: This function wraps the array constructor--i.e., array_new()--to
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1796 * allow the creation of array objects from C code without having to deal
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1797 * directly the tuple argument of array_new(). The typecode argument is a
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1798 * Unicode character value, like 'i' or 'f' for example, representing an array
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1799 * type code. The items argument is a bytes or a list object from which
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1800 * contains the initial value of the array.
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1801 *
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1802 * On success, this functions returns the array object created. Otherwise,
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1803 * NULL is returned to indicate a failure.
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1804 */
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1805 static PyObject *
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1806 make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1807 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1808 PyObject *new_args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1809 PyObject *array_obj;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1810 PyObject *typecode_obj;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1811
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1812 assert(arraytype != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1813 assert(items != NULL);
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1814
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1815 typecode_obj = PyUnicode_FromOrdinal(typecode);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1816 if (typecode_obj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1817 return NULL;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1818
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1819 new_args = PyTuple_New(2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1820 if (new_args == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1821 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1822 Py_INCREF(items);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1823 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1824 PyTuple_SET_ITEM(new_args, 1, items);
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1825
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1826 array_obj = array_new(arraytype, new_args, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1827 Py_DECREF(new_args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1828 if (array_obj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1829 return NULL;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1830
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1831 return array_obj;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1832 }
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1833
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1834 /*
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1835 * This functions is a special constructor used when unpickling an array. It
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1836 * provides a portable way to rebuild an array from its memory representation.
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1837 */
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1838 static PyObject *
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1839 array_reconstructor(PyObject *self, PyObject *args)
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1840 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1841 PyTypeObject *arraytype;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1842 PyObject *items;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1843 PyObject *converted_items;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1844 PyObject *result;
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1845 int typecode;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1846 enum machine_format_code mformat_code;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1847 struct arraydescr *descr;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1848
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1849 if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1850 &arraytype, &typecode, &mformat_code, &items))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1851 return NULL;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1852
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1853 if (!PyType_Check(arraytype)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1854 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1855 "first argument must a type object, not %.200s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1856 Py_TYPE(arraytype)->tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1857 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1858 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1859 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1860 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1861 "%.200s is not a subtype of %.200s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1862 arraytype->tp_name, Arraytype.tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1863 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1864 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1865 for (descr = descriptors; descr->typecode != '\0'; descr++) {
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1866 if ((int)descr->typecode == typecode)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1867 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1868 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1869 if (descr->typecode == '\0') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1870 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1871 "second argument must be a valid type code");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1872 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1873 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1874 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1875 mformat_code > MACHINE_FORMAT_CODE_MAX) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1876 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1877 "third argument must be a valid machine format code.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1878 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1879 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1880 if (!PyBytes_Check(items)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1881 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1882 "fourth argument should be bytes, not %.200s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1883 Py_TYPE(items)->tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1884 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1885 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1886
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1887 /* Fast path: No decoding has to be done. */
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1888 if (mformat_code == typecode_to_mformat_code((char)typecode) ||
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1889 mformat_code == UNKNOWN_FORMAT) {
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
1890 return make_array(arraytype, (char)typecode, items);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1891 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1892
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1893 /* Slow path: Decode the byte string according to the given machine
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1894 * format code. This occurs when the computer unpickling the array
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1895 * object is architecturally different from the one that pickled the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1896 * array.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1897 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1898 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1899 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1900 "string length not a multiple of item size");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1901 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1902 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1903 switch (mformat_code) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1904 case IEEE_754_FLOAT_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1905 case IEEE_754_FLOAT_BE: {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1906 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1907 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1908 Py_ssize_t itemcount = Py_SIZE(items) / 4;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1909 const unsigned char *memstr =
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1910 (unsigned char *)PyBytes_AS_STRING(items);
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1911
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1912 converted_items = PyList_New(itemcount);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1913 if (converted_items == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1914 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1915 for (i = 0; i < itemcount; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1916 PyObject *pyfloat = PyFloat_FromDouble(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1917 _PyFloat_Unpack4(&memstr[i * 4], le));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1918 if (pyfloat == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1919 Py_DECREF(converted_items);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1920 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1921 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1922 PyList_SET_ITEM(converted_items, i, pyfloat);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1923 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1924 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1925 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1926 case IEEE_754_DOUBLE_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1927 case IEEE_754_DOUBLE_BE: {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1928 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1929 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1930 Py_ssize_t itemcount = Py_SIZE(items) / 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1931 const unsigned char *memstr =
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1932 (unsigned char *)PyBytes_AS_STRING(items);
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1933
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1934 converted_items = PyList_New(itemcount);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1935 if (converted_items == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1936 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1937 for (i = 0; i < itemcount; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1938 PyObject *pyfloat = PyFloat_FromDouble(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1939 _PyFloat_Unpack8(&memstr[i * 8], le));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1940 if (pyfloat == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1941 Py_DECREF(converted_items);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1942 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1943 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1944 PyList_SET_ITEM(converted_items, i, pyfloat);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1945 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1946 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1947 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1948 case UTF16_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1949 case UTF16_BE: {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1950 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1951 converted_items = PyUnicode_DecodeUTF16(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1952 PyBytes_AS_STRING(items), Py_SIZE(items),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1953 "strict", &byteorder);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1954 if (converted_items == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1955 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1956 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1957 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1958 case UTF32_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1959 case UTF32_BE: {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1960 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1961 converted_items = PyUnicode_DecodeUTF32(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1962 PyBytes_AS_STRING(items), Py_SIZE(items),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1963 "strict", &byteorder);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1964 if (converted_items == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1965 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1966 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1967 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1968
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1969 case UNSIGNED_INT8:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1970 case SIGNED_INT8:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1971 case UNSIGNED_INT16_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1972 case UNSIGNED_INT16_BE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1973 case SIGNED_INT16_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1974 case SIGNED_INT16_BE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1975 case UNSIGNED_INT32_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1976 case UNSIGNED_INT32_BE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1977 case SIGNED_INT32_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1978 case SIGNED_INT32_BE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1979 case UNSIGNED_INT64_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1980 case UNSIGNED_INT64_BE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1981 case SIGNED_INT64_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1982 case SIGNED_INT64_BE: {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1983 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1984 const struct mformatdescr mf_descr =
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1985 mformat_descriptors[mformat_code];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1986 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1987 const unsigned char *memstr =
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1988 (unsigned char *)PyBytes_AS_STRING(items);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1989 struct arraydescr *descr;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
1990
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1991 /* If possible, try to pack array's items using a data type
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1992 * that fits better. This may result in an array with narrower
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1993 * or wider elements.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1994 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1995 * For example, if a 32-bit machine pickles a L-code array of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1996 * unsigned longs, then the array will be unpickled by 64-bit
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1997 * machine as an I-code array of unsigned ints.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1998 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
1999 * XXX: Is it possible to write a unit test for this?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2000 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2001 for (descr = descriptors; descr->typecode != '\0'; descr++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2002 if (descr->is_integer_type &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2003 descr->itemsize == mf_descr.size &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2004 descr->is_signed == mf_descr.is_signed)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2005 typecode = descr->typecode;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2006 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2007
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2008 converted_items = PyList_New(itemcount);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2009 if (converted_items == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2010 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2011 for (i = 0; i < itemcount; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2012 PyObject *pylong;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2013
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2014 pylong = _PyLong_FromByteArray(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2015 &memstr[i * mf_descr.size],
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2016 mf_descr.size,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2017 !mf_descr.is_big_endian,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2018 mf_descr.is_signed);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2019 if (pylong == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2020 Py_DECREF(converted_items);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2021 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2022 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2023 PyList_SET_ITEM(converted_items, i, pylong);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2024 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2025 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2026 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2027 case UNKNOWN_FORMAT:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2028 /* Impossible, but needed to shut up GCC about the unhandled
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2029 * enumeration value.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2030 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2031 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2032 PyErr_BadArgument();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2033 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2034 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2035
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
2036 result = make_array(arraytype, (char)typecode, converted_items);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2037 Py_DECREF(converted_items);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2038 return result;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2039 }
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2040
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2041 static PyObject *
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2042 array_reduce_ex(arrayobject *array, PyObject *value)
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2043 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2044 PyObject *dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2045 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2046 PyObject *array_str;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2047 int typecode = array->ob_descr->typecode;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2048 int mformat_code;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2049 static PyObject *array_reconstructor = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2050 long protocol;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
2051 _Py_IDENTIFIER(_array_reconstructor);
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
2052 _Py_IDENTIFIER(__dict__);
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2053
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2054 if (array_reconstructor == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2055 PyObject *array_module = PyImport_ImportModule("array");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2056 if (array_module == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2057 return NULL;
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
2058 array_reconstructor = _PyObject_GetAttrId(
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2059 array_module,
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
2060 &PyId__array_reconstructor);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2061 Py_DECREF(array_module);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2062 if (array_reconstructor == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2063 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2064 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2065
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2066 if (!PyLong_Check(value)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2067 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2068 "__reduce_ex__ argument should an integer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2069 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2070 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2071 protocol = PyLong_AsLong(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2072 if (protocol == -1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2073 return NULL;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2074
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
2075 dict = _PyObject_GetAttrId((PyObject *)array, &PyId___dict__);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2076 if (dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2077 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2078 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2079 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2080 dict = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2081 Py_INCREF(dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2082 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2083
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2084 mformat_code = typecode_to_mformat_code(typecode);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2085 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2086 /* Convert the array to a list if we got something weird
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2087 * (e.g., non-IEEE floats), or we are pickling the array using
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2088 * a Python 2.x compatible protocol.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2089 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2090 * It is necessary to use a list representation for Python 2.x
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2091 * compatible pickle protocol, since Python 2's str objects
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2092 * are unpickled as unicode by Python 3. Thus it is impossible
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2093 * to make arrays unpicklable by Python 3 by using their memory
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2094 * representation, unless we resort to ugly hacks such as
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2095 * coercing unicode objects to bytes in array_reconstructor.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2096 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2097 PyObject *list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2098 list = array_tolist(array, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2099 if (list == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2100 Py_DECREF(dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2101 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2102 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2103 result = Py_BuildValue(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2104 "O(CO)O", Py_TYPE(array), typecode, list, dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2105 Py_DECREF(list);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2106 Py_DECREF(dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2107 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2108 }
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2109
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
2110 array_str = array_tobytes(array, NULL);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2111 if (array_str == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2112 Py_DECREF(dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2113 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2114 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2115 result = Py_BuildValue(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2116 "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2117 mformat_code, array_str, dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2118 Py_DECREF(dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2119 return result;
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2120 }
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2121
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2122 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2123
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2124 static PyObject *
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2125 array_get_typecode(arrayobject *a, void *closure)
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2126 {
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
2127 char typecode = a->ob_descr->typecode;
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
2128 return PyUnicode_FromOrdinal(typecode);
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2129 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2130
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2131 static PyObject *
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2132 array_get_itemsize(arrayobject *a, void *closure)
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2133 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2134 return PyLong_FromLong((long)a->ob_descr->itemsize);
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2135 }
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2136
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2137 static PyGetSetDef array_getsets [] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2138 {"typecode", (getter) array_get_typecode, NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2139 "the typecode character used to create the array"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2140 {"itemsize", (getter) array_get_itemsize, NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2141 "the size, in bytes, of one array item"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2142 {NULL}
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2143 };
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2144
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
2145 static PyMethodDef array_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2146 {"append", (PyCFunction)array_append, METH_O,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2147 append_doc},
81178
3ca72d4e9762 Make indentation consistent and remove dead commented-out code.
Eli Bendersky <eliben@gmail.com>
parents: 80826
diff changeset
2148 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2149 buffer_info_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2150 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2151 byteswap_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2152 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2153 copy_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2154 {"count", (PyCFunction)array_count, METH_O,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2155 count_doc},
81178
3ca72d4e9762 Make indentation consistent and remove dead commented-out code.
Eli Bendersky <eliben@gmail.com>
parents: 80826
diff changeset
2156 {"__deepcopy__", (PyCFunction)array_copy, METH_O,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2157 copy_doc},
81178
3ca72d4e9762 Make indentation consistent and remove dead commented-out code.
Eli Bendersky <eliben@gmail.com>
parents: 80826
diff changeset
2158 {"extend", (PyCFunction)array_extend, METH_O,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2159 extend_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2160 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2161 fromfile_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2162 {"fromlist", (PyCFunction)array_fromlist, METH_O,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2163 fromlist_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2164 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2165 fromstring_doc},
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
2166 {"frombytes", (PyCFunction)array_frombytes, METH_VARARGS,
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
2167 frombytes_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2168 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2169 fromunicode_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2170 {"index", (PyCFunction)array_index, METH_O,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2171 index_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2172 {"insert", (PyCFunction)array_insert, METH_VARARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2173 insert_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2174 {"pop", (PyCFunction)array_pop, METH_VARARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2175 pop_doc},
81178
3ca72d4e9762 Make indentation consistent and remove dead commented-out code.
Eli Bendersky <eliben@gmail.com>
parents: 80826
diff changeset
2176 {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58909
diff changeset
2177 reduce_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2178 {"remove", (PyCFunction)array_remove, METH_O,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2179 remove_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2180 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2181 reverse_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2182 {"tofile", (PyCFunction)array_tofile, METH_O,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2183 tofile_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2184 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2185 tolist_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2186 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2187 tostring_doc},
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
2188 {"tobytes", (PyCFunction)array_tobytes, METH_NOARGS,
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
2189 tobytes_doc},
81178
3ca72d4e9762 Make indentation consistent and remove dead commented-out code.
Eli Bendersky <eliben@gmail.com>
parents: 80826
diff changeset
2190 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2191 tounicode_doc},
78493
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
2192 {"__sizeof__", (PyCFunction)array_sizeof, METH_NOARGS,
45ef9bc8739f Issue #15424: Add a __sizeof__ implementation for array objects.
Meador Inge <meadori@gmail.com>
parents: 73911
diff changeset
2193 sizeof_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2194 {NULL, NULL} /* sentinel */
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2195 };
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2196
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
2197 static PyObject *
13590
c503d8e474b3 ANSI-fication (got lost in the deep seas of source forge <wink>)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
2198 array_repr(arrayobject *a)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2199 {
72540
7042a83f37e6 array module stores the typecode in a char, instead of Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72489
diff changeset
2200 char typecode;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2201 PyObject *s, *v = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2202 Py_ssize_t len;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2203
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2204 len = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2205 typecode = a->ob_descr->typecode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2206 if (len == 0) {
66442
67882105dd65 Fix compilation warnings seen on Windows.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 66105
diff changeset
2207 return PyUnicode_FromFormat("array('%c')", (int)typecode);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2208 }
80825
88dcccb46298 Code style fixup: No need for double ((parenthesis)) and use {} on an if else.
Gregory P. Smith <greg@krypto.org>
parents: 78493
diff changeset
2209 if (typecode == 'u') {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2210 v = array_tounicode(a, NULL);
80825
88dcccb46298 Code style fixup: No need for double ((parenthesis)) and use {} on an if else.
Gregory P. Smith <greg@krypto.org>
parents: 78493
diff changeset
2211 } else {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2212 v = array_tolist(a, NULL);
80825
88dcccb46298 Code style fixup: No need for double ((parenthesis)) and use {} on an if else.
Gregory P. Smith <greg@krypto.org>
parents: 78493
diff changeset
2213 }
82388
ebeed44702ec Issue #17223: array module: Fix a crasher when converting an array containing
Victor Stinner <victor.stinner@gmail.com>
parents: 81178
diff changeset
2214 if (v == NULL)
ebeed44702ec Issue #17223: array module: Fix a crasher when converting an array containing
Victor Stinner <victor.stinner@gmail.com>
parents: 81178
diff changeset
2215 return NULL;
28742
bd678e65f784 SF Patch 685051: fix for 680789: reprs in arraymodule
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
2216
66442
67882105dd65 Fix compilation warnings seen on Windows.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 66105
diff changeset
2217 s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2218 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2219 return s;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2220 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2221
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2222 static PyObject*
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2223 array_subscr(arrayobject* self, PyObject* item)
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2224 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2225 if (PyIndex_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2226 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2227 if (i==-1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2228 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2229 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2230 if (i < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2231 i += Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2232 return array_item(self, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2233 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2234 else if (PySlice_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2235 Py_ssize_t start, stop, step, slicelength, cur, i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2236 PyObject* result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2237 arrayobject* ar;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2238 int itemsize = self->ob_descr->itemsize;
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2239
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66442
diff changeset
2240 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2241 &start, &stop, &step, &slicelength) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2242 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2243 }
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2244
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2245 if (slicelength <= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2246 return newarrayobject(&Arraytype, 0, self->ob_descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2247 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2248 else if (step == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2249 PyObject *result = newarrayobject(&Arraytype,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2250 slicelength, self->ob_descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2251 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2252 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2253 memcpy(((arrayobject *)result)->ob_item,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2254 self->ob_item + start * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2255 slicelength * itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2256 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2257 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2258 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2259 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2260 if (!result) return NULL;
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2261
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2262 ar = (arrayobject*)result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2263
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2264 for (cur = start, i = 0; i < slicelength;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2265 cur += step, i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2266 memcpy(ar->ob_item + i*itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2267 self->ob_item + cur*itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2268 itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2269 }
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2270
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2271 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2272 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2273 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2274 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2275 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2276 "array indices must be integers");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2277 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2278 }
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2279 }
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2280
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2281 static int
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2282 array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2283 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2284 Py_ssize_t start, stop, step, slicelength, needed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2285 arrayobject* other;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2286 int itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2287
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2288 if (PyIndex_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2289 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42856
diff changeset
2290
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2291 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2292 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2293 if (i < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2294 i += Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2295 if (i < 0 || i >= Py_SIZE(self)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2296 PyErr_SetString(PyExc_IndexError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2297 "array assignment index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2298 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2299 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2300 if (value == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2301 /* Fall through to slice assignment */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2302 start = i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2303 stop = i + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2304 step = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2305 slicelength = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2306 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2307 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2308 return (*self->ob_descr->setitem)(self, i, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2309 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2310 else if (PySlice_Check(item)) {
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66442
diff changeset
2311 if (PySlice_GetIndicesEx(item,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2312 Py_SIZE(self), &start, &stop,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2313 &step, &slicelength) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2314 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2315 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2316 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2317 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2318 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2319 "array indices must be integer");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2320 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2321 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2322 if (value == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2323 other = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2324 needed = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2325 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2326 else if (array_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2327 other = (arrayobject *)value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2328 needed = Py_SIZE(other);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2329 if (self == other) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2330 /* Special case "self[i:j] = self" -- copy self first */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2331 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2332 value = array_slice(other, 0, needed);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2333 if (value == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2334 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2335 ret = array_ass_subscr(self, item, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2336 Py_DECREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2337 return ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2338 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2339 if (other->ob_descr != self->ob_descr) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2340 PyErr_BadArgument();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2341 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2342 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2343 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2344 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2345 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2346 "can only assign array (not \"%.200s\") to array slice",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2347 Py_TYPE(value)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2348 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2349 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2350 itemsize = self->ob_descr->itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2351 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2352 if ((step > 0 && stop < start) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2353 (step < 0 && stop > start))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2354 stop = start;
55603
12fec73cb8e5 Merged revisions 73862,73872 via svnmerge from
Georg Brandl <georg@python.org>
parents: 55602
diff changeset
2355
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2356 /* Issue #4509: If the array has exported buffers and the slice
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2357 assignment would change the size of the array, fail early to make
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2358 sure we don't modify it. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2359 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2360 PyErr_SetString(PyExc_BufferError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2361 "cannot resize an array that is exporting buffers");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2362 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2363 }
55603
12fec73cb8e5 Merged revisions 73862,73872 via svnmerge from
Georg Brandl <georg@python.org>
parents: 55602
diff changeset
2364
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2365 if (step == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2366 if (slicelength > needed) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2367 memmove(self->ob_item + (start + needed) * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2368 self->ob_item + stop * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2369 (Py_SIZE(self) - stop) * itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2370 if (array_resize(self, Py_SIZE(self) +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2371 needed - slicelength) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2372 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2373 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2374 else if (slicelength < needed) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2375 if (array_resize(self, Py_SIZE(self) +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2376 needed - slicelength) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2377 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2378 memmove(self->ob_item + (start + needed) * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2379 self->ob_item + stop * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2380 (Py_SIZE(self) - start - needed) * itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2381 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2382 if (needed > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2383 memcpy(self->ob_item + start * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2384 other->ob_item, needed * itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2385 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2386 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2387 else if (needed == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2388 /* Delete slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2389 size_t cur;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2390 Py_ssize_t i;
58564
6de64896c6f8 Merged revisions 77823 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55603
diff changeset
2391
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2392 if (step < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2393 stop = start + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2394 start = stop + step * (slicelength - 1) - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2395 step = -step;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2396 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2397 for (cur = start, i = 0; i < slicelength;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2398 cur += step, i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2399 Py_ssize_t lim = step - 1;
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2400
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2401 if (cur + step >= (size_t)Py_SIZE(self))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2402 lim = Py_SIZE(self) - cur - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2403 memmove(self->ob_item + (cur - i) * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2404 self->ob_item + (cur + 1) * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2405 lim * itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2406 }
72468
3fb9464f9b02 Issue #1621: Fix undefined behaviour from signed overflow in datetime module hashes, array and list iterations, and get_integer (stringlib/string_format.h)
Mark Dickinson <mdickinson@enthought.com>
parents: 72430
diff changeset
2407 cur = start + (size_t)slicelength * step;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2408 if (cur < (size_t)Py_SIZE(self)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2409 memmove(self->ob_item + (cur-slicelength) * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2410 self->ob_item + cur * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2411 (Py_SIZE(self) - cur) * itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2412 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2413 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2414 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2415 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2416 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2417 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2418 Py_ssize_t cur, i;
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2419
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2420 if (needed != slicelength) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2421 PyErr_Format(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2422 "attempt to assign array of size %zd "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2423 "to extended slice of size %zd",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2424 needed, slicelength);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2425 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2426 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2427 for (cur = start, i = 0; i < slicelength;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2428 cur += step, i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2429 memcpy(self->ob_item + cur * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2430 other->ob_item + i * itemsize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2431 itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2432 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2433 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2434 }
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2435 }
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2436
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2437 static PyMappingMethods array_as_mapping = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2438 (lenfunc)array_length,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2439 (binaryfunc)array_subscr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2440 (objobjargproc)array_ass_subscr
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2441 };
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23832
diff changeset
2442
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41434
diff changeset
2443 static const void *emptybuf = "";
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41434
diff changeset
2444
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
2445
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
2446 static int
43423
0476a2cc5658 Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex. Add some more functionality to the memoryview object.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43100
diff changeset
2447 array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2448 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2449 if (view==NULL) goto finish;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
2450
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2451 view->buf = (void *)self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2452 view->obj = (PyObject*)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2453 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2454 if (view->buf == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2455 view->buf = (void *)emptybuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2456 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2457 view->readonly = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2458 view->ndim = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2459 view->itemsize = self->ob_descr->itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2460 view->suboffsets = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2461 view->shape = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2462 if ((flags & PyBUF_ND)==PyBUF_ND) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2463 view->shape = &((Py_SIZE(self)));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2464 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2465 view->strides = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2466 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2467 view->strides = &(view->itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2468 view->format = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2469 view->internal = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2470 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2471 view->format = self->ob_descr->formats;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2472 #ifdef Py_UNICODE_WIDE
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2473 if (self->ob_descr->typecode == 'u') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2474 view->format = "w";
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
2475 }
43555
8e72dacf7f3a Eliminate use of PyBUF_CHARACTER flag which is no longer part of the buffer interface. Fix up array module to export the correct format for wide-builds.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43554
diff changeset
2476 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2477 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
2478
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
2479 finish:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2480 self->ob_exports++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2481 return 0;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2482 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2483
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42540
diff changeset
2484 static void
43423
0476a2cc5658 Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex. Add some more functionality to the memoryview object.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43100
diff changeset
2485 array_buffer_relbuf(arrayobject *self, Py_buffer *view)
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2486 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2487 self->ob_exports--;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2488 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2489
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
2490 static PySequenceMethods array_as_sequence = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2491 (lenfunc)array_length, /*sq_length*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2492 (binaryfunc)array_concat, /*sq_concat*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2493 (ssizeargfunc)array_repeat, /*sq_repeat*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2494 (ssizeargfunc)array_item, /*sq_item*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2495 0, /*sq_slice*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2496 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2497 0, /*sq_ass_slice*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2498 (objobjproc)array_contains, /*sq_contains*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2499 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2500 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2501 };
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2502
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2503 static PyBufferProcs array_as_buffer = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2504 (getbufferproc)array_buffer_getbuf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2505 (releasebufferproc)array_buffer_relbuf
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2506 };
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2507
4628
7df5d4cf8277 Renamed Grandly (I think).
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
2508 static PyObject *
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2509 array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2510 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2511 int c;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2512 PyObject *initial = NULL, *it = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2513 struct arraydescr *descr;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2514
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2515 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2516 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2517
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2518 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2519 return NULL;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2520
87647
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2521 if (initial && c != 'u') {
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2522 if (PyUnicode_Check(initial)) {
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2523 PyErr_Format(PyExc_TypeError, "cannot use a str to initialize "
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2524 "an array with typecode '%c'", c);
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2525 return NULL;
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2526 }
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2527 else if (array_Check(initial) &&
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2528 ((arrayobject*)initial)->ob_descr->typecode == 'u') {
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2529 PyErr_Format(PyExc_TypeError, "cannot use a unicode array to "
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2530 "initialize an array with typecode '%c'", c);
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2531 return NULL;
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2532 }
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2533 }
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2534
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2535 if (!(initial == NULL || PyList_Check(initial)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2536 || PyByteArray_Check(initial)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2537 || PyBytes_Check(initial)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2538 || PyTuple_Check(initial)
67537
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2539 || ((c=='u') && PyUnicode_Check(initial))
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2540 || (array_Check(initial)
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2541 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2542 it = PyObject_GetIter(initial);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2543 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2544 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2545 /* We set initial to NULL so that the subsequent code
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2546 will create an empty array of the appropriate type
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2547 and afterwards we can use array_iter_extend to populate
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2548 the array.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2549 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2550 initial = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2551 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2552 for (descr = descriptors; descr->typecode != '\0'; descr++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2553 if (descr->typecode == c) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2554 PyObject *a;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2555 Py_ssize_t len;
28760
22d177682ae1 SF 686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 28742
diff changeset
2556
67537
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2557 if (initial == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2558 len = 0;
67537
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2559 else if (PyList_Check(initial))
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2560 len = PyList_GET_SIZE(initial);
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2561 else if (PyTuple_Check(initial) || array_Check(initial))
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2562 len = Py_SIZE(initial);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2563 else
67537
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2564 len = 0;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2565
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2566 a = newarrayobject(type, len, descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2567 if (a == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2568 return NULL;
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2569
67537
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2570 if (len > 0 && !array_Check(initial)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2571 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2572 for (i = 0; i < len; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2573 PyObject *v =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2574 PySequence_GetItem(initial, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2575 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2576 Py_DECREF(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2577 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2578 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2579 if (setarrayitem(a, i, v) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2580 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2581 Py_DECREF(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2582 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2583 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2584 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2585 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2586 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2587 else if (initial != NULL && (PyByteArray_Check(initial) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2588 PyBytes_Check(initial))) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2589 PyObject *t_initial, *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2590 t_initial = PyTuple_Pack(1, initial);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2591 if (t_initial == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2592 Py_DECREF(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2593 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2594 }
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63764
diff changeset
2595 v = array_frombytes((arrayobject *)a,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2596 t_initial);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2597 Py_DECREF(t_initial);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2598 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2599 Py_DECREF(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2600 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2601 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2602 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2603 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2604 else if (initial != NULL && PyUnicode_Check(initial)) {
78447
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2605 Py_UNICODE *ustr;
72543
8b4828bcd67a Fix array.array('u') constructor
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72541
diff changeset
2606 Py_ssize_t n;
78447
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2607
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2608 ustr = PyUnicode_AsUnicode(initial);
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2609 if (ustr == NULL) {
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2610 PyErr_NoMemory();
72543
8b4828bcd67a Fix array.array('u') constructor
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72541
diff changeset
2611 Py_DECREF(a);
8b4828bcd67a Fix array.array('u') constructor
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72541
diff changeset
2612 return NULL;
8b4828bcd67a Fix array.array('u') constructor
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72541
diff changeset
2613 }
78447
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2614
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2615 n = PyUnicode_GET_DATA_SIZE(initial);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2616 if (n > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2617 arrayobject *self = (arrayobject *)a;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2618 char *item = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2619 item = (char *)PyMem_Realloc(item, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2620 if (item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2621 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2622 Py_DECREF(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2623 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2624 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2625 self->ob_item = item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2626 Py_SIZE(self) = n / sizeof(Py_UNICODE);
78447
95da47ddebe0 Close #13072: Restore code before the PEP 393 for the array module
Victor Stinner <victor.stinner@gmail.com>
parents: 76105
diff changeset
2627 memcpy(item, ustr, n);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2628 self->allocated = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2629 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2630 }
67537
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2631 else if (initial != NULL && array_Check(initial)) {
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2632 arrayobject *self = (arrayobject *)a;
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2633 arrayobject *other = (arrayobject *)initial;
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2634 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2581a17b29af Issue #5109: array.array constructor will now use fast code when
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66688
diff changeset
2635 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2636 if (it != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2637 if (array_iter_extend((arrayobject *)a, it) == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2638 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2639 Py_DECREF(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2640 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2641 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2642 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2643 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2644 return a;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2645 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2646 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2647 PyErr_SetString(PyExc_ValueError,
72430
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2648 #ifdef HAVE_LONG_LONG
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2649 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2650 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2651 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
72430
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2652 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2653 return NULL;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2654 }
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2655
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2656
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
2657 PyDoc_STRVAR(module_doc,
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2658 "This module defines an object type which can efficiently represent\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2659 an array of basic values: characters, integers, floating point\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2660 numbers. Arrays are sequence types and behave very much like lists,\n\
87647
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2661 except that the type of objects stored in them is constrained.\n");
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2662
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2663 PyDoc_STRVAR(arraytype_doc,
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2664 "array(typecode [, initializer]) -> array\n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2665 \n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2666 Return a new array whose items are restricted by typecode, and\n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2667 initialized from the optional initializer value, which must be a list,\n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2668 string or iterable over elements of the appropriate type.\n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2669 \n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2670 Arrays represent basic values and behave very much like lists, except\n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2671 the type of objects stored in them is constrained. The type is specified\n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2672 at object creation time by using a type code, which is a single character.\n\
2c87d3944c7a Issue #3693: Fix array obscure error message when given a str.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 87092
diff changeset
2673 The following type codes are defined:\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2674 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2675 Type code C Type Minimum size in bytes \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2676 'b' signed integer 1 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2677 'B' unsigned integer 1 \n\
43548
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
2678 'u' Unicode character 2 (see note) \n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2679 'h' signed integer 2 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2680 'H' unsigned integer 2 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2681 'i' signed integer 2 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2682 'I' unsigned integer 2 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2683 'l' signed integer 4 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2684 'L' unsigned integer 4 \n\
72430
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2685 'q' signed integer 8 (see note) \n\
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2686 'Q' unsigned integer 8 (see note) \n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2687 'f' floating point 4 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2688 'd' floating point 8 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2689 \n\
43548
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
2690 NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
2691 narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
2692 \n\
72430
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2693 NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2694 C compiler used to build Python supports 'long long', or, on Windows, \n\
15659e0e2b2e Issue #1172711: Add 'long long' support to the array module.
Meador Inge <meadori@gmail.com>
parents: 71810
diff changeset
2695 '__int64'.\n\
43548
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
2696 \n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2697 Methods:\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2698 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2699 append() -- append a new item to the end of the array\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2700 buffer_info() -- return information giving the current memory info\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2701 byteswap() -- byteswap all the items of the array\n\
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51271
diff changeset
2702 count() -- return number of occurrences of an object\n\
31660
35f56e08727f SF feature request #686323: Minor array module enhancements
Raymond Hettinger <python@rcn.com>
parents: 31659
diff changeset
2703 extend() -- extend array by appending multiple elements from an iterable\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2704 fromfile() -- read items from a file object\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2705 fromlist() -- append items from the list\n\
73092
451fa5782145 Issue #13255: wrong docstrings in array module.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 68257
diff changeset
2706 frombytes() -- append items from the string\n\
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51271
diff changeset
2707 index() -- return index of first occurrence of an object\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2708 insert() -- insert a new item into the array at a provided position\n\
13772
eea51275acbf added count, extend, index, pop and remove to arraymodule
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13651
diff changeset
2709 pop() -- remove and return item (default last)\n\
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51271
diff changeset
2710 remove() -- remove first occurrence of an object\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2711 reverse() -- reverse the order of the items in the array\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2712 tofile() -- write all items to a file object\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2713 tolist() -- return the array converted to an ordinary list\n\
73092
451fa5782145 Issue #13255: wrong docstrings in array module.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 68257
diff changeset
2714 tobytes() -- return the array converted to a string\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2715 \n\
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2716 Attributes:\n\
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2717 \n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2718 typecode -- the typecode character used to create the array\n\
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2719 itemsize -- the length in bytes of one array item\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23433
diff changeset
2720 ");
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2721
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2722 static PyObject *array_iter(arrayobject *ao);
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2723
24283
c0a67a1cab09 Removed more stray instances of statichere, but left _sre.c alone.
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
2724 static PyTypeObject Arraytype = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2725 PyVarObject_HEAD_INIT(NULL, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2726 "array.array",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2727 sizeof(arrayobject),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2728 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2729 (destructor)array_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2730 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2731 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2732 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2733 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2734 (reprfunc)array_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2735 0, /* tp_as_number*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2736 &array_as_sequence, /* tp_as_sequence*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2737 &array_as_mapping, /* tp_as_mapping*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2738 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2739 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2740 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2741 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2742 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2743 &array_as_buffer, /* tp_as_buffer*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2744 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2745 arraytype_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2746 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2747 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2748 array_richcompare, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2749 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2750 (getiterfunc)array_iter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2751 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2752 array_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2753 0, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2754 array_getsets, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2755 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2756 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2757 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2758 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2759 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2760 0, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2761 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2762 array_new, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2763 PyObject_Del, /* tp_free */
9343
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2764 };
4f78504a5f81 Doc strings by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 5982
diff changeset
2765
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2766
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2767 /*********************** Array Iterator **************************/
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2768
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2769 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2770 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2771 Py_ssize_t index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2772 arrayobject *ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2773 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2774 } arrayiterobject;
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2775
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2776 static PyTypeObject PyArrayIter_Type;
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2777
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2778 #define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2779
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2780 static PyObject *
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2781 array_iter(arrayobject *ao)
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2782 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2783 arrayiterobject *it;
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2784
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2785 if (!array_Check(ao)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2786 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2787 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2788 }
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2789
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2790 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2791 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2792 return NULL;
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2793
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2794 Py_INCREF(ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2795 it->ao = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2796 it->index = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2797 it->getitem = ao->ob_descr->getitem;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2798 PyObject_GC_Track(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2799 return (PyObject *)it;
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2800 }
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2801
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2802 static PyObject *
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2803 arrayiter_next(arrayiterobject *it)
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2804 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2805 assert(PyArrayIter_Check(it));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2806 if (it->index < Py_SIZE(it->ao))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2807 return (*it->getitem)(it->ao, it->index++);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2808 return NULL;
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2809 }
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2810
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2811 static void
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2812 arrayiter_dealloc(arrayiterobject *it)
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2813 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2814 PyObject_GC_UnTrack(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2815 Py_XDECREF(it->ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2816 PyObject_GC_Del(it);
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2817 }
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2818
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2819 static int
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2820 arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2821 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2822 Py_VISIT(it->ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2823 return 0;
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2824 }
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2825
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2826 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2827 arrayiter_reduce(arrayiterobject *it)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2828 {
76105
fb907ee4fdfa Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76091
diff changeset
2829 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2830 it->ao, it->index);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2831 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2832
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2833 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2834 arrayiter_setstate(arrayiterobject *it, PyObject *state)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2835 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2836 Py_ssize_t index = PyLong_AsSsize_t(state);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2837 if (index == -1 && PyErr_Occurred())
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2838 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2839 if (index < 0)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2840 index = 0;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2841 it->index = index;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2842 Py_RETURN_NONE;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2843 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2844
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2845 PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2846 static PyMethodDef arrayiter_methods[] = {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2847 {"__reduce__", (PyCFunction)arrayiter_reduce, METH_NOARGS,
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2848 reduce_doc},
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2849 {"__setstate__", (PyCFunction)arrayiter_setstate, METH_O,
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2850 setstate_doc},
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2851 {NULL, NULL} /* sentinel */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2852 };
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2853
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2854 static PyTypeObject PyArrayIter_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2855 PyVarObject_HEAD_INIT(NULL, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2856 "arrayiterator", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2857 sizeof(arrayiterobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2858 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2859 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2860 (destructor)arrayiter_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2861 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2862 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2863 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2864 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2865 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2866 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2867 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2868 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2869 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2870 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2871 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2872 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2873 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2874 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2875 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2876 0, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2877 (traverseproc)arrayiter_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2878 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2879 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2880 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2881 PyObject_SelfIter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2882 (iternextfunc)arrayiter_next, /* tp_iternext */
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 73913
diff changeset
2883 arrayiter_methods, /* tp_methods */
27128
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2884 };
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2885
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2886
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2887 /*********************** Install Module **************************/
047b6e16ab2e SF patch #662433: Fill arraymodule's tp_iter and sq_contains slots
Raymond Hettinger <python@rcn.com>
parents: 27104
diff changeset
2888
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2889 /* No functions in array module. */
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2890 static PyMethodDef a_methods[] = {
55259
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2891 {"_array_reconstructor", array_reconstructor, METH_VARARGS,
edc714ffe6cc Issue #2389: Implement a portable mechanism for pickling array objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55204
diff changeset
2892 PyDoc_STR("Internal. Used for pickling support.")},
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2893 {NULL, NULL, 0, NULL} /* Sentinel */
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2894 };
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2895
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47500
diff changeset
2896 static struct PyModuleDef arraymodule = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2897 PyModuleDef_HEAD_INIT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2898 "array",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2899 module_doc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2900 -1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2901 a_methods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2902 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2903 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2904 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2905 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47500
diff changeset
2906 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47500
diff changeset
2907
22098
966725095854 Patch 520694: arraymodule.c improvements:
Martin v. Löwis <martin@v.loewis.de>
parents: 21313
diff changeset
2908
24471
f66b3a3509c7 Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents: 24424
diff changeset
2909 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47500
diff changeset
2910 PyInit_array(void)
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2911 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2912 PyObject *m;
72489
dacac31460c0 Rename new macros to conform to naming rules (function macros have "Py" prefix, not "PY").
Georg Brandl <georg@python.org>
parents: 72475
diff changeset
2913 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2914 PyObject *typecodes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2915 Py_ssize_t size = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2916 struct arraydescr *descr;
11711
6546ea06e157 Patch from Paul Sokolovsky <Paul.Sokolovsky@technologist.com>:
Fred Drake <fdrake@acm.org>
parents: 11673
diff changeset
2917
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2918 if (PyType_Ready(&Arraytype) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2919 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2920 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2921 m = PyModule_Create(&arraymodule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2922 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2923 return NULL;
22722
ba68dda15df0 Use the PyModule_*() API instead of manipulating the module dictionary
Fred Drake <fdrake@acm.org>
parents: 22124
diff changeset
2924
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2925 Py_INCREF((PyObject *)&Arraytype);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2926 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2927 Py_INCREF((PyObject *)&Arraytype);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2928 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
43548
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
2929
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2930 for (descr=descriptors; descr->typecode != '\0'; descr++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2931 size++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2932 }
43548
fb9d5306f4c7 Fix Issue 1268 with the array module by backing-out the 'w' addition. All builds will continue to use 'u' for unicode.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43423
diff changeset
2933
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72468
diff changeset
2934 p = buffer;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2935 for (descr = descriptors; descr->typecode != '\0'; descr++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2936 *p++ = (char)descr->typecode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2937 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72468
diff changeset
2938 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2939
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72468
diff changeset
2940 PyModule_AddObject(m, "typecodes", typecodes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2941
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2942 if (PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2943 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2944 m = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2945 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58910
diff changeset
2946 return m;
1235
87ed00a62d31 Added new module "array" (for now optional) defining array objects.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2947 }