blob: 03bcaee1007e6718deac39aabc9cb577c2bb0319 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* List object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
5
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00006#ifdef STDC_HEADERS
7#include <stddef.h>
8#else
9#include <sys/types.h> /* For size_t */
10#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Guido van Rossuma46d51d1995-01-26 22:59:43 +000012static int
Fred Drakea2f55112000-07-09 15:16:51 +000013roundupsize(int n)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000014{
Tim Peters65b8b842001-05-26 05:28:40 +000015 unsigned int nbits = 0;
16 unsigned int n2 = (unsigned int)n >> 5;
17
18 /* Round up:
19 * If n < 256, to a multiple of 8.
20 * If n < 2048, to a multiple of 64.
21 * If n < 16384, to a multiple of 512.
22 * If n < 131072, to a multiple of 4096.
23 * If n < 1048576, to a multiple of 32768.
24 * If n < 8388608, to a multiple of 262144.
25 * If n < 67108864, to a multiple of 2097152.
26 * If n < 536870912, to a multiple of 16777216.
27 * ...
28 * If n < 2**(5+3*i), to a multiple of 2**(3*i).
29 *
30 * This over-allocates proportional to the list size, making room
31 * for additional growth. The over-allocation is mild, but is
32 * enough to give linear-time amortized behavior over a long
33 * sequence of appends() in the presence of a poorly-performing
34 * system realloc() (which is a reality, e.g., across all flavors
35 * of Windows, with Win9x behavior being particularly bad -- and
36 * we've still got address space fragmentation problems on Win9x
37 * even with this scheme, although it requires much longer lists to
38 * provoke them than it used to).
39 */
40 do {
41 n2 >>= 3;
42 nbits += 3;
43 } while (n2);
44 return ((n >> nbits) + 1) << nbits;
45 }
Guido van Rossuma46d51d1995-01-26 22:59:43 +000046
Neal Norwitzd4e5be52002-05-22 23:19:17 +000047#define NRESIZE(var, type, nitems) \
48do { \
49 size_t _new_size = roundupsize(nitems); \
50 if (_new_size <= ((~(size_t)0) / sizeof(type))) \
51 PyMem_RESIZE(var, type, _new_size); \
52 else \
53 var = NULL; \
54} while (0)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000055
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000057PyList_New(int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000060 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 return NULL;
64 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000066 /* Check for overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000067 if (nbytes / sizeof(PyObject *) != (size_t)size) {
68 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000069 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000070 op = PyObject_GC_New(PyListObject, &PyList_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071 if (op == NULL) {
Neil Schemenauere83c00e2001-08-29 23:54:21 +000072 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 }
74 if (size <= 0) {
75 op->ob_item = NULL;
76 }
77 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +000078 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079 if (op->ob_item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081 }
Neal Norwitz35fc7602002-06-13 21:11:11 +000082 memset(op->ob_item, 0, sizeof(*op->ob_item) * size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000084 op->ob_size = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000085 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087}
88
89int
Fred Drakea2f55112000-07-09 15:16:51 +000090PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 if (!PyList_Check(op)) {
93 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094 return -1;
95 }
96 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098}
99
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000101
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000103PyList_GetItem(PyObject *op, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 if (!PyList_Check(op)) {
106 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107 return NULL;
108 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000110 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 indexerr = PyString_FromString(
112 "list index out of range");
113 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114 return NULL;
115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117}
118
119int
Fred Drakea2f55112000-07-09 15:16:51 +0000120PyList_SetItem(register PyObject *op, register int i,
121 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 register PyObject *olditem;
124 register PyObject **p;
125 if (!PyList_Check(op)) {
126 Py_XDECREF(newitem);
127 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000128 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
131 Py_XDECREF(newitem);
132 PyErr_SetString(PyExc_IndexError,
133 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000134 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000137 olditem = *p;
138 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 return 0;
141}
142
143static int
Fred Drakea2f55112000-07-09 15:16:51 +0000144ins1(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145{
146 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000148 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000150 return -1;
151 }
Trent Micka5846642000-08-13 22:47:45 +0000152 if (self->ob_size == INT_MAX) {
153 PyErr_SetString(PyExc_OverflowError,
154 "cannot add more objects to list");
155 return -1;
156 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 items = self->ob_item;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 NRESIZE(items, PyObject *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000159 if (items == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000161 return -1;
162 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163 if (where < 0)
164 where = 0;
165 if (where > self->ob_size)
166 where = self->ob_size;
167 for (i = self->ob_size; --i >= where; )
168 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170 items[where] = v;
171 self->ob_item = items;
172 self->ob_size++;
173 return 0;
174}
175
176int
Fred Drakea2f55112000-07-09 15:16:51 +0000177PyList_Insert(PyObject *op, int where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 if (!PyList_Check(op)) {
180 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000181 return -1;
182 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184}
185
186int
Fred Drakea2f55112000-07-09 15:16:51 +0000187PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 if (!PyList_Check(op)) {
190 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000191 return -1;
192 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 return ins1((PyListObject *)op,
194 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195}
196
197/* Methods */
198
199static void
Fred Drakea2f55112000-07-09 15:16:51 +0000200list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201{
202 int i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000203 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000204 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000205 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000206 /* Do it backwards, for Christian Tismer.
207 There's a simple test case where somehow this reduces
208 thrashing when a *very* large list is created and
209 immediately deleted. */
210 i = op->ob_size;
211 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000213 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000214 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000215 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000216 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000217 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218}
219
Guido van Rossum90933611991-06-07 16:10:43 +0000220static int
Fred Drakea2f55112000-07-09 15:16:51 +0000221list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222{
223 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000224
225 i = Py_ReprEnter((PyObject*)op);
226 if (i != 0) {
227 if (i < 0)
228 return i;
229 fprintf(fp, "[...]");
230 return 0;
231 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000233 for (i = 0; i < op->ob_size; i++) {
234 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000236 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
237 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000238 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000239 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 }
241 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000242 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000243 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244}
245
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000247list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000250 PyObject *s, *temp;
251 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000252
253 i = Py_ReprEnter((PyObject*)v);
254 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000255 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000256 }
Tim Petersa7259592001-06-16 05:11:17 +0000257
258 if (v->ob_size == 0) {
259 result = PyString_FromString("[]");
260 goto Done;
261 }
262
263 pieces = PyList_New(0);
264 if (pieces == NULL)
265 goto Done;
266
267 /* Do repr() on each element. Note that this may mutate the list,
268 so must refetch the list size on each iteration. */
269 for (i = 0; i < v->ob_size; ++i) {
270 int status;
271 s = PyObject_Repr(v->ob_item[i]);
272 if (s == NULL)
273 goto Done;
274 status = PyList_Append(pieces, s);
275 Py_DECREF(s); /* append created a new ref */
276 if (status < 0)
277 goto Done;
278 }
279
280 /* Add "[]" decorations to the first and last items. */
281 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000283 if (s == NULL)
284 goto Done;
285 temp = PyList_GET_ITEM(pieces, 0);
286 PyString_ConcatAndDel(&s, temp);
287 PyList_SET_ITEM(pieces, 0, s);
288 if (s == NULL)
289 goto Done;
290
291 s = PyString_FromString("]");
292 if (s == NULL)
293 goto Done;
294 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
295 PyString_ConcatAndDel(&temp, s);
296 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
297 if (temp == NULL)
298 goto Done;
299
300 /* Paste them all together with ", " between. */
301 s = PyString_FromString(", ");
302 if (s == NULL)
303 goto Done;
304 result = _PyString_Join(s, pieces);
305 Py_DECREF(s);
306
307Done:
308 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000309 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000310 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311}
312
313static int
Fred Drakea2f55112000-07-09 15:16:51 +0000314list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315{
316 return a->ob_size;
317}
318
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000319
320
321static int
Fred Drakea2f55112000-07-09 15:16:51 +0000322list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000323{
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000324 int i;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000325
326 for (i = 0; i < a->ob_size; ++i) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000327 int cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
328 Py_EQ);
329 if (cmp > 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000330 return 1;
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000331 else if (cmp < 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000332 return -1;
333 }
334 return 0;
335}
336
337
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000339list_item(PyListObject *a, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340{
341 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000342 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 indexerr = PyString_FromString(
344 "list index out of range");
345 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346 return NULL;
347 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349 return a->ob_item[i];
350}
351
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000353list_slice(PyListObject *a, int ilow, int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356 int i;
357 if (ilow < 0)
358 ilow = 0;
359 else if (ilow > a->ob_size)
360 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361 if (ihigh < ilow)
362 ihigh = ilow;
363 else if (ihigh > a->ob_size)
364 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 if (np == NULL)
367 return NULL;
368 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 PyObject *v = a->ob_item[i];
370 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 np->ob_item[i - ilow] = v;
372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374}
375
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000377PyList_GetSlice(PyObject *a, int ilow, int ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000378{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 if (!PyList_Check(a)) {
380 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000381 return NULL;
382 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000384}
385
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000387list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388{
389 int size;
390 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 PyListObject *np;
392 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000393 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000394 "can only concatenate list (not \"%.200s\") to list",
395 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 return NULL;
397 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000402 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403 }
404 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 PyObject *v = a->ob_item[i];
406 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 np->ob_item[i] = v;
408 }
409 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 PyObject *v = b->ob_item[i];
411 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412 np->ob_item[i + a->ob_size] = v;
413 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415#undef b
416}
417
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000419list_repeat(PyListObject *a, int n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000420{
421 int i, j;
422 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 PyListObject *np;
424 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000425 if (n < 0)
426 n = 0;
427 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000429 if (np == NULL)
430 return NULL;
431 p = np->ob_item;
432 for (i = 0; i < n; i++) {
433 for (j = 0; j < a->ob_size; j++) {
434 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000436 p++;
437 }
438 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000440}
441
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442static int
Fred Drakea2f55112000-07-09 15:16:51 +0000443list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000445 /* Because [X]DECREF can recursively invoke list operations on
446 this list, we must postpone all [X]DECREF activity until
447 after the list is back in its canonical shape. Therefore
448 we must allocate an additional array, 'recycle', into which
449 we temporarily copy the items that are deleted from the
450 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 PyObject **recycle, **p;
452 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 int n; /* Size of replacement list */
454 int d; /* Change in size */
455 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 if (v == NULL)
458 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000461 if (a == b) {
462 /* Special case "a[i:j] = a" -- copy b first */
463 int ret;
464 v = list_slice(b, 0, n);
465 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000467 return ret;
468 }
469 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000470 else {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000471 PyErr_Format(PyExc_TypeError,
472 "must assign list (not \"%.200s\") to slice",
473 v->ob_type->tp_name);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000474 return -1;
475 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476 if (ilow < 0)
477 ilow = 0;
478 else if (ilow > a->ob_size)
479 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480 if (ihigh < ilow)
481 ihigh = ilow;
482 else if (ihigh > a->ob_size)
483 ihigh = a->ob_size;
484 item = a->ob_item;
485 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000486 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000488 else
489 p = recycle = NULL;
490 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000492 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493 if (d < 0) {
494 for (/*k = ihigh*/; k < a->ob_size; k++)
495 item[k+d] = item[k];
496 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 a->ob_item = item;
499 }
500 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000501 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000503 if (item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000504 if (recycle != NULL)
505 PyMem_DEL(recycle);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000507 return -1;
508 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509 for (k = a->ob_size; --k >= ihigh; )
510 item[k+d] = item[k];
511 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000512 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513 a->ob_item = item;
514 a->ob_size += d;
515 }
516 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyObject *w = b->ob_item[k];
518 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519 item[ilow] = w;
520 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000521 if (recycle) {
522 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 Py_XDECREF(*p);
524 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000525 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000526 if (a->ob_size == 0 && a->ob_item != NULL) {
527 PyMem_FREE(a->ob_item);
528 a->ob_item = NULL;
529 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530 return 0;
531#undef b
532}
533
Guido van Rossum234f9421993-06-17 12:35:49 +0000534int
Fred Drakea2f55112000-07-09 15:16:51 +0000535PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000536{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 if (!PyList_Check(a)) {
538 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000539 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000540 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000542}
543
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000544static PyObject *
545list_inplace_repeat(PyListObject *self, int n)
546{
547 PyObject **items;
548 int size, i, j;
549
550
551 size = PyList_GET_SIZE(self);
552 if (size == 0) {
553 Py_INCREF(self);
554 return (PyObject *)self;
555 }
556
557 items = self->ob_item;
558
559 if (n < 1) {
560 self->ob_item = NULL;
561 self->ob_size = 0;
562 for (i = 0; i < size; i++)
563 Py_XDECREF(items[i]);
564 PyMem_DEL(items);
565 Py_INCREF(self);
566 return (PyObject *)self;
567 }
568
569 NRESIZE(items, PyObject*, size*n);
570 if (items == NULL) {
571 PyErr_NoMemory();
572 goto finally;
573 }
574 self->ob_item = items;
575 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
576 for (j = 0; j < size; j++) {
577 PyObject *o = PyList_GET_ITEM(self, j);
578 Py_INCREF(o);
579 PyList_SET_ITEM(self, self->ob_size++, o);
580 }
581 }
582 Py_INCREF(self);
583 return (PyObject *)self;
584 finally:
585 return NULL;
586}
587
Guido van Rossum4a450d01991-04-03 19:05:18 +0000588static int
Fred Drakea2f55112000-07-09 15:16:51 +0000589list_ass_item(PyListObject *a, int i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000590{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000592 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 PyErr_SetString(PyExc_IndexError,
594 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000595 return -1;
596 }
597 if (v == NULL)
598 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000600 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000601 a->ob_item[i] = v;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000603 return 0;
604}
605
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000607ins(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000608{
609 if (ins1(self, where, v) != 0)
610 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 Py_INCREF(Py_None);
612 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613}
614
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000616listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000617{
618 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000620 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000621 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000622 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623}
624
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000626listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627{
Guido van Rossumbf80e541993-02-08 15:49:17 +0000628 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000629}
630
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000631static int
632listextend_internal(PyListObject *self, PyObject *b)
Barry Warsawdedf6d61998-10-09 16:37:25 +0000633{
Barry Warsawdedf6d61998-10-09 16:37:25 +0000634 PyObject **items;
635 int selflen = PyList_GET_SIZE(self);
636 int blen;
637 register int i;
638
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000639 if (PyObject_Size(b) == 0) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000640 /* short circuit when b is empty */
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000641 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000642 return 0;
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000643 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000644
Barry Warsawdedf6d61998-10-09 16:37:25 +0000645 if (self == (PyListObject*)b) {
646 /* as in list_ass_slice() we must special case the
647 * situation: a.extend(a)
648 *
649 * XXX: I think this way ought to be faster than using
650 * list_slice() the way list_ass_slice() does.
651 */
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000652 Py_DECREF(b);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000653 b = PyList_New(selflen);
654 if (!b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000655 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000656 for (i = 0; i < selflen; i++) {
657 PyObject *o = PyList_GET_ITEM(self, i);
658 Py_INCREF(o);
659 PyList_SET_ITEM(b, i, o);
660 }
661 }
Barry Warsawdedf6d61998-10-09 16:37:25 +0000662
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000663 blen = PyObject_Size(b);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000664
Barry Warsawdedf6d61998-10-09 16:37:25 +0000665 /* resize a using idiom */
666 items = self->ob_item;
667 NRESIZE(items, PyObject*, selflen + blen);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000668 if (items == NULL) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000669 PyErr_NoMemory();
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000670 Py_DECREF(b);
671 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000672 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000673
Barry Warsawdedf6d61998-10-09 16:37:25 +0000674 self->ob_item = items;
675
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000676 /* populate the end of self with b's items */
Barry Warsawdedf6d61998-10-09 16:37:25 +0000677 for (i = 0; i < blen; i++) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000678 PyObject *o = PySequence_Fast_GET_ITEM(b, i);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000679 Py_INCREF(o);
680 PyList_SET_ITEM(self, self->ob_size++, o);
681 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000682 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000683 return 0;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000684}
685
686
687static PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000688list_inplace_concat(PyListObject *self, PyObject *other)
689{
Tim Peters1af03e92001-05-26 19:37:54 +0000690 other = PySequence_Fast(other, "argument to += must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000691 if (!other)
692 return NULL;
693
694 if (listextend_internal(self, other) < 0)
695 return NULL;
696
697 Py_INCREF(self);
698 return (PyObject *)self;
699}
700
701static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000702listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000703{
704
Tim Peters1af03e92001-05-26 19:37:54 +0000705 b = PySequence_Fast(b, "list.extend() argument must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000706 if (!b)
707 return NULL;
708
709 if (listextend_internal(self, b) < 0)
710 return NULL;
711
712 Py_INCREF(Py_None);
713 return Py_None;
714}
715
716static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000717listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000718{
719 int i = -1;
720 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000721 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000722 return NULL;
723 if (self->ob_size == 0) {
724 /* Special-case most common failure cause */
725 PyErr_SetString(PyExc_IndexError, "pop from empty list");
726 return NULL;
727 }
728 if (i < 0)
729 i += self->ob_size;
730 if (i < 0 || i >= self->ob_size) {
731 PyErr_SetString(PyExc_IndexError, "pop index out of range");
732 return NULL;
733 }
734 v = self->ob_item[i];
735 Py_INCREF(v);
736 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
737 Py_DECREF(v);
738 return NULL;
739 }
740 return v;
741}
742
Guido van Rossum3f236de1996-12-10 23:55:39 +0000743/* New quicksort implementation for arrays of object pointers.
744 Thanks to discussions with Tim Peters. */
745
746/* CMPERROR is returned by our comparison function when an error
747 occurred. This is the largest negative integer (0x80000000 on a
748 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000749#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000750
751/* Comparison function. Takes care of calling a user-supplied
752 comparison function (any callable Python object). Calls the
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000753 standard comparison function, PyObject_Compare(), if the user-
754 supplied function is NULL. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000755
756static int
Fred Drakea2f55112000-07-09 15:16:51 +0000757docompare(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000758{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 PyObject *args, *res;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000760 int i;
761
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000762 if (compare == NULL) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000763 /* NOTE: we rely on the fact here that the sorting algorithm
764 only ever checks whether k<0, i.e., whether x<y. So we
765 invoke the rich comparison function with Py_LT ('<'), and
766 return -1 when it returns true and 0 when it returns
767 false. */
768 i = PyObject_RichCompareBool(x, y, Py_LT);
769 if (i < 0)
770 return CMPERROR;
771 else
772 return -i;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000773 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000774
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 args = Py_BuildValue("(OO)", x, y);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000776 if (args == NULL)
777 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 res = PyEval_CallObject(compare, args);
779 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000780 if (res == NULL)
781 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 if (!PyInt_Check(res)) {
783 Py_DECREF(res);
784 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000785 "comparison function must return int");
Guido van Rossum3f236de1996-12-10 23:55:39 +0000786 return CMPERROR;
787 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 i = PyInt_AsLong(res);
789 Py_DECREF(res);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000790 if (i < 0)
791 return -1;
792 if (i > 0)
793 return 1;
794 return 0;
795}
796
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000797/* MINSIZE is the smallest array that will get a full-blown samplesort
798 treatment; smaller arrays are sorted using binary insertion. It must
799 be at least 7 for the samplesort implementation to work. Binary
800 insertion does fewer compares, but can suffer O(N**2) data movement.
801 The more expensive compares, the larger MINSIZE should be. */
802#define MINSIZE 100
803
804/* MINPARTITIONSIZE is the smallest array slice samplesort will bother to
805 partition; smaller slices are passed to binarysort. It must be at
806 least 2, and no larger than MINSIZE. Setting it higher reduces the #
807 of compares slowly, but increases the amount of data movement quickly.
808 The value here was chosen assuming a compare costs ~25x more than
809 swapping a pair of memory-resident pointers -- but under that assumption,
810 changing the value by a few dozen more or less has aggregate effect
811 under 1%. So the value is crucial, but not touchy <wink>. */
812#define MINPARTITIONSIZE 40
813
814/* MAXMERGE is the largest number of elements we'll always merge into
815 a known-to-be sorted chunk via binary insertion, regardless of the
816 size of that chunk. Given a chunk of N sorted elements, and a group
817 of K unknowns, the largest K for which it's better to do insertion
818 (than a full-blown sort) is a complicated function of N and K mostly
819 involving the expected number of compares and data moves under each
820 approach, and the relative cost of those operations on a specific
821 architecure. The fixed value here is conservative, and should be a
822 clear win regardless of architecture or N. */
823#define MAXMERGE 15
Guido van Rossum3f236de1996-12-10 23:55:39 +0000824
Guido van Rossum3f236de1996-12-10 23:55:39 +0000825/* STACKSIZE is the size of our work stack. A rough estimate is that
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000826 this allows us to sort arrays of size N where
827 N / ln(N) = MINPARTITIONSIZE * 2**STACKSIZE, so 60 is more than enough
828 for arrays of size 2**64. Because we push the biggest partition
829 first, the worst case occurs when all subarrays are always partitioned
830 exactly in two. */
831#define STACKSIZE 60
Guido van Rossum3f236de1996-12-10 23:55:39 +0000832
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000833
834#define SETK(X,Y) if ((k = docompare(X,Y,compare))==CMPERROR) goto fail
835
836/* binarysort is the best method for sorting small arrays: it does
837 few compares, but can do data movement quadratic in the number of
838 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000839 [lo, hi) is a contiguous slice of a list, and is sorted via
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000840 binary insertion.
841 On entry, must have lo <= start <= hi, and that [lo, start) is already
842 sorted (pass start == lo if you don't know!).
843 If docompare complains (returns CMPERROR) return -1, else 0.
844 Even in case of error, the output slice will be some permutation of
845 the input (nothing is lost or duplicated).
846*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000847
848static int
Fred Drakea2f55112000-07-09 15:16:51 +0000849binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
850 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000851{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000852 /* assert lo <= start <= hi
853 assert [lo, start) is sorted */
854 register int k;
855 register PyObject **l, **p, **r;
856 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000857
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000858 if (lo == start)
859 ++start;
860 for (; start < hi; ++start) {
861 /* set l to where *start belongs */
862 l = lo;
863 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000864 pivot = *r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000865 do {
866 p = l + ((r - l) >> 1);
867 SETK(pivot, *p);
868 if (k < 0)
869 r = p;
870 else
871 l = p + 1;
872 } while (l < r);
873 /* Pivot should go at l -- slide over to make room.
874 Caution: using memmove is much slower under MSVC 5;
875 we're not usually moving many slots. */
876 for (p = start; p > l; --p)
877 *p = *(p-1);
878 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000879 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000880 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000881
882 fail:
883 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000884}
885
886/* samplesortslice is the sorting workhorse.
Guido van Rossum42812581998-06-17 14:15:44 +0000887 [lo, hi) is a contiguous slice of a list, to be sorted in place.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000888 On entry, must have lo <= hi,
889 If docompare complains (returns CMPERROR) return -1, else 0.
890 Even in case of error, the output slice will be some permutation of
891 the input (nothing is lost or duplicated).
892
893 samplesort is basically quicksort on steroids: a power of 2 close
894 to n/ln(n) is computed, and that many elements (less 1) are picked at
895 random from the array and sorted. These 2**k - 1 elements are then
896 used as preselected pivots for an equal number of quicksort
897 partitioning steps, partitioning the slice into 2**k chunks each of
898 size about ln(n). These small final chunks are then usually handled
899 by binarysort. Note that when k=1, this is roughly the same as an
900 ordinary quicksort using a random pivot, and when k=2 this is roughly
901 a median-of-3 quicksort. From that view, using k ~= lg(n/ln(n)) makes
902 this a "median of n/ln(n)" quicksort. You can also view it as a kind
903 of bucket sort, where 2**k-1 bucket boundaries are picked dynamically.
904
905 The large number of samples makes a quadratic-time case almost
906 impossible, and asymptotically drives the average-case number of
907 compares from quicksort's 2 N ln N (or 12/7 N ln N for the median-of-
908 3 variant) down to N lg N.
909
910 We also play lots of low-level tricks to cut the number of compares.
911
912 Very obscure: To avoid using extra memory, the PPs are stored in the
913 array and shuffled around as partitioning proceeds. At the start of a
914 partitioning step, we'll have 2**m-1 (for some m) PPs in sorted order,
915 adjacent (either on the left or the right!) to a chunk of X elements
916 that are to be partitioned: P X or X P. In either case we need to
917 shuffle things *in place* so that the 2**(m-1) smaller PPs are on the
918 left, followed by the PP to be used for this step (that's the middle
919 of the PPs), followed by X, followed by the 2**(m-1) larger PPs:
920 P X or X P -> Psmall pivot X Plarge
921 and the order of the PPs must not be altered. It can take a while
922 to realize this isn't trivial! It can take even longer <wink> to
923 understand why the simple code below works, using only 2**(m-1) swaps.
924 The key is that the order of the X elements isn't necessarily
925 preserved: X can end up as some cyclic permutation of its original
926 order. That's OK, because X is unsorted anyway. If the order of X
927 had to be preserved too, the simplest method I know of using O(1)
928 scratch storage requires len(X) + 2**(m-1) swaps, spread over 2 passes.
929 Since len(X) is typically several times larger than 2**(m-1), that
930 would slow things down.
931*/
932
933struct SamplesortStackNode {
934 /* Represents a slice of the array, from (& including) lo up
935 to (but excluding) hi. "extra" additional & adjacent elements
936 are pre-selected pivots (PPs), spanning [lo-extra, lo) if
937 extra > 0, or [hi, hi-extra) if extra < 0. The PPs are
938 already sorted, but nothing is known about the other elements
939 in [lo, hi). |extra| is always one less than a power of 2.
940 When extra is 0, we're out of PPs, and the slice must be
941 sorted by some other means. */
942 PyObject **lo;
943 PyObject **hi;
944 int extra;
945};
946
947/* The number of PPs we want is 2**k - 1, where 2**k is as close to
Guido van Rossum42812581998-06-17 14:15:44 +0000948 N / ln(N) as possible. So k ~= lg(N / ln(N)). Calling libm routines
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000949 is undesirable, so cutoff values are canned in the "cutoff" table
950 below: cutoff[i] is the smallest N such that k == CUTOFFBASE + i. */
951#define CUTOFFBASE 4
Guido van Rossum3aa23fd1999-01-14 19:01:53 +0000952static long cutoff[] = {
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000953 43, /* smallest N such that k == 4 */
954 106, /* etc */
955 250,
956 576,
957 1298,
958 2885,
959 6339,
960 13805,
961 29843,
962 64116,
963 137030,
964 291554,
965 617916,
966 1305130,
967 2748295,
968 5771662,
969 12091672,
970 25276798,
971 52734615,
972 109820537,
973 228324027,
974 473977813,
975 982548444, /* smallest N such that k == 26 */
976 2034159050 /* largest N that fits in signed 32-bit; k == 27 */
977};
978
979static int
Fred Drakea2f55112000-07-09 15:16:51 +0000980samplesortslice(PyObject **lo, PyObject **hi, PyObject *compare)
981 /* compare -- comparison function object, or NULL for default */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000982{
983 register PyObject **l, **r;
984 register PyObject *tmp, *pivot;
985 register int k;
986 int n, extra, top, extraOnRight;
987 struct SamplesortStackNode stack[STACKSIZE];
988
989 /* assert lo <= hi */
990 n = hi - lo;
991
992 /* ----------------------------------------------------------
993 * Special cases
994 * --------------------------------------------------------*/
995 if (n < 2)
996 return 0;
997
998 /* Set r to the largest value such that [lo,r) is sorted.
999 This catches the already-sorted case, the all-the-same
1000 case, and the appended-a-few-elements-to-a-sorted-list case.
1001 If the array is unsorted, we're very likely to get out of
1002 the loop fast, so the test is cheap if it doesn't pay off.
1003 */
1004 /* assert lo < hi */
1005 for (r = lo+1; r < hi; ++r) {
1006 SETK(*r, *(r-1));
1007 if (k < 0)
1008 break;
1009 }
1010 /* [lo,r) is sorted, [r,hi) unknown. Get out cheap if there are
1011 few unknowns, or few elements in total. */
1012 if (hi - r <= MAXMERGE || n < MINSIZE)
Guido van Rossum42812581998-06-17 14:15:44 +00001013 return binarysort(lo, hi, r, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001014
1015 /* Check for the array already being reverse-sorted. Typical
1016 benchmark-driven silliness <wink>. */
1017 /* assert lo < hi */
1018 for (r = lo+1; r < hi; ++r) {
1019 SETK(*(r-1), *r);
1020 if (k < 0)
1021 break;
1022 }
1023 if (hi - r <= MAXMERGE) {
1024 /* Reverse the reversed prefix, then insert the tail */
1025 PyObject **originalr = r;
1026 l = lo;
1027 do {
1028 --r;
1029 tmp = *l; *l = *r; *r = tmp;
1030 ++l;
1031 } while (l < r);
Guido van Rossum42812581998-06-17 14:15:44 +00001032 return binarysort(lo, hi, originalr, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001033 }
1034
1035 /* ----------------------------------------------------------
1036 * Normal case setup: a large array without obvious pattern.
1037 * --------------------------------------------------------*/
1038
1039 /* extra := a power of 2 ~= n/ln(n), less 1.
1040 First find the smallest extra s.t. n < cutoff[extra] */
1041 for (extra = 0;
1042 extra < sizeof(cutoff) / sizeof(cutoff[0]);
1043 ++extra) {
1044 if (n < cutoff[extra])
1045 break;
1046 /* note that if we fall out of the loop, the value of
1047 extra still makes *sense*, but may be smaller than
1048 we would like (but the array has more than ~= 2**31
1049 elements in this case!) */
1050 }
1051 /* Now k == extra - 1 + CUTOFFBASE. The smallest value k can
1052 have is CUTOFFBASE-1, so
1053 assert MINSIZE >= 2**(CUTOFFBASE-1) - 1 */
1054 extra = (1 << (extra - 1 + CUTOFFBASE)) - 1;
1055 /* assert extra > 0 and n >= extra */
1056
1057 /* Swap that many values to the start of the array. The
1058 selection of elements is pseudo-random, but the same on
1059 every run (this is intentional! timing algorithm changes is
1060 a pain if timing varies across runs). */
1061 {
1062 unsigned int seed = n / extra; /* arbitrary */
1063 unsigned int i;
1064 for (i = 0; i < (unsigned)extra; ++i) {
1065 /* j := random int in [i, n) */
1066 unsigned int j;
1067 seed = seed * 69069 + 7;
1068 j = i + seed % (n - i);
1069 tmp = lo[i]; lo[i] = lo[j]; lo[j] = tmp;
1070 }
1071 }
1072
1073 /* Recursively sort the preselected pivots. */
Guido van Rossum42812581998-06-17 14:15:44 +00001074 if (samplesortslice(lo, lo + extra, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001075 goto fail;
1076
1077 top = 0; /* index of available stack slot */
1078 lo += extra; /* point to first unknown */
1079 extraOnRight = 0; /* the PPs are at the left end */
1080
1081 /* ----------------------------------------------------------
1082 * Partition [lo, hi), and repeat until out of work.
1083 * --------------------------------------------------------*/
1084 for (;;) {
1085 /* assert lo <= hi, so n >= 0 */
1086 n = hi - lo;
1087
1088 /* We may not want, or may not be able, to partition:
1089 If n is small, it's quicker to insert.
1090 If extra is 0, we're out of pivots, and *must* use
1091 another method.
1092 */
1093 if (n < MINPARTITIONSIZE || extra == 0) {
1094 if (n >= MINSIZE) {
1095 /* assert extra == 0
1096 This is rare, since the average size
1097 of a final block is only about
1098 ln(original n). */
Guido van Rossum42812581998-06-17 14:15:44 +00001099 if (samplesortslice(lo, hi, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001100 goto fail;
1101 }
1102 else {
1103 /* Binary insertion should be quicker,
1104 and we can take advantage of the PPs
1105 already being sorted. */
1106 if (extraOnRight && extra) {
1107 /* swap the PPs to the left end */
1108 k = extra;
1109 do {
1110 tmp = *lo;
1111 *lo = *hi;
1112 *hi = tmp;
1113 ++lo; ++hi;
1114 } while (--k);
1115 }
1116 if (binarysort(lo - extra, hi, lo,
Guido van Rossum42812581998-06-17 14:15:44 +00001117 compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001118 goto fail;
1119 }
1120
1121 /* Find another slice to work on. */
1122 if (--top < 0)
1123 break; /* no more -- done! */
1124 lo = stack[top].lo;
1125 hi = stack[top].hi;
1126 extra = stack[top].extra;
1127 extraOnRight = 0;
1128 if (extra < 0) {
1129 extraOnRight = 1;
1130 extra = -extra;
1131 }
1132 continue;
1133 }
1134
1135 /* Pretend the PPs are indexed 0, 1, ..., extra-1.
1136 Then our preselected pivot is at (extra-1)/2, and we
1137 want to move the PPs before that to the left end of
1138 the slice, and the PPs after that to the right end.
1139 The following section changes extra, lo, hi, and the
1140 slice such that:
1141 [lo-extra, lo) contains the smaller PPs.
1142 *lo == our PP.
1143 (lo, hi) contains the unknown elements.
1144 [hi, hi+extra) contains the larger PPs.
1145 */
1146 k = extra >>= 1; /* num PPs to move */
1147 if (extraOnRight) {
1148 /* Swap the smaller PPs to the left end.
1149 Note that this loop actually moves k+1 items:
1150 the last is our PP */
1151 do {
1152 tmp = *lo; *lo = *hi; *hi = tmp;
1153 ++lo; ++hi;
1154 } while (k--);
1155 }
1156 else {
1157 /* Swap the larger PPs to the right end. */
1158 while (k--) {
1159 --lo; --hi;
1160 tmp = *lo; *lo = *hi; *hi = tmp;
1161 }
1162 }
1163 --lo; /* *lo is now our PP */
1164 pivot = *lo;
1165
1166 /* Now an almost-ordinary quicksort partition step.
1167 Note that most of the time is spent here!
1168 Only odd thing is that we partition into < and >=,
1169 instead of the usual <= and >=. This helps when
1170 there are lots of duplicates of different values,
1171 because it eventually tends to make subfiles
1172 "pure" (all duplicates), and we special-case for
1173 duplicates later. */
1174 l = lo + 1;
1175 r = hi - 1;
1176 /* assert lo < l < r < hi (small n weeded out above) */
1177
1178 do {
1179 /* slide l right, looking for key >= pivot */
1180 do {
1181 SETK(*l, pivot);
1182 if (k < 0)
1183 ++l;
1184 else
1185 break;
1186 } while (l < r);
1187
1188 /* slide r left, looking for key < pivot */
1189 while (l < r) {
Guido van Rossum42812581998-06-17 14:15:44 +00001190 register PyObject *rval = *r--;
1191 SETK(rval, pivot);
1192 if (k < 0) {
1193 /* swap and advance */
1194 r[1] = *l;
1195 *l++ = rval;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001196 break;
Guido van Rossum42812581998-06-17 14:15:44 +00001197 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001198 }
1199
1200 } while (l < r);
1201
1202 /* assert lo < r <= l < hi
1203 assert r == l or r+1 == l
1204 everything to the left of l is < pivot, and
1205 everything to the right of r is >= pivot */
1206
1207 if (l == r) {
1208 SETK(*r, pivot);
1209 if (k < 0)
1210 ++l;
1211 else
1212 --r;
1213 }
1214 /* assert lo <= r and r+1 == l and l <= hi
1215 assert r == lo or a[r] < pivot
1216 assert a[lo] is pivot
1217 assert l == hi or a[l] >= pivot
1218 Swap the pivot into "the middle", so we can henceforth
1219 ignore it.
1220 */
1221 *lo = *r;
1222 *r = pivot;
1223
1224 /* The following is true now, & will be preserved:
1225 All in [lo,r) are < pivot
1226 All in [r,l) == pivot (& so can be ignored)
1227 All in [l,hi) are >= pivot */
1228
1229 /* Check for duplicates of the pivot. One compare is
1230 wasted if there are no duplicates, but can win big
1231 when there are.
1232 Tricky: we're sticking to "<" compares, so deduce
1233 equality indirectly. We know pivot <= *l, so they're
1234 equal iff not pivot < *l.
1235 */
1236 while (l < hi) {
1237 /* pivot <= *l known */
1238 SETK(pivot, *l);
1239 if (k < 0)
1240 break;
1241 else
1242 /* <= and not < implies == */
1243 ++l;
1244 }
1245
1246 /* assert lo <= r < l <= hi
1247 Partitions are [lo, r) and [l, hi) */
1248
1249 /* push fattest first; remember we still have extra PPs
1250 to the left of the left chunk and to the right of
1251 the right chunk! */
1252 /* assert top < STACKSIZE */
1253 if (r - lo <= hi - l) {
1254 /* second is bigger */
1255 stack[top].lo = l;
1256 stack[top].hi = hi;
1257 stack[top].extra = -extra;
1258 hi = r;
1259 extraOnRight = 0;
1260 }
1261 else {
1262 /* first is bigger */
1263 stack[top].lo = lo;
1264 stack[top].hi = r;
1265 stack[top].extra = extra;
1266 lo = l;
1267 extraOnRight = 1;
1268 }
1269 ++top;
1270
1271 } /* end of partitioning loop */
1272
1273 return 0;
1274
1275 fail:
1276 return -1;
1277}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001278
1279#undef SETK
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001280
1281staticforward PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001282
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001284listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001285{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001286 int err;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001287 PyObject *compare = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001288 PyTypeObject *savetype;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001289
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001290 if (args != NULL) {
Guido van Rossumc00a9382000-02-24 21:48:29 +00001291 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001292 return NULL;
1293 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001294 savetype = self->ob_type;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001295 self->ob_type = &immutable_list_type;
1296 err = samplesortslice(self->ob_item,
1297 self->ob_item + self->ob_size,
Guido van Rossum42812581998-06-17 14:15:44 +00001298 compare);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001299 self->ob_type = savetype;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001300 if (err < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001301 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 Py_INCREF(Py_None);
1303 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001304}
1305
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001306int
Fred Drakea2f55112000-07-09 15:16:51 +00001307PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001308{
1309 if (v == NULL || !PyList_Check(v)) {
1310 PyErr_BadInternalCall();
1311 return -1;
1312 }
1313 v = listsort((PyListObject *)v, (PyObject *)NULL);
1314 if (v == NULL)
1315 return -1;
1316 Py_DECREF(v);
1317 return 0;
1318}
1319
Guido van Rossumb86c5492001-02-12 22:06:02 +00001320static void
1321_listreverse(PyListObject *self)
Guido van Rossumed98d481991-03-06 13:07:53 +00001322{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 register PyObject **p, **q;
1324 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +00001325
Guido van Rossumed98d481991-03-06 13:07:53 +00001326 if (self->ob_size > 1) {
1327 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
Guido van Rossumb86c5492001-02-12 22:06:02 +00001328 p < q;
1329 p++, q--)
1330 {
Guido van Rossumed98d481991-03-06 13:07:53 +00001331 tmp = *p;
1332 *p = *q;
1333 *q = tmp;
1334 }
1335 }
Guido van Rossumb86c5492001-02-12 22:06:02 +00001336}
1337
1338static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001339listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00001340{
Guido van Rossumb86c5492001-02-12 22:06:02 +00001341 _listreverse(self);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 Py_INCREF(Py_None);
1343 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001344}
1345
Guido van Rossum84c76f51990-10-30 13:32:20 +00001346int
Fred Drakea2f55112000-07-09 15:16:51 +00001347PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001348{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 if (v == NULL || !PyList_Check(v)) {
1350 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001351 return -1;
1352 }
Guido van Rossumb86c5492001-02-12 22:06:02 +00001353 _listreverse((PyListObject *)v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001354 return 0;
1355}
1356
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001358PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001359{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 PyObject *w;
1361 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001362 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 if (v == NULL || !PyList_Check(v)) {
1364 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001365 return NULL;
1366 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 n = ((PyListObject *)v)->ob_size;
1368 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001369 if (w == NULL)
1370 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001372 memcpy((void *)p,
1373 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001375 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001377 p++;
1378 }
1379 return w;
1380}
1381
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001383listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001384{
1385 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001386
Guido van Rossumed98d481991-03-06 13:07:53 +00001387 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001388 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1389 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001391 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001392 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001393 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001395 return NULL;
1396}
1397
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001399listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001400{
1401 int count = 0;
1402 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001403
Guido van Rossume6f7d181991-10-20 20:20:40 +00001404 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001405 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1406 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001407 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001408 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001409 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001410 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001412}
1413
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001415listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001416{
1417 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001418
Guido van Rossumed98d481991-03-06 13:07:53 +00001419 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001420 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1421 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001422 if (list_ass_slice(self, i, i+1,
1423 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001424 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 Py_INCREF(Py_None);
1426 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001427 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001428 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001429 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001430 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001432 return NULL;
1433}
1434
Jeremy Hylton8caad492000-06-23 14:18:11 +00001435static int
1436list_traverse(PyListObject *o, visitproc visit, void *arg)
1437{
1438 int i, err;
1439 PyObject *x;
1440
1441 for (i = o->ob_size; --i >= 0; ) {
1442 x = o->ob_item[i];
1443 if (x != NULL) {
1444 err = visit(x, arg);
1445 if (err)
1446 return err;
1447 }
1448 }
1449 return 0;
1450}
1451
1452static int
1453list_clear(PyListObject *lp)
1454{
1455 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1456 return 0;
1457}
1458
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001459static PyObject *
1460list_richcompare(PyObject *v, PyObject *w, int op)
1461{
1462 PyListObject *vl, *wl;
1463 int i;
1464
1465 if (!PyList_Check(v) || !PyList_Check(w)) {
1466 Py_INCREF(Py_NotImplemented);
1467 return Py_NotImplemented;
1468 }
1469
1470 vl = (PyListObject *)v;
1471 wl = (PyListObject *)w;
1472
1473 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1474 /* Shortcut: if the lengths differ, the lists differ */
1475 PyObject *res;
1476 if (op == Py_EQ)
1477 res = Py_False;
1478 else
1479 res = Py_True;
1480 Py_INCREF(res);
1481 return res;
1482 }
1483
1484 /* Search for the first index where items are different */
1485 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1486 int k = PyObject_RichCompareBool(vl->ob_item[i],
1487 wl->ob_item[i], Py_EQ);
1488 if (k < 0)
1489 return NULL;
1490 if (!k)
1491 break;
1492 }
1493
1494 if (i >= vl->ob_size || i >= wl->ob_size) {
1495 /* No more items to compare -- compare sizes */
1496 int vs = vl->ob_size;
1497 int ws = wl->ob_size;
1498 int cmp;
1499 PyObject *res;
1500 switch (op) {
1501 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001502 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001503 case Py_EQ: cmp = vs == ws; break;
1504 case Py_NE: cmp = vs != ws; break;
1505 case Py_GT: cmp = vs > ws; break;
1506 case Py_GE: cmp = vs >= ws; break;
1507 default: return NULL; /* cannot happen */
1508 }
1509 if (cmp)
1510 res = Py_True;
1511 else
1512 res = Py_False;
1513 Py_INCREF(res);
1514 return res;
1515 }
1516
1517 /* We have an item that differs -- shortcuts for EQ/NE */
1518 if (op == Py_EQ) {
1519 Py_INCREF(Py_False);
1520 return Py_False;
1521 }
1522 if (op == Py_NE) {
1523 Py_INCREF(Py_True);
1524 return Py_True;
1525 }
1526
1527 /* Compare the final item again using the proper operator */
1528 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1529}
1530
Tim Peters6d6c1a32001-08-02 04:15:00 +00001531/* Adapted from newer code by Tim */
1532static int
1533list_fill(PyListObject *result, PyObject *v)
1534{
1535 PyObject *it; /* iter(v) */
1536 int n; /* guess for result list size */
1537 int i;
1538
1539 n = result->ob_size;
1540
1541 /* Special-case list(a_list), for speed. */
1542 if (PyList_Check(v)) {
1543 if (v == (PyObject *)result)
1544 return 0; /* source is destination, we're done */
1545 return list_ass_slice(result, 0, n, v);
1546 }
1547
1548 /* Empty previous contents */
1549 if (n != 0) {
1550 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1551 return -1;
1552 }
1553
1554 /* Get iterator. There may be some low-level efficiency to be gained
1555 * by caching the tp_iternext slot instead of using PyIter_Next()
1556 * later, but premature optimization is the root etc.
1557 */
1558 it = PyObject_GetIter(v);
1559 if (it == NULL)
1560 return -1;
1561
1562 /* Guess a result list size. */
1563 n = -1; /* unknown */
1564 if (PySequence_Check(v) &&
1565 v->ob_type->tp_as_sequence->sq_length) {
1566 n = PySequence_Size(v);
1567 if (n < 0)
1568 PyErr_Clear();
1569 }
1570 if (n < 0)
1571 n = 8; /* arbitrary */
1572 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001573 if (result->ob_item == NULL) {
1574 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001575 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001576 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00001577 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001578 result->ob_size = n;
1579
1580 /* Run iterator to exhaustion. */
1581 for (i = 0; ; i++) {
1582 PyObject *item = PyIter_Next(it);
1583 if (item == NULL) {
1584 if (PyErr_Occurred())
1585 goto error;
1586 break;
1587 }
1588 if (i < n)
1589 PyList_SET_ITEM(result, i, item); /* steals ref */
1590 else {
1591 int status = ins1(result, result->ob_size, item);
1592 Py_DECREF(item); /* append creates a new ref */
1593 if (status < 0)
1594 goto error;
1595 }
1596 }
1597
1598 /* Cut back result list if initial guess was too large. */
1599 if (i < n && result != NULL) {
1600 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
1601 goto error;
1602 }
1603 Py_DECREF(it);
1604 return 0;
1605
1606 error:
1607 Py_DECREF(it);
1608 return -1;
1609}
1610
1611static int
1612list_init(PyListObject *self, PyObject *args, PyObject *kw)
1613{
1614 PyObject *arg = NULL;
1615 static char *kwlist[] = {"sequence", 0};
1616
1617 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
1618 return -1;
1619 if (arg != NULL)
1620 return list_fill(self, arg);
1621 if (self->ob_size > 0)
1622 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
1623 return 0;
1624}
1625
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001626static long
1627list_nohash(PyObject *self)
1628{
1629 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
1630 return -1;
1631}
1632
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001633PyDoc_STRVAR(append_doc,
1634"L.append(object) -- append object to end");
1635PyDoc_STRVAR(extend_doc,
1636"L.extend(list) -- extend list by appending list elements");
1637PyDoc_STRVAR(insert_doc,
1638"L.insert(index, object) -- insert object before index");
1639PyDoc_STRVAR(pop_doc,
1640"L.pop([index]) -> item -- remove and return item at index (default last)");
1641PyDoc_STRVAR(remove_doc,
1642"L.remove(value) -- remove first occurrence of value");
1643PyDoc_STRVAR(index_doc,
1644"L.index(value) -> integer -- return index of first occurrence of value");
1645PyDoc_STRVAR(count_doc,
1646"L.count(value) -> integer -- return number of occurrences of value");
1647PyDoc_STRVAR(reverse_doc,
1648"L.reverse() -- reverse *IN PLACE*");
1649PyDoc_STRVAR(sort_doc,
1650"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001651
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001653 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001654 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001655 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001656 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001657 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
1658 {"index", (PyCFunction)listindex, METH_O, index_doc},
1659 {"count", (PyCFunction)listcount, METH_O, count_doc},
1660 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001661 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001662 {NULL, NULL} /* sentinel */
1663};
1664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001666 (inquiry)list_length, /* sq_length */
1667 (binaryfunc)list_concat, /* sq_concat */
1668 (intargfunc)list_repeat, /* sq_repeat */
1669 (intargfunc)list_item, /* sq_item */
1670 (intintargfunc)list_slice, /* sq_slice */
1671 (intobjargproc)list_ass_item, /* sq_ass_item */
1672 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
1673 (objobjproc)list_contains, /* sq_contains */
1674 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
1675 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001676};
1677
Neal Norwitz2c2e8272002-06-14 02:04:18 +00001678PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001679"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00001680"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001681
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001682staticforward PyObject * list_iter(PyObject *seq);
1683
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001684static PyObject*
1685list_subscript(PyListObject* self, PyObject* item)
1686{
1687 if (PyInt_Check(item)) {
1688 long i = PyInt_AS_LONG(item);
1689 if (i < 0)
1690 i += PyList_GET_SIZE(self);
1691 return list_item(self, i);
1692 }
1693 else if (PyLong_Check(item)) {
1694 long i = PyLong_AsLong(item);
1695 if (i == -1 && PyErr_Occurred())
1696 return NULL;
1697 if (i < 0)
1698 i += PyList_GET_SIZE(self);
1699 return list_item(self, i);
1700 }
1701 else if (PySlice_Check(item)) {
1702 int start, stop, step, slicelength, cur, i;
1703 PyObject* result;
1704 PyObject* it;
1705
1706 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1707 &start, &stop, &step, &slicelength) < 0) {
1708 return NULL;
1709 }
1710
1711 if (slicelength <= 0) {
1712 return PyList_New(0);
1713 }
1714 else {
1715 result = PyList_New(slicelength);
1716 if (!result) return NULL;
1717
1718 for (cur = start, i = 0; i < slicelength;
1719 cur += step, i++) {
1720 it = PyList_GET_ITEM(self, cur);
1721 Py_INCREF(it);
1722 PyList_SET_ITEM(result, i, it);
1723 }
1724
1725 return result;
1726 }
1727 }
1728 else {
1729 PyErr_SetString(PyExc_TypeError,
1730 "list indices must be integers");
1731 return NULL;
1732 }
1733}
1734
1735static int
1736list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
1737{
1738 if (PyInt_Check(item)) {
1739 long i = PyInt_AS_LONG(item);
1740 if (i < 0)
1741 i += PyList_GET_SIZE(self);
1742 return list_ass_item(self, i, value);
1743 }
1744 else if (PyLong_Check(item)) {
1745 long i = PyLong_AsLong(item);
1746 if (i == -1 && PyErr_Occurred())
1747 return -1;
1748 if (i < 0)
1749 i += PyList_GET_SIZE(self);
1750 return list_ass_item(self, i, value);
1751 }
1752 else if (PySlice_Check(item)) {
1753 int start, stop, step, slicelength;
1754
1755 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1756 &start, &stop, &step, &slicelength) < 0) {
1757 return -1;
1758 }
1759
1760 if (value == NULL) {
1761 /* delete slice */
1762 PyObject **garbage, **item;
1763 int cur, i, j;
1764
1765 if (slicelength <= 0)
1766 return 0;
1767
1768 if (step < 0) {
1769 stop = start + 1;
1770 start = stop + step*(slicelength - 1) - 1;
1771 step = -step;
1772 }
1773
1774 garbage = (PyObject**)
1775 PyMem_MALLOC(slicelength*sizeof(PyObject*));
1776
1777 /* drawing pictures might help
1778 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00001779 for (cur = start, i = 0;
1780 cur < stop;
1781 cur += step, i++)
1782 {
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001783 garbage[i] = PyList_GET_ITEM(self, cur);
1784
1785 for (j = 0; j < step; j++) {
1786 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00001787 PyList_GET_ITEM(self,
1788 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001789 }
1790 }
1791 for (cur = start + slicelength*step + 1;
1792 cur < self->ob_size; cur++) {
1793 PyList_SET_ITEM(self, cur - slicelength,
1794 PyList_GET_ITEM(self, cur));
1795 }
1796 self->ob_size -= slicelength;
1797 item = self->ob_item;
1798 NRESIZE(item, PyObject*, self->ob_size);
1799 self->ob_item = item;
1800
1801 for (i = 0; i < slicelength; i++) {
1802 Py_DECREF(garbage[i]);
1803 }
1804 PyMem_FREE(garbage);
1805
1806 return 0;
1807 }
1808 else {
1809 /* assign slice */
1810 PyObject **garbage, *ins;
1811 int cur, i;
1812
1813 if (!PyList_Check(value)) {
1814 PyErr_Format(PyExc_TypeError,
1815 "must assign list (not \"%.200s\") to slice",
1816 value->ob_type->tp_name);
1817 return -1;
1818 }
1819
1820 if (PyList_GET_SIZE(value) != slicelength) {
1821 PyErr_Format(PyExc_ValueError,
1822 "attempt to assign list of size %d to extended slice of size %d",
1823 PyList_Size(value), slicelength);
1824 return -1;
1825 }
1826
1827 if (!slicelength)
1828 return 0;
1829
1830 /* protect against a[::-1] = a */
1831 if (self == (PyListObject*)value) {
1832 value = list_slice((PyListObject*)value, 0,
1833 PyList_GET_SIZE(value));
1834 }
1835 else {
1836 Py_INCREF(value);
1837 }
1838
1839 garbage = (PyObject**)
1840 PyMem_MALLOC(slicelength*sizeof(PyObject*));
1841
1842 for (cur = start, i = 0; i < slicelength;
1843 cur += step, i++) {
1844 garbage[i] = PyList_GET_ITEM(self, cur);
1845
1846 ins = PyList_GET_ITEM(value, i);
1847 Py_INCREF(ins);
1848 PyList_SET_ITEM(self, cur, ins);
1849 }
1850
1851 for (i = 0; i < slicelength; i++) {
1852 Py_DECREF(garbage[i]);
1853 }
1854
1855 PyMem_FREE(garbage);
1856 Py_DECREF(value);
1857
1858 return 0;
1859 }
1860 }
1861 else {
1862 PyErr_SetString(PyExc_TypeError,
1863 "list indices must be integers");
1864 return -1;
1865 }
1866}
1867
1868static PyMappingMethods list_as_mapping = {
1869 (inquiry)list_length,
1870 (binaryfunc)list_subscript,
1871 (objobjargproc)list_ass_subscript
1872};
1873
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001874PyTypeObject PyList_Type = {
1875 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001876 0,
1877 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001878 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001879 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001880 (destructor)list_dealloc, /* tp_dealloc */
1881 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001882 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001883 0, /* tp_setattr */
1884 0, /* tp_compare */
1885 (reprfunc)list_repr, /* tp_repr */
1886 0, /* tp_as_number */
1887 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001888 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001889 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001890 0, /* tp_call */
1891 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001892 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001893 0, /* tp_setattro */
1894 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001895 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001896 Py_TPFLAGS_BASETYPE, /* tp_flags */
1897 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001898 (traverseproc)list_traverse, /* tp_traverse */
1899 (inquiry)list_clear, /* tp_clear */
1900 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001901 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001902 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001903 0, /* tp_iternext */
1904 list_methods, /* tp_methods */
1905 0, /* tp_members */
1906 0, /* tp_getset */
1907 0, /* tp_base */
1908 0, /* tp_dict */
1909 0, /* tp_descr_get */
1910 0, /* tp_descr_set */
1911 0, /* tp_dictoffset */
1912 (initproc)list_init, /* tp_init */
1913 PyType_GenericAlloc, /* tp_alloc */
1914 PyType_GenericNew, /* tp_new */
Neil Schemenauer99b5d282002-04-12 02:44:22 +00001915 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001916};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001917
1918
1919/* During a sort, we really can't have anyone modifying the list; it could
1920 cause core dumps. Thus, we substitute a dummy type that raises an
1921 explanatory exception when a modifying operation is used. Caveat:
1922 comparisons may behave differently; but I guess it's a bad idea anyway to
1923 compare a list that's being sorted... */
1924
1925static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001926immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001927{
1928 PyErr_SetString(PyExc_TypeError,
1929 "a list cannot be modified while it is being sorted");
1930 return NULL;
1931}
1932
1933static PyMethodDef immutable_list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001934 {"append", (PyCFunction)immutable_list_op, METH_VARARGS},
1935 {"insert", (PyCFunction)immutable_list_op, METH_VARARGS},
Tim Peters52e07172001-08-30 06:15:32 +00001936 {"extend", (PyCFunction)immutable_list_op, METH_O},
1937 {"pop", (PyCFunction)immutable_list_op, METH_VARARGS},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001938 {"remove", (PyCFunction)immutable_list_op, METH_VARARGS},
1939 {"index", (PyCFunction)listindex, METH_O},
1940 {"count", (PyCFunction)listcount, METH_O},
1941 {"reverse", (PyCFunction)immutable_list_op, METH_VARARGS},
1942 {"sort", (PyCFunction)immutable_list_op, METH_VARARGS},
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001943 {NULL, NULL} /* sentinel */
1944};
1945
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001946static int
Fred Drakea2f55112000-07-09 15:16:51 +00001947immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001948{
1949 immutable_list_op();
1950 return -1;
1951}
1952
1953static PySequenceMethods immutable_list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001954 (inquiry)list_length, /* sq_length */
1955 (binaryfunc)list_concat, /* sq_concat */
1956 (intargfunc)list_repeat, /* sq_repeat */
1957 (intargfunc)list_item, /* sq_item */
1958 (intintargfunc)list_slice, /* sq_slice */
1959 (intobjargproc)immutable_list_ass, /* sq_ass_item */
1960 (intintobjargproc)immutable_list_ass, /* sq_ass_slice */
1961 (objobjproc)list_contains, /* sq_contains */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001962};
1963
1964static PyTypeObject immutable_list_type = {
1965 PyObject_HEAD_INIT(&PyType_Type)
1966 0,
1967 "list (immutable, during sort)",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001968 sizeof(PyListObject),
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001969 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001970 0, /* Cannot happen */ /* tp_dealloc */
1971 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001972 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001973 0, /* tp_setattr */
1974 0, /* Won't be called */ /* tp_compare */
1975 (reprfunc)list_repr, /* tp_repr */
1976 0, /* tp_as_number */
1977 &immutable_list_as_sequence, /* tp_as_sequence */
1978 0, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001979 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001980 0, /* tp_call */
1981 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001982 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001983 0, /* tp_setattro */
1984 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001985 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001986 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001987 (traverseproc)list_traverse, /* tp_traverse */
1988 0, /* tp_clear */
1989 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001990 0, /* tp_weaklistoffset */
1991 0, /* tp_iter */
1992 0, /* tp_iternext */
1993 immutable_list_methods, /* tp_methods */
1994 0, /* tp_members */
1995 0, /* tp_getset */
1996 0, /* tp_base */
1997 0, /* tp_dict */
1998 0, /* tp_descr_get */
1999 0, /* tp_descr_set */
2000 0, /* tp_init */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002001 /* NOTE: This is *not* the standard list_type struct! */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002002};
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002003
2004
2005/*********************** List Iterator **************************/
2006
2007typedef struct {
2008 PyObject_HEAD
Tim Peters93b2cc42002-06-01 05:22:55 +00002009 long it_index;
2010 PyListObject *it_seq;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002011} listiterobject;
2012
2013PyTypeObject PyListIter_Type;
2014
2015PyObject *
2016list_iter(PyObject *seq)
2017{
2018 listiterobject *it;
2019
2020 if (!PyList_Check(seq)) {
2021 PyErr_BadInternalCall();
2022 return NULL;
2023 }
2024 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2025 if (it == NULL)
2026 return NULL;
2027 it->it_index = 0;
2028 Py_INCREF(seq);
Tim Peters93b2cc42002-06-01 05:22:55 +00002029 it->it_seq = (PyListObject *)seq;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002030 _PyObject_GC_TRACK(it);
2031 return (PyObject *)it;
2032}
2033
2034static void
2035listiter_dealloc(listiterobject *it)
2036{
2037 _PyObject_GC_UNTRACK(it);
2038 Py_DECREF(it->it_seq);
2039 PyObject_GC_Del(it);
2040}
2041
2042static int
2043listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2044{
Tim Peters93b2cc42002-06-01 05:22:55 +00002045 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002046}
2047
2048
2049static PyObject *
2050listiter_getiter(PyObject *it)
2051{
2052 Py_INCREF(it);
2053 return it;
2054}
2055
2056static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002057listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002058{
Tim Peters93b2cc42002-06-01 05:22:55 +00002059 PyListObject *seq;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002060 PyObject *item;
2061
Tim Peters93b2cc42002-06-01 05:22:55 +00002062 assert(it != NULL);
2063 seq = it->it_seq;
2064 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002065
Tim Peters93b2cc42002-06-01 05:22:55 +00002066 if (it->it_index < PyList_GET_SIZE(seq)) {
2067 item = PyList_GET_ITEM(seq, it->it_index);
2068 ++it->it_index;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002069 Py_INCREF(item);
2070 return item;
2071 }
2072 return NULL;
2073}
2074
2075static PyMethodDef listiter_methods[] = {
2076 {"next", (PyCFunction)listiter_next, METH_NOARGS,
2077 "it.next() -- get the next value, or raise StopIteration"},
2078 {NULL, NULL} /* sentinel */
2079};
2080
2081PyTypeObject PyListIter_Type = {
2082 PyObject_HEAD_INIT(&PyType_Type)
2083 0, /* ob_size */
2084 "listiterator", /* tp_name */
2085 sizeof(listiterobject), /* tp_basicsize */
2086 0, /* tp_itemsize */
2087 /* methods */
2088 (destructor)listiter_dealloc, /* tp_dealloc */
2089 0, /* tp_print */
2090 0, /* tp_getattr */
2091 0, /* tp_setattr */
2092 0, /* tp_compare */
2093 0, /* tp_repr */
2094 0, /* tp_as_number */
2095 0, /* tp_as_sequence */
2096 0, /* tp_as_mapping */
2097 0, /* tp_hash */
2098 0, /* tp_call */
2099 0, /* tp_str */
2100 PyObject_GenericGetAttr, /* tp_getattro */
2101 0, /* tp_setattro */
2102 0, /* tp_as_buffer */
2103 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2104 0, /* tp_doc */
2105 (traverseproc)listiter_traverse, /* tp_traverse */
2106 0, /* tp_clear */
2107 0, /* tp_richcompare */
2108 0, /* tp_weaklistoffset */
2109 (getiterfunc)listiter_getiter, /* tp_iter */
2110 (iternextfunc)listiter_next, /* tp_iternext */
2111 listiter_methods, /* tp_methods */
2112 0, /* tp_members */
2113 0, /* tp_getset */
2114 0, /* tp_base */
2115 0, /* tp_dict */
2116 0, /* tp_descr_get */
2117 0, /* tp_descr_set */
2118};
2119