blob: 2cd8642b74e3cfd1f8db2b727a5dd0177b54ea63 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* List object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
4
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00005#ifdef STDC_HEADERS
6#include <stddef.h>
7#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008#include <sys/types.h> /* For size_t */
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00009#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Tim Peters8d9eb102004-07-31 02:24:20 +000011/* Ensure ob_item has room for at least newsize elements, and set
12 * ob_size to newsize. If newsize > ob_size on entry, the content
13 * of the new slots at exit is undefined heap trash; it's the caller's
Ezio Melotti13925002011-03-16 11:05:33 +020014 * responsibility to overwrite them with sane values.
Tim Peters8d9eb102004-07-31 02:24:20 +000015 * The number of allocated elements may grow, shrink, or stay the same.
16 * Failure is impossible if newsize <= self.allocated on entry, although
17 * that partly relies on an assumption that the system realloc() never
18 * fails when passed a number of bytes <= the number of bytes last
19 * allocated (the C standard doesn't guarantee this, but it's hard to
20 * imagine a realloc implementation where it wouldn't be true).
21 * Note that self->ob_item may change, and even if newsize is less
22 * than ob_size on entry.
23 */
Guido van Rossuma46d51d1995-01-26 22:59:43 +000024static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000025list_resize(PyListObject *self, Py_ssize_t newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 PyObject **items;
28 size_t new_allocated;
29 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 /* Bypass realloc() when a previous overallocation is large enough
32 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
34 */
35 if (allocated >= newsize && newsize >= (allocated >> 1)) {
36 assert(self->ob_item != NULL || newsize == 0);
37 Py_SIZE(self) = newsize;
38 return 0;
39 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +000040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 /* This over-allocates proportional to the list size, making room
42 * for additional growth. The over-allocation is mild, but is
43 * enough to give linear-time amortized behavior over a long
44 * sequence of appends() in the presence of a poorly-performing
45 * system realloc().
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
47 */
48 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +000049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 /* check for integer overflow */
51 if (new_allocated > PY_SIZE_MAX - newsize) {
52 PyErr_NoMemory();
53 return -1;
54 } else {
55 new_allocated += newsize;
56 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 if (newsize == 0)
59 new_allocated = 0;
60 items = self->ob_item;
61 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
62 PyMem_RESIZE(items, PyObject *, new_allocated);
63 else
64 items = NULL;
65 if (items == NULL) {
66 PyErr_NoMemory();
67 return -1;
68 }
69 self->ob_item = items;
70 Py_SIZE(self) = newsize;
71 self->allocated = new_allocated;
72 return 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000073}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000074
Christian Heimes77c02eb2008-02-09 02:18:51 +000075/* Debug statistic to compare allocations with reuse through the free list */
76#undef SHOW_ALLOC_COUNT
77#ifdef SHOW_ALLOC_COUNT
78static size_t count_alloc = 0;
79static size_t count_reuse = 0;
80
81static void
82show_alloc(void)
83{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
85 count_alloc);
86 fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
87 "d\n", count_reuse);
88 fprintf(stderr, "%.2f%% reuse rate\n\n",
89 (100.0*count_reuse/(count_alloc+count_reuse)));
Christian Heimes77c02eb2008-02-09 02:18:51 +000090}
91#endif
92
Raymond Hettinger0468e412004-05-05 05:37:53 +000093/* Empty list reuse scheme to save calls to malloc and free */
Christian Heimes2202f872008-02-06 14:31:34 +000094#ifndef PyList_MAXFREELIST
95#define PyList_MAXFREELIST 80
96#endif
97static PyListObject *free_list[PyList_MAXFREELIST];
98static int numfree = 0;
Raymond Hettinger0468e412004-05-05 05:37:53 +000099
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000100void
101PyList_Fini(void)
102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 PyListObject *op;
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 while (numfree) {
106 op = free_list[--numfree];
107 assert(PyList_CheckExact(op));
108 PyObject_GC_Del(op);
109 }
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000110}
111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000113PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 PyListObject *op;
116 size_t nbytes;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000117#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 static int initialized = 0;
119 if (!initialized) {
120 Py_AtExit(show_alloc);
121 initialized = 1;
122 }
Christian Heimes77c02eb2008-02-09 02:18:51 +0000123#endif
Tim Peters3986d4e2004-07-29 02:28:42 +0000124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 if (size < 0) {
126 PyErr_BadInternalCall();
127 return NULL;
128 }
129 /* Check for overflow without an actual overflow,
130 * which can cause compiler to optimise out */
131 if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *))
132 return PyErr_NoMemory();
133 nbytes = size * sizeof(PyObject *);
134 if (numfree) {
135 numfree--;
136 op = free_list[numfree];
137 _Py_NewReference((PyObject *)op);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000138#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 count_reuse++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 } else {
142 op = PyObject_GC_New(PyListObject, &PyList_Type);
143 if (op == NULL)
144 return NULL;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000145#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 count_alloc++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 }
149 if (size <= 0)
150 op->ob_item = NULL;
151 else {
152 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
153 if (op->ob_item == NULL) {
154 Py_DECREF(op);
155 return PyErr_NoMemory();
156 }
157 memset(op->ob_item, 0, nbytes);
158 }
159 Py_SIZE(op) = size;
160 op->allocated = size;
161 _PyObject_GC_TRACK(op);
162 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163}
164
Martin v. Löwis18e16552006-02-15 17:27:45 +0000165Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000166PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 if (!PyList_Check(op)) {
169 PyErr_BadInternalCall();
170 return -1;
171 }
172 else
173 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174}
175
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000176static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000177
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000179PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 if (!PyList_Check(op)) {
182 PyErr_BadInternalCall();
183 return NULL;
184 }
185 if (i < 0 || i >= Py_SIZE(op)) {
186 if (indexerr == NULL) {
187 indexerr = PyUnicode_FromString(
188 "list index out of range");
189 if (indexerr == NULL)
190 return NULL;
191 }
192 PyErr_SetObject(PyExc_IndexError, indexerr);
193 return NULL;
194 }
195 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196}
197
198int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000199PyList_SetItem(register PyObject *op, register Py_ssize_t i,
Fred Drakea2f55112000-07-09 15:16:51 +0000200 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 register PyObject *olditem;
203 register PyObject **p;
204 if (!PyList_Check(op)) {
205 Py_XDECREF(newitem);
206 PyErr_BadInternalCall();
207 return -1;
208 }
209 if (i < 0 || i >= Py_SIZE(op)) {
210 Py_XDECREF(newitem);
211 PyErr_SetString(PyExc_IndexError,
212 "list assignment index out of range");
213 return -1;
214 }
215 p = ((PyListObject *)op) -> ob_item + i;
216 olditem = *p;
217 *p = newitem;
218 Py_XDECREF(olditem);
219 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220}
221
222static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 Py_ssize_t i, n = Py_SIZE(self);
226 PyObject **items;
227 if (v == NULL) {
228 PyErr_BadInternalCall();
229 return -1;
230 }
231 if (n == PY_SSIZE_T_MAX) {
232 PyErr_SetString(PyExc_OverflowError,
233 "cannot add more objects to list");
234 return -1;
235 }
Tim Petersb38e2b62004-07-29 02:29:26 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 if (list_resize(self, n+1) == -1)
238 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 if (where < 0) {
241 where += n;
242 if (where < 0)
243 where = 0;
244 }
245 if (where > n)
246 where = n;
247 items = self->ob_item;
248 for (i = n; --i >= where; )
249 items[i+1] = items[i];
250 Py_INCREF(v);
251 items[where] = v;
252 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253}
254
255int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000256PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 if (!PyList_Check(op)) {
259 PyErr_BadInternalCall();
260 return -1;
261 }
262 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263}
264
Raymond Hettinger40a03822004-04-12 13:05:09 +0000265static int
266app1(PyListObject *self, PyObject *v)
267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 assert (v != NULL);
271 if (n == PY_SSIZE_T_MAX) {
272 PyErr_SetString(PyExc_OverflowError,
273 "cannot add more objects to list");
274 return -1;
275 }
Raymond Hettinger40a03822004-04-12 13:05:09 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 if (list_resize(self, n+1) == -1)
278 return -1;
Raymond Hettinger40a03822004-04-12 13:05:09 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 Py_INCREF(v);
281 PyList_SET_ITEM(self, n, v);
282 return 0;
Raymond Hettinger40a03822004-04-12 13:05:09 +0000283}
284
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285int
Fred Drakea2f55112000-07-09 15:16:51 +0000286PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 if (PyList_Check(op) && (newitem != NULL))
289 return app1((PyListObject *)op, newitem);
290 PyErr_BadInternalCall();
291 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292}
293
294/* Methods */
295
296static void
Fred Drakea2f55112000-07-09 15:16:51 +0000297list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 Py_ssize_t i;
300 PyObject_GC_UnTrack(op);
301 Py_TRASHCAN_SAFE_BEGIN(op)
302 if (op->ob_item != NULL) {
303 /* Do it backwards, for Christian Tismer.
304 There's a simple test case where somehow this reduces
305 thrashing when a *very* large list is created and
306 immediately deleted. */
307 i = Py_SIZE(op);
308 while (--i >= 0) {
309 Py_XDECREF(op->ob_item[i]);
310 }
311 PyMem_FREE(op->ob_item);
312 }
313 if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
314 free_list[numfree++] = op;
315 else
316 Py_TYPE(op)->tp_free((PyObject *)op);
317 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318}
319
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000321list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 Py_ssize_t i;
324 PyObject *s, *temp;
325 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 i = Py_ReprEnter((PyObject*)v);
328 if (i != 0) {
329 return i > 0 ? PyUnicode_FromString("[...]") : NULL;
330 }
Tim Petersa7259592001-06-16 05:11:17 +0000331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 if (Py_SIZE(v) == 0) {
333 result = PyUnicode_FromString("[]");
334 goto Done;
335 }
Tim Petersa7259592001-06-16 05:11:17 +0000336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 pieces = PyList_New(0);
338 if (pieces == NULL)
339 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 /* Do repr() on each element. Note that this may mutate the list,
342 so must refetch the list size on each iteration. */
343 for (i = 0; i < Py_SIZE(v); ++i) {
344 int status;
345 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
346 goto Done;
347 s = PyObject_Repr(v->ob_item[i]);
348 Py_LeaveRecursiveCall();
349 if (s == NULL)
350 goto Done;
351 status = PyList_Append(pieces, s);
352 Py_DECREF(s); /* append created a new ref */
353 if (status < 0)
354 goto Done;
355 }
Tim Petersa7259592001-06-16 05:11:17 +0000356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 /* Add "[]" decorations to the first and last items. */
358 assert(PyList_GET_SIZE(pieces) > 0);
359 s = PyUnicode_FromString("[");
360 if (s == NULL)
361 goto Done;
362 temp = PyList_GET_ITEM(pieces, 0);
363 PyUnicode_AppendAndDel(&s, temp);
364 PyList_SET_ITEM(pieces, 0, s);
365 if (s == NULL)
366 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 s = PyUnicode_FromString("]");
369 if (s == NULL)
370 goto Done;
371 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
372 PyUnicode_AppendAndDel(&temp, s);
373 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
374 if (temp == NULL)
375 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 /* Paste them all together with ", " between. */
378 s = PyUnicode_FromString(", ");
379 if (s == NULL)
380 goto Done;
381 result = PyUnicode_Join(s, pieces);
382 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000383
384Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 Py_XDECREF(pieces);
386 Py_ReprLeave((PyObject *)v);
387 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388}
389
Martin v. Löwis18e16552006-02-15 17:27:45 +0000390static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000391list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394}
395
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000396static int
Fred Drakea2f55112000-07-09 15:16:51 +0000397list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 Py_ssize_t i;
400 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
403 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
404 Py_EQ);
405 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000406}
407
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000409list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 if (i < 0 || i >= Py_SIZE(a)) {
412 if (indexerr == NULL) {
413 indexerr = PyUnicode_FromString(
414 "list index out of range");
415 if (indexerr == NULL)
416 return NULL;
417 }
418 PyErr_SetObject(PyExc_IndexError, indexerr);
419 return NULL;
420 }
421 Py_INCREF(a->ob_item[i]);
422 return a->ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423}
424
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000426list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 PyListObject *np;
429 PyObject **src, **dest;
430 Py_ssize_t i, len;
431 if (ilow < 0)
432 ilow = 0;
433 else if (ilow > Py_SIZE(a))
434 ilow = Py_SIZE(a);
435 if (ihigh < ilow)
436 ihigh = ilow;
437 else if (ihigh > Py_SIZE(a))
438 ihigh = Py_SIZE(a);
439 len = ihigh - ilow;
440 np = (PyListObject *) PyList_New(len);
441 if (np == NULL)
442 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 src = a->ob_item + ilow;
445 dest = np->ob_item;
446 for (i = 0; i < len; i++) {
447 PyObject *v = src[i];
448 Py_INCREF(v);
449 dest[i] = v;
450 }
451 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452}
453
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000455PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 if (!PyList_Check(a)) {
458 PyErr_BadInternalCall();
459 return NULL;
460 }
461 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000462}
463
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000465list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 Py_ssize_t size;
468 Py_ssize_t i;
469 PyObject **src, **dest;
470 PyListObject *np;
471 if (!PyList_Check(bb)) {
472 PyErr_Format(PyExc_TypeError,
473 "can only concatenate list (not \"%.200s\") to list",
474 bb->ob_type->tp_name);
475 return NULL;
476 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477#define b ((PyListObject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 size = Py_SIZE(a) + Py_SIZE(b);
479 if (size < 0)
480 return PyErr_NoMemory();
481 np = (PyListObject *) PyList_New(size);
482 if (np == NULL) {
483 return NULL;
484 }
485 src = a->ob_item;
486 dest = np->ob_item;
487 for (i = 0; i < Py_SIZE(a); i++) {
488 PyObject *v = src[i];
489 Py_INCREF(v);
490 dest[i] = v;
491 }
492 src = b->ob_item;
493 dest = np->ob_item + Py_SIZE(a);
494 for (i = 0; i < Py_SIZE(b); i++) {
495 PyObject *v = src[i];
496 Py_INCREF(v);
497 dest[i] = v;
498 }
499 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500#undef b
501}
502
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000504list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 Py_ssize_t i, j;
507 Py_ssize_t size;
508 PyListObject *np;
509 PyObject **p, **items;
510 PyObject *elem;
511 if (n < 0)
512 n = 0;
513 size = Py_SIZE(a) * n;
514 if (n && size/n != Py_SIZE(a))
515 return PyErr_NoMemory();
516 if (size == 0)
517 return PyList_New(0);
518 np = (PyListObject *) PyList_New(size);
519 if (np == NULL)
520 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 items = np->ob_item;
523 if (Py_SIZE(a) == 1) {
524 elem = a->ob_item[0];
525 for (i = 0; i < n; i++) {
526 items[i] = elem;
527 Py_INCREF(elem);
528 }
529 return (PyObject *) np;
530 }
531 p = np->ob_item;
532 items = a->ob_item;
533 for (i = 0; i < n; i++) {
534 for (j = 0; j < Py_SIZE(a); j++) {
535 *p = items[j];
536 Py_INCREF(*p);
537 p++;
538 }
539 }
540 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000541}
542
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543static int
Armin Rigo93677f02004-07-29 12:40:23 +0000544list_clear(PyListObject *a)
545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 Py_ssize_t i;
547 PyObject **item = a->ob_item;
548 if (item != NULL) {
549 /* Because XDECREF can recursively invoke operations on
550 this list, we make it empty first. */
551 i = Py_SIZE(a);
552 Py_SIZE(a) = 0;
553 a->ob_item = NULL;
554 a->allocated = 0;
555 while (--i >= 0) {
556 Py_XDECREF(item[i]);
557 }
558 PyMem_FREE(item);
559 }
560 /* Never fails; the return value can be ignored.
561 Note that there is no guarantee that the list is actually empty
562 at this point, because XDECREF may have populated it again! */
563 return 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000564}
565
Tim Peters8fc4a912004-07-31 21:53:19 +0000566/* a[ilow:ihigh] = v if v != NULL.
567 * del a[ilow:ihigh] if v == NULL.
568 *
569 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
570 * guaranteed the call cannot fail.
571 */
Armin Rigo93677f02004-07-29 12:40:23 +0000572static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000573list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 /* Because [X]DECREF can recursively invoke list operations on
576 this list, we must postpone all [X]DECREF activity until
577 after the list is back in its canonical shape. Therefore
578 we must allocate an additional array, 'recycle', into which
579 we temporarily copy the items that are deleted from the
580 list. :-( */
581 PyObject *recycle_on_stack[8];
582 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
583 PyObject **item;
584 PyObject **vitem = NULL;
585 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
586 Py_ssize_t n; /* # of elements in replacement list */
587 Py_ssize_t norig; /* # of elements in list getting replaced */
588 Py_ssize_t d; /* Change in size */
589 Py_ssize_t k;
590 size_t s;
591 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592#define b ((PyListObject *)v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 if (v == NULL)
594 n = 0;
595 else {
596 if (a == b) {
597 /* Special case "a[i:j] = a" -- copy b first */
598 v = list_slice(b, 0, Py_SIZE(b));
599 if (v == NULL)
600 return result;
601 result = list_ass_slice(a, ilow, ihigh, v);
602 Py_DECREF(v);
603 return result;
604 }
605 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
606 if(v_as_SF == NULL)
607 goto Error;
608 n = PySequence_Fast_GET_SIZE(v_as_SF);
609 vitem = PySequence_Fast_ITEMS(v_as_SF);
610 }
611 if (ilow < 0)
612 ilow = 0;
613 else if (ilow > Py_SIZE(a))
614 ilow = Py_SIZE(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 if (ihigh < ilow)
617 ihigh = ilow;
618 else if (ihigh > Py_SIZE(a))
619 ihigh = Py_SIZE(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 norig = ihigh - ilow;
622 assert(norig >= 0);
623 d = n - norig;
624 if (Py_SIZE(a) + d == 0) {
625 Py_XDECREF(v_as_SF);
626 return list_clear(a);
627 }
628 item = a->ob_item;
629 /* recycle the items that we are about to remove */
630 s = norig * sizeof(PyObject *);
631 if (s > sizeof(recycle_on_stack)) {
632 recycle = (PyObject **)PyMem_MALLOC(s);
633 if (recycle == NULL) {
634 PyErr_NoMemory();
635 goto Error;
636 }
637 }
638 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 if (d < 0) { /* Delete -d items */
641 memmove(&item[ihigh+d], &item[ihigh],
642 (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
643 list_resize(a, Py_SIZE(a) + d);
644 item = a->ob_item;
645 }
646 else if (d > 0) { /* Insert d items */
647 k = Py_SIZE(a);
648 if (list_resize(a, k+d) < 0)
649 goto Error;
650 item = a->ob_item;
651 memmove(&item[ihigh+d], &item[ihigh],
652 (k - ihigh)*sizeof(PyObject *));
653 }
654 for (k = 0; k < n; k++, ilow++) {
655 PyObject *w = vitem[k];
656 Py_XINCREF(w);
657 item[ilow] = w;
658 }
659 for (k = norig - 1; k >= 0; --k)
660 Py_XDECREF(recycle[k]);
661 result = 0;
Tim Peters8d9eb102004-07-31 02:24:20 +0000662 Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 if (recycle != recycle_on_stack)
664 PyMem_FREE(recycle);
665 Py_XDECREF(v_as_SF);
666 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000667#undef b
668}
669
Guido van Rossum234f9421993-06-17 12:35:49 +0000670int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 if (!PyList_Check(a)) {
674 PyErr_BadInternalCall();
675 return -1;
676 }
677 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000678}
679
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000680static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000681list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 PyObject **items;
684 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000685
686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 size = PyList_GET_SIZE(self);
688 if (size == 0 || n == 1) {
689 Py_INCREF(self);
690 return (PyObject *)self;
691 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 if (n < 1) {
694 (void)list_clear(self);
695 Py_INCREF(self);
696 return (PyObject *)self;
697 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 if (size > PY_SSIZE_T_MAX / n) {
700 return PyErr_NoMemory();
701 }
Christian Heimesaf98da12008-01-27 15:18:18 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 if (list_resize(self, size*n) == -1)
704 return NULL;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 p = size;
707 items = self->ob_item;
708 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
709 for (j = 0; j < size; j++) {
710 PyObject *o = items[j];
711 Py_INCREF(o);
712 items[p++] = o;
713 }
714 }
715 Py_INCREF(self);
716 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000717}
718
Guido van Rossum4a450d01991-04-03 19:05:18 +0000719static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000720list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 PyObject *old_value;
723 if (i < 0 || i >= Py_SIZE(a)) {
724 PyErr_SetString(PyExc_IndexError,
725 "list assignment index out of range");
726 return -1;
727 }
728 if (v == NULL)
729 return list_ass_slice(a, i, i+1, v);
730 Py_INCREF(v);
731 old_value = a->ob_item[i];
732 a->ob_item[i] = v;
733 Py_DECREF(old_value);
734 return 0;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000735}
736
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000738listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 Py_ssize_t i;
741 PyObject *v;
742 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
743 return NULL;
744 if (ins1(self, i, v) == 0)
745 Py_RETURN_NONE;
746 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000747}
748
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749static PyObject *
Eli Benderskycbbaa962011-02-25 05:47:53 +0000750listclear(PyListObject *self)
751{
752 list_clear(self);
753 Py_RETURN_NONE;
754}
755
756static PyObject *
757listcopy(PyListObject *self)
758{
759 return list_slice(self, 0, Py_SIZE(self));
760}
761
762static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000763listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 if (app1(self, v) == 0)
766 Py_RETURN_NONE;
767 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768}
769
Barry Warsawdedf6d61998-10-09 16:37:25 +0000770static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000771listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyObject *it; /* iter(v) */
774 Py_ssize_t m; /* size of self */
775 Py_ssize_t n; /* guess for size of b */
776 Py_ssize_t mn; /* m + n */
777 Py_ssize_t i;
778 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 /* Special cases:
781 1) lists and tuples which can use PySequence_Fast ops
782 2) extending self to self requires making a copy first
783 */
784 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
785 PyObject **src, **dest;
786 b = PySequence_Fast(b, "argument must be iterable");
787 if (!b)
788 return NULL;
789 n = PySequence_Fast_GET_SIZE(b);
790 if (n == 0) {
791 /* short circuit when b is empty */
792 Py_DECREF(b);
793 Py_RETURN_NONE;
794 }
795 m = Py_SIZE(self);
796 if (list_resize(self, m + n) == -1) {
797 Py_DECREF(b);
798 return NULL;
799 }
800 /* note that we may still have self == b here for the
801 * situation a.extend(a), but the following code works
802 * in that case too. Just make sure to resize self
803 * before calling PySequence_Fast_ITEMS.
804 */
805 /* populate the end of self with b's items */
806 src = PySequence_Fast_ITEMS(b);
807 dest = self->ob_item + m;
808 for (i = 0; i < n; i++) {
809 PyObject *o = src[i];
810 Py_INCREF(o);
811 dest[i] = o;
812 }
813 Py_DECREF(b);
814 Py_RETURN_NONE;
815 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 it = PyObject_GetIter(b);
818 if (it == NULL)
819 return NULL;
820 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 /* Guess a result list size. */
823 n = _PyObject_LengthHint(b, 8);
824 if (n == -1) {
825 Py_DECREF(it);
826 return NULL;
827 }
828 m = Py_SIZE(self);
829 mn = m + n;
830 if (mn >= m) {
831 /* Make room. */
832 if (list_resize(self, mn) == -1)
833 goto error;
834 /* Make the list sane again. */
835 Py_SIZE(self) = m;
836 }
837 /* Else m + n overflowed; on the chance that n lied, and there really
838 * is enough room, ignore it. If n was telling the truth, we'll
839 * eventually run out of memory during the loop.
840 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 /* Run iterator to exhaustion. */
843 for (;;) {
844 PyObject *item = iternext(it);
845 if (item == NULL) {
846 if (PyErr_Occurred()) {
847 if (PyErr_ExceptionMatches(PyExc_StopIteration))
848 PyErr_Clear();
849 else
850 goto error;
851 }
852 break;
853 }
854 if (Py_SIZE(self) < self->allocated) {
855 /* steals ref */
856 PyList_SET_ITEM(self, Py_SIZE(self), item);
857 ++Py_SIZE(self);
858 }
859 else {
860 int status = app1(self, item);
861 Py_DECREF(item); /* append creates a new ref */
862 if (status < 0)
863 goto error;
864 }
865 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 /* Cut back result list if initial guess was too large. */
868 if (Py_SIZE(self) < self->allocated)
869 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 Py_DECREF(it);
872 Py_RETURN_NONE;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000873
874 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 Py_DECREF(it);
876 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000877}
878
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000879PyObject *
880_PyList_Extend(PyListObject *self, PyObject *b)
881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 return listextend(self, b);
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000883}
884
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000885static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000886list_inplace_concat(PyListObject *self, PyObject *other)
887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 PyObject *result;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 result = listextend(self, other);
891 if (result == NULL)
892 return result;
893 Py_DECREF(result);
894 Py_INCREF(self);
895 return (PyObject *)self;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000896}
897
898static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000899listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 Py_ssize_t i = -1;
902 PyObject *v;
903 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 if (!PyArg_ParseTuple(args, "|n:pop", &i))
906 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 if (Py_SIZE(self) == 0) {
909 /* Special-case most common failure cause */
910 PyErr_SetString(PyExc_IndexError, "pop from empty list");
911 return NULL;
912 }
913 if (i < 0)
914 i += Py_SIZE(self);
915 if (i < 0 || i >= Py_SIZE(self)) {
916 PyErr_SetString(PyExc_IndexError, "pop index out of range");
917 return NULL;
918 }
919 v = self->ob_item[i];
920 if (i == Py_SIZE(self) - 1) {
921 status = list_resize(self, Py_SIZE(self) - 1);
922 assert(status >= 0);
923 return v; /* and v now owns the reference the list had */
924 }
925 Py_INCREF(v);
926 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
927 assert(status >= 0);
928 /* Use status, so that in a release build compilers don't
929 * complain about the unused name.
930 */
931 (void) status;
Brett Cannon651dd522004-08-08 21:21:18 +0000932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000934}
935
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000936/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
937static void
938reverse_slice(PyObject **lo, PyObject **hi)
939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 assert(lo && hi);
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 --hi;
943 while (lo < hi) {
944 PyObject *t = *lo;
945 *lo = *hi;
946 *hi = t;
947 ++lo;
948 --hi;
949 }
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000950}
951
Tim Petersa64dc242002-08-01 02:13:36 +0000952/* Lots of code for an adaptive, stable, natural mergesort. There are many
953 * pieces to this algorithm; read listsort.txt for overviews and details.
954 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000955
Daniel Stutzbach98338222010-12-02 21:55:33 +0000956/* A sortslice contains a pointer to an array of keys and a pointer to
957 * an array of corresponding values. In other words, keys[i]
958 * corresponds with values[i]. If values == NULL, then the keys are
959 * also the values.
960 *
961 * Several convenience routines are provided here, so that keys and
962 * values are always moved in sync.
963 */
964
965typedef struct {
966 PyObject **keys;
967 PyObject **values;
968} sortslice;
969
970Py_LOCAL_INLINE(void)
971sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
972{
973 s1->keys[i] = s2->keys[j];
974 if (s1->values != NULL)
975 s1->values[i] = s2->values[j];
976}
977
978Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000979sortslice_copy_incr(sortslice *dst, sortslice *src)
980{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000981 *dst->keys++ = *src->keys++;
982 if (dst->values != NULL)
983 *dst->values++ = *src->values++;
984}
985
986Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000987sortslice_copy_decr(sortslice *dst, sortslice *src)
988{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000989 *dst->keys-- = *src->keys--;
990 if (dst->values != NULL)
991 *dst->values-- = *src->values--;
992}
993
994
995Py_LOCAL_INLINE(void)
996sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000997 Py_ssize_t n)
998{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000999 memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1000 if (s1->values != NULL)
1001 memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1002}
1003
1004Py_LOCAL_INLINE(void)
1005sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001006 Py_ssize_t n)
1007{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001008 memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1009 if (s1->values != NULL)
1010 memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1011}
1012
1013Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001014sortslice_advance(sortslice *slice, Py_ssize_t n)
1015{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001016 slice->keys += n;
1017 if (slice->values != NULL)
1018 slice->values += n;
1019}
1020
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001021/* Comparison function: PyObject_RichCompareBool with Py_LT.
Tim Petersa64dc242002-08-01 02:13:36 +00001022 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1023 */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001024
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001025#define ISLT(X, Y) (PyObject_RichCompareBool(X, Y, Py_LT))
Tim Peters66860f62002-08-04 17:47:26 +00001026
1027/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +00001028 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
1029 started. It makes more sense in context <wink>. X and Y are PyObject*s.
1030*/
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001031#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001033
1034/* binarysort is the best method for sorting small arrays: it does
1035 few compares, but can do data movement quadratic in the number of
1036 elements.
Guido van Rossum42812581998-06-17 14:15:44 +00001037 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +00001038 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001039 On entry, must have lo <= start <= hi, and that [lo, start) is already
1040 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +00001041 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001042 Even in case of error, the output slice will be some permutation of
1043 the input (nothing is lost or duplicated).
1044*/
Guido van Rossum3f236de1996-12-10 23:55:39 +00001045static int
Daniel Stutzbach98338222010-12-02 21:55:33 +00001046binarysort(sortslice lo, PyObject **hi, PyObject **start)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 register Py_ssize_t k;
1049 register PyObject **l, **p, **r;
1050 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001051
Daniel Stutzbach98338222010-12-02 21:55:33 +00001052 assert(lo.keys <= start && start <= hi);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 /* assert [lo, start) is sorted */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001054 if (lo.keys == start)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 ++start;
1056 for (; start < hi; ++start) {
1057 /* set l to where *start belongs */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001058 l = lo.keys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 r = start;
1060 pivot = *r;
1061 /* Invariants:
1062 * pivot >= all in [lo, l).
1063 * pivot < all in [r, start).
1064 * The second is vacuously true at the start.
1065 */
1066 assert(l < r);
1067 do {
1068 p = l + ((r - l) >> 1);
1069 IFLT(pivot, *p)
1070 r = p;
1071 else
1072 l = p+1;
1073 } while (l < r);
1074 assert(l == r);
1075 /* The invariants still hold, so pivot >= all in [lo, l) and
1076 pivot < all in [l, start), so pivot belongs at l. Note
1077 that if there are elements equal to pivot, l points to the
1078 first slot after them -- that's why this sort is stable.
1079 Slide over to make room.
1080 Caution: using memmove is much slower under MSVC 5;
1081 we're not usually moving many slots. */
1082 for (p = start; p > l; --p)
1083 *p = *(p-1);
1084 *l = pivot;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001085 if (lo.values != NULL) {
1086 Py_ssize_t offset = lo.values - lo.keys;
1087 p = start + offset;
1088 pivot = *p;
1089 l += offset;
1090 for (p = start + offset; p > l; --p)
1091 *p = *(p-1);
1092 *l = pivot;
1093 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 }
1095 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001096
1097 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001099}
1100
Tim Petersa64dc242002-08-01 02:13:36 +00001101/*
1102Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1103is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001104
Tim Petersa64dc242002-08-01 02:13:36 +00001105 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001106
Tim Petersa64dc242002-08-01 02:13:36 +00001107or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001108
Tim Petersa64dc242002-08-01 02:13:36 +00001109 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001110
Tim Petersa64dc242002-08-01 02:13:36 +00001111Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1112For its intended use in a stable mergesort, the strictness of the defn of
1113"descending" is needed so that the caller can safely reverse a descending
1114sequence without violating stability (strict > ensures there are no equal
1115elements to get out of order).
1116
1117Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001118*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001119static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001120count_run(PyObject **lo, PyObject **hi, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 Py_ssize_t k;
1123 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 assert(lo < hi);
1126 *descending = 0;
1127 ++lo;
1128 if (lo == hi)
1129 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 n = 2;
1132 IFLT(*lo, *(lo-1)) {
1133 *descending = 1;
1134 for (lo = lo+1; lo < hi; ++lo, ++n) {
1135 IFLT(*lo, *(lo-1))
1136 ;
1137 else
1138 break;
1139 }
1140 }
1141 else {
1142 for (lo = lo+1; lo < hi; ++lo, ++n) {
1143 IFLT(*lo, *(lo-1))
1144 break;
1145 }
1146 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 return n;
Tim Petersa64dc242002-08-01 02:13:36 +00001149fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001151}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001152
Tim Petersa64dc242002-08-01 02:13:36 +00001153/*
1154Locate the proper position of key in a sorted vector; if the vector contains
1155an element equal to key, return the position immediately to the left of
1156the leftmost equal element. [gallop_right() does the same except returns
1157the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001158
Tim Petersa64dc242002-08-01 02:13:36 +00001159"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001160
Tim Petersa64dc242002-08-01 02:13:36 +00001161"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1162hint is to the final result, the faster this runs.
1163
1164The return value is the int k in 0..n such that
1165
1166 a[k-1] < key <= a[k]
1167
1168pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1169key belongs at index k; or, IOW, the first k elements of a should precede
1170key, and the last n-k should follow key.
1171
1172Returns -1 on error. See listsort.txt for info on the method.
1173*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001174static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001175gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 Py_ssize_t ofs;
1178 Py_ssize_t lastofs;
1179 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 a += hint;
1184 lastofs = 0;
1185 ofs = 1;
1186 IFLT(*a, key) {
1187 /* a[hint] < key -- gallop right, until
1188 * a[hint + lastofs] < key <= a[hint + ofs]
1189 */
1190 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1191 while (ofs < maxofs) {
1192 IFLT(a[ofs], key) {
1193 lastofs = ofs;
1194 ofs = (ofs << 1) + 1;
1195 if (ofs <= 0) /* int overflow */
1196 ofs = maxofs;
1197 }
1198 else /* key <= a[hint + ofs] */
1199 break;
1200 }
1201 if (ofs > maxofs)
1202 ofs = maxofs;
1203 /* Translate back to offsets relative to &a[0]. */
1204 lastofs += hint;
1205 ofs += hint;
1206 }
1207 else {
1208 /* key <= a[hint] -- gallop left, until
1209 * a[hint - ofs] < key <= a[hint - lastofs]
1210 */
1211 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1212 while (ofs < maxofs) {
1213 IFLT(*(a-ofs), key)
1214 break;
1215 /* key <= a[hint - ofs] */
1216 lastofs = ofs;
1217 ofs = (ofs << 1) + 1;
1218 if (ofs <= 0) /* int overflow */
1219 ofs = maxofs;
1220 }
1221 if (ofs > maxofs)
1222 ofs = maxofs;
1223 /* Translate back to positive offsets relative to &a[0]. */
1224 k = lastofs;
1225 lastofs = hint - ofs;
1226 ofs = hint - k;
1227 }
1228 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1231 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1232 * right of lastofs but no farther right than ofs. Do a binary
1233 * search, with invariant a[lastofs-1] < key <= a[ofs].
1234 */
1235 ++lastofs;
1236 while (lastofs < ofs) {
1237 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 IFLT(a[m], key)
1240 lastofs = m+1; /* a[m] < key */
1241 else
1242 ofs = m; /* key <= a[m] */
1243 }
1244 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1245 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001246
1247fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001249}
1250
1251/*
1252Exactly like gallop_left(), except that if key already exists in a[0:n],
1253finds the position immediately to the right of the rightmost equal value.
1254
1255The return value is the int k in 0..n such that
1256
1257 a[k-1] <= key < a[k]
1258
1259or -1 if error.
1260
1261The code duplication is massive, but this is enough different given that
1262we're sticking to "<" comparisons that it's much harder to follow if
1263written as one routine with yet another "left or right?" flag.
1264*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001265static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001266gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 Py_ssize_t ofs;
1269 Py_ssize_t lastofs;
1270 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 a += hint;
1275 lastofs = 0;
1276 ofs = 1;
1277 IFLT(key, *a) {
1278 /* key < a[hint] -- gallop left, until
1279 * a[hint - ofs] <= key < a[hint - lastofs]
1280 */
1281 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1282 while (ofs < maxofs) {
1283 IFLT(key, *(a-ofs)) {
1284 lastofs = ofs;
1285 ofs = (ofs << 1) + 1;
1286 if (ofs <= 0) /* int overflow */
1287 ofs = maxofs;
1288 }
1289 else /* a[hint - ofs] <= key */
1290 break;
1291 }
1292 if (ofs > maxofs)
1293 ofs = maxofs;
1294 /* Translate back to positive offsets relative to &a[0]. */
1295 k = lastofs;
1296 lastofs = hint - ofs;
1297 ofs = hint - k;
1298 }
1299 else {
1300 /* a[hint] <= key -- gallop right, until
1301 * a[hint + lastofs] <= key < a[hint + ofs]
1302 */
1303 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1304 while (ofs < maxofs) {
1305 IFLT(key, a[ofs])
1306 break;
1307 /* a[hint + ofs] <= key */
1308 lastofs = ofs;
1309 ofs = (ofs << 1) + 1;
1310 if (ofs <= 0) /* int overflow */
1311 ofs = maxofs;
1312 }
1313 if (ofs > maxofs)
1314 ofs = maxofs;
1315 /* Translate back to offsets relative to &a[0]. */
1316 lastofs += hint;
1317 ofs += hint;
1318 }
1319 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1322 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1323 * right of lastofs but no farther right than ofs. Do a binary
1324 * search, with invariant a[lastofs-1] <= key < a[ofs].
1325 */
1326 ++lastofs;
1327 while (lastofs < ofs) {
1328 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 IFLT(key, a[m])
1331 ofs = m; /* key < a[m] */
1332 else
1333 lastofs = m+1; /* a[m] <= key */
1334 }
1335 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1336 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001337
1338fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001340}
1341
1342/* The maximum number of entries in a MergeState's pending-runs stack.
1343 * This is enough to sort arrays of size up to about
1344 * 32 * phi ** MAX_MERGE_PENDING
1345 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1346 * with 2**64 elements.
1347 */
1348#define MAX_MERGE_PENDING 85
1349
Tim Peterse05f65a2002-08-10 05:21:15 +00001350/* When we get into galloping mode, we stay there until both runs win less
1351 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001352 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001353#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001354
1355/* Avoid malloc for small temp arrays. */
1356#define MERGESTATE_TEMP_SIZE 256
1357
1358/* One MergeState exists on the stack per invocation of mergesort. It's just
1359 * a convenient way to pass state around among the helper functions.
1360 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001361struct s_slice {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001362 sortslice base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001364};
1365
Tim Petersa64dc242002-08-01 02:13:36 +00001366typedef struct s_MergeState {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 /* This controls when we get *into* galloping mode. It's initialized
1368 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1369 * random data, and lower for highly structured data.
1370 */
1371 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 /* 'a' is temp storage to help with merges. It contains room for
1374 * alloced entries.
1375 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001376 sortslice a; /* may point to temparray below */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 /* A stack of n pending runs yet to be merged. Run #i starts at
1380 * address base[i] and extends for len[i] elements. It's always
1381 * true (so long as the indices are in bounds) that
1382 *
1383 * pending[i].base + pending[i].len == pending[i+1].base
1384 *
1385 * so we could cut the storage for this, but it's a minor amount,
1386 * and keeping all the info explicit simplifies the code.
1387 */
1388 int n;
1389 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 /* 'a' points to this when possible, rather than muck with malloc. */
1392 PyObject *temparray[MERGESTATE_TEMP_SIZE];
Tim Petersa64dc242002-08-01 02:13:36 +00001393} MergeState;
1394
1395/* Conceptually a MergeState's constructor. */
1396static void
Victor Stinner0fcab4a2011-01-04 12:59:15 +00001397merge_init(MergeState *ms, Py_ssize_t list_size, int has_keyfunc)
Tim Petersa64dc242002-08-01 02:13:36 +00001398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001400 if (has_keyfunc) {
1401 /* The temporary space for merging will need at most half the list
1402 * size rounded up. Use the minimum possible space so we can use the
1403 * rest of temparray for other things. In particular, if there is
1404 * enough extra space, listsort() will use it to store the keys.
1405 */
1406 ms->alloced = (list_size + 1) / 2;
1407
1408 /* ms->alloced describes how many keys will be stored at
1409 ms->temparray, but we also need to store the values. Hence,
1410 ms->alloced is capped at half of MERGESTATE_TEMP_SIZE. */
1411 if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
1412 ms->alloced = MERGESTATE_TEMP_SIZE / 2;
1413 ms->a.values = &ms->temparray[ms->alloced];
1414 }
1415 else {
1416 ms->alloced = MERGESTATE_TEMP_SIZE;
1417 ms->a.values = NULL;
1418 }
1419 ms->a.keys = ms->temparray;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 ms->n = 0;
1421 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001422}
1423
1424/* Free all the temp memory owned by the MergeState. This must be called
1425 * when you're done with a MergeState, and may be called before then if
1426 * you want to free the temp memory early.
1427 */
1428static void
1429merge_freemem(MergeState *ms)
1430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001432 if (ms->a.keys != ms->temparray)
1433 PyMem_Free(ms->a.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001434}
1435
1436/* Ensure enough temp memory for 'need' array slots is available.
1437 * Returns 0 on success and -1 if the memory can't be gotten.
1438 */
1439static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001440merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001441{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001442 int multiplier;
1443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 assert(ms != NULL);
1445 if (need <= ms->alloced)
1446 return 0;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001447
1448 multiplier = ms->a.values != NULL ? 2 : 1;
1449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 /* Don't realloc! That can cost cycles to copy the old data, but
1451 * we don't care what's in the block.
1452 */
1453 merge_freemem(ms);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001454 if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*) / multiplier) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 PyErr_NoMemory();
1456 return -1;
1457 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001458 ms->a.keys = (PyObject**)PyMem_Malloc(multiplier * need
1459 * sizeof(PyObject *));
1460 if (ms->a.keys != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 ms->alloced = need;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001462 if (ms->a.values != NULL)
1463 ms->a.values = &ms->a.keys[need];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 return 0;
1465 }
1466 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001468}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1470 merge_getmem(MS, NEED))
Tim Petersa64dc242002-08-01 02:13:36 +00001471
Daniel Stutzbach98338222010-12-02 21:55:33 +00001472/* Merge the na elements starting at ssa with the nb elements starting at
1473 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1474 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1475 * should have na <= nb. See listsort.txt for more info. Return 0 if
1476 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001477 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001478static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001479merge_lo(MergeState *ms, sortslice ssa, Py_ssize_t na,
1480 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001483 sortslice dest;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 int result = -1; /* guilty until proved innocent */
1485 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001486
Daniel Stutzbach98338222010-12-02 21:55:33 +00001487 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1488 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 if (MERGE_GETMEM(ms, na) < 0)
1490 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001491 sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
1492 dest = ssa;
1493 ssa = ms->a;
Tim Petersa64dc242002-08-01 02:13:36 +00001494
Daniel Stutzbach98338222010-12-02 21:55:33 +00001495 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 --nb;
1497 if (nb == 0)
1498 goto Succeed;
1499 if (na == 1)
1500 goto CopyB;
Tim Petersa64dc242002-08-01 02:13:36 +00001501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 min_gallop = ms->min_gallop;
1503 for (;;) {
1504 Py_ssize_t acount = 0; /* # of times A won in a row */
1505 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 /* Do the straightforward thing until (if ever) one run
1508 * appears to win consistently.
1509 */
1510 for (;;) {
1511 assert(na > 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001512 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 if (k) {
1514 if (k < 0)
1515 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001516 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 ++bcount;
1518 acount = 0;
1519 --nb;
1520 if (nb == 0)
1521 goto Succeed;
1522 if (bcount >= min_gallop)
1523 break;
1524 }
1525 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001526 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 ++acount;
1528 bcount = 0;
1529 --na;
1530 if (na == 1)
1531 goto CopyB;
1532 if (acount >= min_gallop)
1533 break;
1534 }
1535 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 /* One run is winning so consistently that galloping may
1538 * be a huge win. So try that, and continue galloping until
1539 * (if ever) neither run appears to be winning consistently
1540 * anymore.
1541 */
1542 ++min_gallop;
1543 do {
1544 assert(na > 1 && nb > 0);
1545 min_gallop -= min_gallop > 1;
1546 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001547 k = gallop_right(ssb.keys[0], ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 acount = k;
1549 if (k) {
1550 if (k < 0)
1551 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001552 sortslice_memcpy(&dest, 0, &ssa, 0, k);
1553 sortslice_advance(&dest, k);
1554 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 na -= k;
1556 if (na == 1)
1557 goto CopyB;
1558 /* na==0 is impossible now if the comparison
1559 * function is consistent, but we can't assume
1560 * that it is.
1561 */
1562 if (na == 0)
1563 goto Succeed;
1564 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001565 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 --nb;
1567 if (nb == 0)
1568 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001569
Daniel Stutzbach98338222010-12-02 21:55:33 +00001570 k = gallop_left(ssa.keys[0], ssb.keys, nb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 bcount = k;
1572 if (k) {
1573 if (k < 0)
1574 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001575 sortslice_memmove(&dest, 0, &ssb, 0, k);
1576 sortslice_advance(&dest, k);
1577 sortslice_advance(&ssb, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 nb -= k;
1579 if (nb == 0)
1580 goto Succeed;
1581 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001582 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 --na;
1584 if (na == 1)
1585 goto CopyB;
1586 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1587 ++min_gallop; /* penalize it for leaving galloping mode */
1588 ms->min_gallop = min_gallop;
1589 }
Tim Petersa64dc242002-08-01 02:13:36 +00001590Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001592Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 if (na)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001594 sortslice_memcpy(&dest, 0, &ssa, 0, na);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001596CopyB:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 assert(na == 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001598 /* The last element of ssa belongs at the end of the merge. */
1599 sortslice_memmove(&dest, 0, &ssb, 0, nb);
1600 sortslice_copy(&dest, nb, &ssa, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001602}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001603
Daniel Stutzbach98338222010-12-02 21:55:33 +00001604/* Merge the na elements starting at pa with the nb elements starting at
1605 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1606 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1607 * should have na >= nb. See listsort.txt for more info. Return 0 if
1608 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001609 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001610static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001611merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
1612 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001615 sortslice dest, basea, baseb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 int result = -1; /* guilty until proved innocent */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001618
Daniel Stutzbach98338222010-12-02 21:55:33 +00001619 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1620 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 if (MERGE_GETMEM(ms, nb) < 0)
1622 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001623 dest = ssb;
1624 sortslice_advance(&dest, nb-1);
1625 sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
1626 basea = ssa;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 baseb = ms->a;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001628 ssb.keys = ms->a.keys + nb - 1;
1629 if (ssb.values != NULL)
1630 ssb.values = ms->a.values + nb - 1;
1631 sortslice_advance(&ssa, na - 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001632
Daniel Stutzbach98338222010-12-02 21:55:33 +00001633 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 --na;
1635 if (na == 0)
1636 goto Succeed;
1637 if (nb == 1)
1638 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 min_gallop = ms->min_gallop;
1641 for (;;) {
1642 Py_ssize_t acount = 0; /* # of times A won in a row */
1643 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 /* Do the straightforward thing until (if ever) one run
1646 * appears to win consistently.
1647 */
1648 for (;;) {
1649 assert(na > 0 && nb > 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001650 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 if (k) {
1652 if (k < 0)
1653 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001654 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 ++acount;
1656 bcount = 0;
1657 --na;
1658 if (na == 0)
1659 goto Succeed;
1660 if (acount >= min_gallop)
1661 break;
1662 }
1663 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001664 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 ++bcount;
1666 acount = 0;
1667 --nb;
1668 if (nb == 1)
1669 goto CopyA;
1670 if (bcount >= min_gallop)
1671 break;
1672 }
1673 }
Tim Petersa64dc242002-08-01 02:13:36 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 /* One run is winning so consistently that galloping may
1676 * be a huge win. So try that, and continue galloping until
1677 * (if ever) neither run appears to be winning consistently
1678 * anymore.
1679 */
1680 ++min_gallop;
1681 do {
1682 assert(na > 0 && nb > 1);
1683 min_gallop -= min_gallop > 1;
1684 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001685 k = gallop_right(ssb.keys[0], basea.keys, na, na-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 if (k < 0)
1687 goto Fail;
1688 k = na - k;
1689 acount = k;
1690 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001691 sortslice_advance(&dest, -k);
1692 sortslice_advance(&ssa, -k);
1693 sortslice_memmove(&dest, 1, &ssa, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 na -= k;
1695 if (na == 0)
1696 goto Succeed;
1697 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001698 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 --nb;
1700 if (nb == 1)
1701 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001702
Daniel Stutzbach98338222010-12-02 21:55:33 +00001703 k = gallop_left(ssa.keys[0], baseb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (k < 0)
1705 goto Fail;
1706 k = nb - k;
1707 bcount = k;
1708 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001709 sortslice_advance(&dest, -k);
1710 sortslice_advance(&ssb, -k);
1711 sortslice_memcpy(&dest, 1, &ssb, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 nb -= k;
1713 if (nb == 1)
1714 goto CopyA;
1715 /* nb==0 is impossible now if the comparison
1716 * function is consistent, but we can't assume
1717 * that it is.
1718 */
1719 if (nb == 0)
1720 goto Succeed;
1721 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001722 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 --na;
1724 if (na == 0)
1725 goto Succeed;
1726 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1727 ++min_gallop; /* penalize it for leaving galloping mode */
1728 ms->min_gallop = min_gallop;
1729 }
Tim Petersa64dc242002-08-01 02:13:36 +00001730Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001732Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 if (nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001734 sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001736CopyA:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 assert(nb == 1 && na > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001738 /* The first element of ssb belongs at the front of the merge. */
1739 sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
1740 sortslice_advance(&dest, -na);
1741 sortslice_advance(&ssa, -na);
1742 sortslice_copy(&dest, 0, &ssb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001744}
1745
1746/* Merge the two runs at stack indices i and i+1.
1747 * Returns 0 on success, -1 on error.
1748 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001749static Py_ssize_t
1750merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001751{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001752 sortslice ssa, ssb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 Py_ssize_t na, nb;
1754 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 assert(ms != NULL);
1757 assert(ms->n >= 2);
1758 assert(i >= 0);
1759 assert(i == ms->n - 2 || i == ms->n - 3);
Tim Petersa64dc242002-08-01 02:13:36 +00001760
Daniel Stutzbach98338222010-12-02 21:55:33 +00001761 ssa = ms->pending[i].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 na = ms->pending[i].len;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001763 ssb = ms->pending[i+1].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 nb = ms->pending[i+1].len;
1765 assert(na > 0 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001766 assert(ssa.keys + na == ssb.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 /* Record the length of the combined runs; if i is the 3rd-last
1769 * run now, also slide over the last run (which isn't involved
1770 * in this merge). The current run i+1 goes away in any case.
1771 */
1772 ms->pending[i].len = na + nb;
1773 if (i == ms->n - 3)
1774 ms->pending[i+1] = ms->pending[i+2];
1775 --ms->n;
Tim Petersa64dc242002-08-01 02:13:36 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 /* Where does b start in a? Elements in a before that can be
1778 * ignored (already in place).
1779 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001780 k = gallop_right(*ssb.keys, ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 if (k < 0)
1782 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001783 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 na -= k;
1785 if (na == 0)
1786 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 /* Where does a end in b? Elements in b after that can be
1789 * ignored (already in place).
1790 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001791 nb = gallop_left(ssa.keys[na-1], ssb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 if (nb <= 0)
1793 return nb;
Tim Petersa64dc242002-08-01 02:13:36 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 /* Merge what remains of the runs, using a temp array with
1796 * min(na, nb) elements.
1797 */
1798 if (na <= nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001799 return merge_lo(ms, ssa, na, ssb, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 else
Daniel Stutzbach98338222010-12-02 21:55:33 +00001801 return merge_hi(ms, ssa, na, ssb, nb);
Tim Petersa64dc242002-08-01 02:13:36 +00001802}
1803
1804/* Examine the stack of runs waiting to be merged, merging adjacent runs
1805 * until the stack invariants are re-established:
1806 *
1807 * 1. len[-3] > len[-2] + len[-1]
1808 * 2. len[-2] > len[-1]
1809 *
1810 * See listsort.txt for more info.
1811 *
1812 * Returns 0 on success, -1 on error.
1813 */
1814static int
1815merge_collapse(MergeState *ms)
1816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 assert(ms);
1820 while (ms->n > 1) {
1821 Py_ssize_t n = ms->n - 2;
1822 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1823 if (p[n-1].len < p[n+1].len)
1824 --n;
1825 if (merge_at(ms, n) < 0)
1826 return -1;
1827 }
1828 else if (p[n].len <= p[n+1].len) {
1829 if (merge_at(ms, n) < 0)
1830 return -1;
1831 }
1832 else
1833 break;
1834 }
1835 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001836}
1837
1838/* Regardless of invariants, merge all runs on the stack until only one
1839 * remains. This is used at the end of the mergesort.
1840 *
1841 * Returns 0 on success, -1 on error.
1842 */
1843static int
1844merge_force_collapse(MergeState *ms)
1845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 assert(ms);
1849 while (ms->n > 1) {
1850 Py_ssize_t n = ms->n - 2;
1851 if (n > 0 && p[n-1].len < p[n+1].len)
1852 --n;
1853 if (merge_at(ms, n) < 0)
1854 return -1;
1855 }
1856 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001857}
1858
1859/* Compute a good value for the minimum run length; natural runs shorter
1860 * than this are boosted artificially via binary insertion.
1861 *
1862 * If n < 64, return n (it's too small to bother with fancy stuff).
1863 * Else if n is an exact power of 2, return 32.
1864 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1865 * strictly less than, an exact power of 2.
1866 *
1867 * See listsort.txt for more info.
1868 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001869static Py_ssize_t
1870merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 assert(n >= 0);
1875 while (n >= 64) {
1876 r |= n & 1;
1877 n >>= 1;
1878 }
1879 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001880}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001881
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001882static void
Daniel Stutzbach98338222010-12-02 21:55:33 +00001883reverse_sortslice(sortslice *s, Py_ssize_t n)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001884{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001885 reverse_slice(s->keys, &s->keys[n]);
1886 if (s->values != NULL)
1887 reverse_slice(s->values, &s->values[n]);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001888}
1889
Tim Petersa64dc242002-08-01 02:13:36 +00001890/* An adaptive, stable, natural mergesort. See listsort.txt.
1891 * Returns Py_None on success, NULL on error. Even in case of error, the
1892 * list will be some permutation of its input state (nothing is lost or
1893 * duplicated).
1894 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001895static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001896listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 MergeState ms;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 Py_ssize_t nremaining;
1900 Py_ssize_t minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001901 sortslice lo;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 Py_ssize_t saved_ob_size, saved_allocated;
1903 PyObject **saved_ob_item;
1904 PyObject **final_ob_item;
1905 PyObject *result = NULL; /* guilty until proved innocent */
1906 int reverse = 0;
1907 PyObject *keyfunc = NULL;
1908 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 static char *kwlist[] = {"key", "reverse", 0};
Daniel Stutzbach98338222010-12-02 21:55:33 +00001910 PyObject **keys;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 assert(self != NULL);
1913 assert (PyList_Check(self));
1914 if (args != NULL) {
1915 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1916 kwlist, &keyfunc, &reverse))
1917 return NULL;
1918 if (Py_SIZE(args) > 0) {
1919 PyErr_SetString(PyExc_TypeError,
1920 "must use keyword argument for key function");
1921 return NULL;
1922 }
1923 }
1924 if (keyfunc == Py_None)
1925 keyfunc = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 /* The list is temporarily made empty, so that mutations performed
1928 * by comparison functions can't affect the slice of memory we're
1929 * sorting (allowing mutations during sorting is a core-dump
1930 * factory, since ob_item may change).
1931 */
1932 saved_ob_size = Py_SIZE(self);
1933 saved_ob_item = self->ob_item;
1934 saved_allocated = self->allocated;
1935 Py_SIZE(self) = 0;
1936 self->ob_item = NULL;
1937 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00001938
Daniel Stutzbach98338222010-12-02 21:55:33 +00001939 if (keyfunc == NULL) {
1940 keys = NULL;
1941 lo.keys = saved_ob_item;
1942 lo.values = NULL;
1943 }
1944 else {
1945 if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
1946 /* Leverage stack space we allocated but won't otherwise use */
1947 keys = &ms.temparray[saved_ob_size+1];
1948 else {
1949 keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size);
1950 if (keys == NULL)
1951 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001953
1954 for (i = 0; i < saved_ob_size ; i++) {
1955 keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i],
1956 NULL);
1957 if (keys[i] == NULL) {
1958 for (i=i-1 ; i>=0 ; i--)
1959 Py_DECREF(keys[i]);
Daniel Stutzbach8eda5f72011-03-02 23:37:50 +00001960 if (keys != &ms.temparray[saved_ob_size+1])
1961 PyMem_FREE(keys);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001962 goto keyfunc_fail;
1963 }
1964 }
1965
1966 lo.keys = keys;
1967 lo.values = saved_ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001969
Daniel Stutzbach98338222010-12-02 21:55:33 +00001970 merge_init(&ms, saved_ob_size, keys != NULL);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 nremaining = saved_ob_size;
1973 if (nremaining < 2)
1974 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001975
Benjamin Peterson05380642010-08-23 19:35:39 +00001976 /* Reverse sort stability achieved by initially reversing the list,
1977 applying a stable forward sort, then reversing the final result. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001978 if (reverse) {
1979 if (keys != NULL)
1980 reverse_slice(&keys[0], &keys[saved_ob_size]);
1981 reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
1982 }
Benjamin Peterson05380642010-08-23 19:35:39 +00001983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 /* March over the array once, left to right, finding natural runs,
1985 * and extending short natural runs to minrun elements.
1986 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 minrun = merge_compute_minrun(nremaining);
1988 do {
1989 int descending;
1990 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 /* Identify next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001993 n = count_run(lo.keys, lo.keys + nremaining, &descending);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 if (n < 0)
1995 goto fail;
1996 if (descending)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001997 reverse_sortslice(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 /* If short, extend to min(minrun, nremaining). */
1999 if (n < minrun) {
2000 const Py_ssize_t force = nremaining <= minrun ?
2001 nremaining : minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00002002 if (binarysort(lo, lo.keys + force, lo.keys + n) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 goto fail;
2004 n = force;
2005 }
2006 /* Push run onto pending-runs stack, and maybe merge. */
2007 assert(ms.n < MAX_MERGE_PENDING);
2008 ms.pending[ms.n].base = lo;
2009 ms.pending[ms.n].len = n;
2010 ++ms.n;
2011 if (merge_collapse(&ms) < 0)
2012 goto fail;
2013 /* Advance to find next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002014 sortslice_advance(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 nremaining -= n;
2016 } while (nremaining);
Tim Peters330f9e92002-07-19 07:05:44 +00002017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 if (merge_force_collapse(&ms) < 0)
2019 goto fail;
2020 assert(ms.n == 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002021 assert(keys == NULL
2022 ? ms.pending[0].base.keys == saved_ob_item
2023 : ms.pending[0].base.keys == &keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 assert(ms.pending[0].len == saved_ob_size);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002025 lo = ms.pending[0].base;
Tim Petersa64dc242002-08-01 02:13:36 +00002026
2027succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002029fail:
Daniel Stutzbach98338222010-12-02 21:55:33 +00002030 if (keys != NULL) {
2031 for (i = 0; i < saved_ob_size; i++)
2032 Py_DECREF(keys[i]);
2033 if (keys != &ms.temparray[saved_ob_size+1])
2034 PyMem_FREE(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 if (self->allocated != -1 && result != NULL) {
2038 /* The user mucked with the list during the sort,
2039 * and we don't already have another error to report.
2040 */
2041 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2042 result = NULL;
2043 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 if (reverse && saved_ob_size > 1)
2046 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 merge_freemem(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002049
Daniel Stutzbach98338222010-12-02 21:55:33 +00002050keyfunc_fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 final_ob_item = self->ob_item;
2052 i = Py_SIZE(self);
2053 Py_SIZE(self) = saved_ob_size;
2054 self->ob_item = saved_ob_item;
2055 self->allocated = saved_allocated;
2056 if (final_ob_item != NULL) {
2057 /* we cannot use list_clear() for this because it does not
2058 guarantee that the list is really empty when it returns */
2059 while (--i >= 0) {
2060 Py_XDECREF(final_ob_item[i]);
2061 }
2062 PyMem_FREE(final_ob_item);
2063 }
2064 Py_XINCREF(result);
2065 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002066}
Tim Peters330f9e92002-07-19 07:05:44 +00002067#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002068#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002069
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002070int
Fred Drakea2f55112000-07-09 15:16:51 +00002071PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 if (v == NULL || !PyList_Check(v)) {
2074 PyErr_BadInternalCall();
2075 return -1;
2076 }
2077 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2078 if (v == NULL)
2079 return -1;
2080 Py_DECREF(v);
2081 return 0;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002082}
2083
Guido van Rossumb86c5492001-02-12 22:06:02 +00002084static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002085listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 if (Py_SIZE(self) > 1)
2088 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2089 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002090}
2091
Guido van Rossum84c76f51990-10-30 13:32:20 +00002092int
Fred Drakea2f55112000-07-09 15:16:51 +00002093PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 PyListObject *self = (PyListObject *)v;
Tim Peters6063e262002-08-08 01:06:39 +00002096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 if (v == NULL || !PyList_Check(v)) {
2098 PyErr_BadInternalCall();
2099 return -1;
2100 }
2101 if (Py_SIZE(self) > 1)
2102 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2103 return 0;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002104}
2105
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002106PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002107PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 PyObject *w;
2110 PyObject **p, **q;
2111 Py_ssize_t n;
2112 if (v == NULL || !PyList_Check(v)) {
2113 PyErr_BadInternalCall();
2114 return NULL;
2115 }
2116 n = Py_SIZE(v);
2117 w = PyTuple_New(n);
2118 if (w == NULL)
2119 return NULL;
2120 p = ((PyTupleObject *)w)->ob_item;
2121 q = ((PyListObject *)v)->ob_item;
2122 while (--n >= 0) {
2123 Py_INCREF(*q);
2124 *p = *q;
2125 p++;
2126 q++;
2127 }
2128 return w;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002129}
2130
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002131static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002132listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 Py_ssize_t i, start=0, stop=Py_SIZE(self);
2135 PyObject *v, *format_tuple, *err_string;
2136 static PyObject *err_format = NULL;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2139 _PyEval_SliceIndex, &start,
2140 _PyEval_SliceIndex, &stop))
2141 return NULL;
2142 if (start < 0) {
2143 start += Py_SIZE(self);
2144 if (start < 0)
2145 start = 0;
2146 }
2147 if (stop < 0) {
2148 stop += Py_SIZE(self);
2149 if (stop < 0)
2150 stop = 0;
2151 }
2152 for (i = start; i < stop && i < Py_SIZE(self); i++) {
2153 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2154 if (cmp > 0)
2155 return PyLong_FromSsize_t(i);
2156 else if (cmp < 0)
2157 return NULL;
2158 }
2159 if (err_format == NULL) {
2160 err_format = PyUnicode_FromString("%r is not in list");
2161 if (err_format == NULL)
2162 return NULL;
2163 }
2164 format_tuple = PyTuple_Pack(1, v);
2165 if (format_tuple == NULL)
2166 return NULL;
2167 err_string = PyUnicode_Format(err_format, format_tuple);
2168 Py_DECREF(format_tuple);
2169 if (err_string == NULL)
2170 return NULL;
2171 PyErr_SetObject(PyExc_ValueError, err_string);
2172 Py_DECREF(err_string);
2173 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002174}
2175
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002176static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002177listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 Py_ssize_t count = 0;
2180 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 for (i = 0; i < Py_SIZE(self); i++) {
2183 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2184 if (cmp > 0)
2185 count++;
2186 else if (cmp < 0)
2187 return NULL;
2188 }
2189 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002190}
2191
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002192static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002193listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 for (i = 0; i < Py_SIZE(self); i++) {
2198 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2199 if (cmp > 0) {
2200 if (list_ass_slice(self, i, i+1,
2201 (PyObject *)NULL) == 0)
2202 Py_RETURN_NONE;
2203 return NULL;
2204 }
2205 else if (cmp < 0)
2206 return NULL;
2207 }
2208 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2209 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002210}
2211
Jeremy Hylton8caad492000-06-23 14:18:11 +00002212static int
2213list_traverse(PyListObject *o, visitproc visit, void *arg)
2214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 for (i = Py_SIZE(o); --i >= 0; )
2218 Py_VISIT(o->ob_item[i]);
2219 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002220}
2221
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002222static PyObject *
2223list_richcompare(PyObject *v, PyObject *w, int op)
2224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 PyListObject *vl, *wl;
2226 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002227
Brian Curtindfc80e32011-08-10 20:28:54 -05002228 if (!PyList_Check(v) || !PyList_Check(w))
2229 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 vl = (PyListObject *)v;
2232 wl = (PyListObject *)w;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2235 /* Shortcut: if the lengths differ, the lists differ */
2236 PyObject *res;
2237 if (op == Py_EQ)
2238 res = Py_False;
2239 else
2240 res = Py_True;
2241 Py_INCREF(res);
2242 return res;
2243 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 /* Search for the first index where items are different */
2246 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2247 int k = PyObject_RichCompareBool(vl->ob_item[i],
2248 wl->ob_item[i], Py_EQ);
2249 if (k < 0)
2250 return NULL;
2251 if (!k)
2252 break;
2253 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2256 /* No more items to compare -- compare sizes */
2257 Py_ssize_t vs = Py_SIZE(vl);
2258 Py_ssize_t ws = Py_SIZE(wl);
2259 int cmp;
2260 PyObject *res;
2261 switch (op) {
2262 case Py_LT: cmp = vs < ws; break;
2263 case Py_LE: cmp = vs <= ws; break;
2264 case Py_EQ: cmp = vs == ws; break;
2265 case Py_NE: cmp = vs != ws; break;
2266 case Py_GT: cmp = vs > ws; break;
2267 case Py_GE: cmp = vs >= ws; break;
2268 default: return NULL; /* cannot happen */
2269 }
2270 if (cmp)
2271 res = Py_True;
2272 else
2273 res = Py_False;
2274 Py_INCREF(res);
2275 return res;
2276 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 /* We have an item that differs -- shortcuts for EQ/NE */
2279 if (op == Py_EQ) {
2280 Py_INCREF(Py_False);
2281 return Py_False;
2282 }
2283 if (op == Py_NE) {
2284 Py_INCREF(Py_True);
2285 return Py_True;
2286 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 /* Compare the final item again using the proper operator */
2289 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002290}
2291
Tim Peters6d6c1a32001-08-02 04:15:00 +00002292static int
2293list_init(PyListObject *self, PyObject *args, PyObject *kw)
2294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 PyObject *arg = NULL;
2296 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2299 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 /* Verify list invariants established by PyType_GenericAlloc() */
2302 assert(0 <= Py_SIZE(self));
2303 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2304 assert(self->ob_item != NULL ||
2305 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 /* Empty previous contents */
2308 if (self->ob_item != NULL) {
2309 (void)list_clear(self);
2310 }
2311 if (arg != NULL) {
2312 PyObject *rv = listextend(self, arg);
2313 if (rv == NULL)
2314 return -1;
2315 Py_DECREF(rv);
2316 }
2317 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002318}
2319
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002320static PyObject *
2321list_sizeof(PyListObject *self)
2322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
2326 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002327}
2328
Raymond Hettinger1021c442003-11-07 15:38:09 +00002329static PyObject *list_iter(PyObject *seq);
2330static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2331
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002332PyDoc_STRVAR(getitem_doc,
2333"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002334PyDoc_STRVAR(reversed_doc,
2335"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002336PyDoc_STRVAR(sizeof_doc,
2337"L.__sizeof__() -- size of L in memory, in bytes");
Eli Benderskycbbaa962011-02-25 05:47:53 +00002338PyDoc_STRVAR(clear_doc,
2339"L.clear() -> None -- remove all items from L");
2340PyDoc_STRVAR(copy_doc,
2341"L.copy() -> list -- a shallow copy of L");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002342PyDoc_STRVAR(append_doc,
2343"L.append(object) -- append object to end");
2344PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002345"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346PyDoc_STRVAR(insert_doc,
2347"L.insert(index, object) -- insert object before index");
2348PyDoc_STRVAR(pop_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002349"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2350"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002351PyDoc_STRVAR(remove_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002352"L.remove(value) -- remove first occurrence of value.\n"
2353"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002354PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002355"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2356"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002357PyDoc_STRVAR(count_doc,
2358"L.count(value) -> integer -- return number of occurrences of value");
2359PyDoc_STRVAR(reverse_doc,
2360"L.reverse() -- reverse *IN PLACE*");
2361PyDoc_STRVAR(sort_doc,
Benjamin Petersoncb9a5512008-09-30 02:08:36 +00002362"L.sort(key=None, reverse=False) -- stable sort *IN PLACE*");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002363
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002364static PyObject *list_subscript(PyListObject*, PyObject*);
2365
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002366static PyMethodDef list_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2368 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2369 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002370 {"clear", (PyCFunction)listclear, METH_NOARGS, clear_doc},
2371 {"copy", (PyCFunction)listcopy, METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 {"append", (PyCFunction)listappend, METH_O, append_doc},
2373 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002374 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
2376 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2377 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
2378 {"count", (PyCFunction)listcount, METH_O, count_doc},
2379 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2380 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
2381 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002382};
2383
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002384static PySequenceMethods list_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 (lenfunc)list_length, /* sq_length */
2386 (binaryfunc)list_concat, /* sq_concat */
2387 (ssizeargfunc)list_repeat, /* sq_repeat */
2388 (ssizeargfunc)list_item, /* sq_item */
2389 0, /* sq_slice */
2390 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2391 0, /* sq_ass_slice */
2392 (objobjproc)list_contains, /* sq_contains */
2393 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2394 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002395};
2396
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002397PyDoc_STRVAR(list_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002398"list() -> new empty list\n"
2399"list(iterable) -> new list initialized from iterable's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002400
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002401static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002402list_subscript(PyListObject* self, PyObject* item)
2403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 if (PyIndex_Check(item)) {
2405 Py_ssize_t i;
2406 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2407 if (i == -1 && PyErr_Occurred())
2408 return NULL;
2409 if (i < 0)
2410 i += PyList_GET_SIZE(self);
2411 return list_item(self, i);
2412 }
2413 else if (PySlice_Check(item)) {
2414 Py_ssize_t start, stop, step, slicelength, cur, i;
2415 PyObject* result;
2416 PyObject* it;
2417 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002418
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002419 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 &start, &stop, &step, &slicelength) < 0) {
2421 return NULL;
2422 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 if (slicelength <= 0) {
2425 return PyList_New(0);
2426 }
2427 else if (step == 1) {
2428 return list_slice(self, start, stop);
2429 }
2430 else {
2431 result = PyList_New(slicelength);
2432 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 src = self->ob_item;
2435 dest = ((PyListObject *)result)->ob_item;
2436 for (cur = start, i = 0; i < slicelength;
2437 cur += step, i++) {
2438 it = src[cur];
2439 Py_INCREF(it);
2440 dest[i] = it;
2441 }
Tim Peters3b01a122002-07-19 02:35:45 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 return result;
2444 }
2445 }
2446 else {
2447 PyErr_Format(PyExc_TypeError,
2448 "list indices must be integers, not %.200s",
2449 item->ob_type->tp_name);
2450 return NULL;
2451 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002452}
2453
Tim Peters3b01a122002-07-19 02:35:45 +00002454static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002455list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 if (PyIndex_Check(item)) {
2458 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2459 if (i == -1 && PyErr_Occurred())
2460 return -1;
2461 if (i < 0)
2462 i += PyList_GET_SIZE(self);
2463 return list_ass_item(self, i, value);
2464 }
2465 else if (PySlice_Check(item)) {
2466 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002467
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002468 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 &start, &stop, &step, &slicelength) < 0) {
2470 return -1;
2471 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (step == 1)
2474 return list_ass_slice(self, start, stop, value);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 /* Make sure s[5:2] = [..] inserts at the right place:
2477 before 5, not before 2. */
2478 if ((step < 0 && start < stop) ||
2479 (step > 0 && start > stop))
2480 stop = start;
Thomas Woutersed03b412007-08-28 21:37:11 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 if (value == NULL) {
2483 /* delete slice */
2484 PyObject **garbage;
2485 size_t cur;
2486 Py_ssize_t i;
Tim Peters3b01a122002-07-19 02:35:45 +00002487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 if (slicelength <= 0)
2489 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 if (step < 0) {
2492 stop = start + 1;
2493 start = stop + step*(slicelength - 1) - 1;
2494 step = -step;
2495 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 assert((size_t)slicelength <=
2498 PY_SIZE_MAX / sizeof(PyObject*));
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 garbage = (PyObject**)
2501 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2502 if (!garbage) {
2503 PyErr_NoMemory();
2504 return -1;
2505 }
Tim Peters3b01a122002-07-19 02:35:45 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 /* drawing pictures might help understand these for
2508 loops. Basically, we memmove the parts of the
2509 list that are *not* part of the slice: step-1
2510 items for each item that is part of the slice,
2511 and then tail end of the list that was not
2512 covered by the slice */
2513 for (cur = start, i = 0;
2514 cur < (size_t)stop;
2515 cur += step, i++) {
2516 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 garbage[i] = PyList_GET_ITEM(self, cur);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 if (cur + step >= (size_t)Py_SIZE(self)) {
2521 lim = Py_SIZE(self) - cur - 1;
2522 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 memmove(self->ob_item + cur - i,
2525 self->ob_item + cur + 1,
2526 lim * sizeof(PyObject *));
2527 }
2528 cur = start + slicelength*step;
2529 if (cur < (size_t)Py_SIZE(self)) {
2530 memmove(self->ob_item + cur - slicelength,
2531 self->ob_item + cur,
2532 (Py_SIZE(self) - cur) *
2533 sizeof(PyObject *));
2534 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 Py_SIZE(self) -= slicelength;
2537 list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 for (i = 0; i < slicelength; i++) {
2540 Py_DECREF(garbage[i]);
2541 }
2542 PyMem_FREE(garbage);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 return 0;
2545 }
2546 else {
2547 /* assign slice */
2548 PyObject *ins, *seq;
2549 PyObject **garbage, **seqitems, **selfitems;
2550 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 /* protect against a[::-1] = a */
2553 if (self == (PyListObject*)value) {
2554 seq = list_slice((PyListObject*)value, 0,
2555 PyList_GET_SIZE(value));
2556 }
2557 else {
2558 seq = PySequence_Fast(value,
2559 "must assign iterable "
2560 "to extended slice");
2561 }
2562 if (!seq)
2563 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2566 PyErr_Format(PyExc_ValueError,
2567 "attempt to assign sequence of "
2568 "size %zd to extended slice of "
2569 "size %zd",
2570 PySequence_Fast_GET_SIZE(seq),
2571 slicelength);
2572 Py_DECREF(seq);
2573 return -1;
2574 }
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 if (!slicelength) {
2577 Py_DECREF(seq);
2578 return 0;
2579 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 garbage = (PyObject**)
2582 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2583 if (!garbage) {
2584 Py_DECREF(seq);
2585 PyErr_NoMemory();
2586 return -1;
2587 }
Tim Peters3b01a122002-07-19 02:35:45 +00002588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 selfitems = self->ob_item;
2590 seqitems = PySequence_Fast_ITEMS(seq);
2591 for (cur = start, i = 0; i < slicelength;
2592 cur += step, i++) {
2593 garbage[i] = selfitems[cur];
2594 ins = seqitems[i];
2595 Py_INCREF(ins);
2596 selfitems[cur] = ins;
2597 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 for (i = 0; i < slicelength; i++) {
2600 Py_DECREF(garbage[i]);
2601 }
Tim Peters3b01a122002-07-19 02:35:45 +00002602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 PyMem_FREE(garbage);
2604 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 return 0;
2607 }
2608 }
2609 else {
2610 PyErr_Format(PyExc_TypeError,
2611 "list indices must be integers, not %.200s",
2612 item->ob_type->tp_name);
2613 return -1;
2614 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002615}
2616
2617static PyMappingMethods list_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 (lenfunc)list_length,
2619 (binaryfunc)list_subscript,
2620 (objobjargproc)list_ass_subscript
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002621};
2622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002623PyTypeObject PyList_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2625 "list",
2626 sizeof(PyListObject),
2627 0,
2628 (destructor)list_dealloc, /* tp_dealloc */
2629 0, /* tp_print */
2630 0, /* tp_getattr */
2631 0, /* tp_setattr */
2632 0, /* tp_reserved */
2633 (reprfunc)list_repr, /* tp_repr */
2634 0, /* tp_as_number */
2635 &list_as_sequence, /* tp_as_sequence */
2636 &list_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002637 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 0, /* tp_call */
2639 0, /* tp_str */
2640 PyObject_GenericGetAttr, /* tp_getattro */
2641 0, /* tp_setattro */
2642 0, /* tp_as_buffer */
2643 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2644 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
2645 list_doc, /* tp_doc */
2646 (traverseproc)list_traverse, /* tp_traverse */
2647 (inquiry)list_clear, /* tp_clear */
2648 list_richcompare, /* tp_richcompare */
2649 0, /* tp_weaklistoffset */
2650 list_iter, /* tp_iter */
2651 0, /* tp_iternext */
2652 list_methods, /* tp_methods */
2653 0, /* tp_members */
2654 0, /* tp_getset */
2655 0, /* tp_base */
2656 0, /* tp_dict */
2657 0, /* tp_descr_get */
2658 0, /* tp_descr_set */
2659 0, /* tp_dictoffset */
2660 (initproc)list_init, /* tp_init */
2661 PyType_GenericAlloc, /* tp_alloc */
2662 PyType_GenericNew, /* tp_new */
2663 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002664};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002665
2666
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002667/*********************** List Iterator **************************/
2668
2669typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 PyObject_HEAD
2671 long it_index;
2672 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002673} listiterobject;
2674
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002675static PyObject *list_iter(PyObject *);
2676static void listiter_dealloc(listiterobject *);
2677static int listiter_traverse(listiterobject *, visitproc, void *);
2678static PyObject *listiter_next(listiterobject *);
2679static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002680
Armin Rigof5b3e362006-02-11 21:32:43 +00002681PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002682
2683static PyMethodDef listiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2685 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002686};
2687
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002688PyTypeObject PyListIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2690 "list_iterator", /* tp_name */
2691 sizeof(listiterobject), /* tp_basicsize */
2692 0, /* tp_itemsize */
2693 /* methods */
2694 (destructor)listiter_dealloc, /* tp_dealloc */
2695 0, /* tp_print */
2696 0, /* tp_getattr */
2697 0, /* tp_setattr */
2698 0, /* tp_reserved */
2699 0, /* tp_repr */
2700 0, /* tp_as_number */
2701 0, /* tp_as_sequence */
2702 0, /* tp_as_mapping */
2703 0, /* tp_hash */
2704 0, /* tp_call */
2705 0, /* tp_str */
2706 PyObject_GenericGetAttr, /* tp_getattro */
2707 0, /* tp_setattro */
2708 0, /* tp_as_buffer */
2709 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2710 0, /* tp_doc */
2711 (traverseproc)listiter_traverse, /* tp_traverse */
2712 0, /* tp_clear */
2713 0, /* tp_richcompare */
2714 0, /* tp_weaklistoffset */
2715 PyObject_SelfIter, /* tp_iter */
2716 (iternextfunc)listiter_next, /* tp_iternext */
2717 listiter_methods, /* tp_methods */
2718 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002719};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002720
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002721
2722static PyObject *
2723list_iter(PyObject *seq)
2724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 listiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 if (!PyList_Check(seq)) {
2728 PyErr_BadInternalCall();
2729 return NULL;
2730 }
2731 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2732 if (it == NULL)
2733 return NULL;
2734 it->it_index = 0;
2735 Py_INCREF(seq);
2736 it->it_seq = (PyListObject *)seq;
2737 _PyObject_GC_TRACK(it);
2738 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002739}
2740
2741static void
2742listiter_dealloc(listiterobject *it)
2743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 _PyObject_GC_UNTRACK(it);
2745 Py_XDECREF(it->it_seq);
2746 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002747}
2748
2749static int
2750listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 Py_VISIT(it->it_seq);
2753 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002754}
2755
2756static PyObject *
2757listiter_next(listiterobject *it)
2758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 PyListObject *seq;
2760 PyObject *item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 assert(it != NULL);
2763 seq = it->it_seq;
2764 if (seq == NULL)
2765 return NULL;
2766 assert(PyList_Check(seq));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 if (it->it_index < PyList_GET_SIZE(seq)) {
2769 item = PyList_GET_ITEM(seq, it->it_index);
2770 ++it->it_index;
2771 Py_INCREF(item);
2772 return item;
2773 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 Py_DECREF(seq);
2776 it->it_seq = NULL;
2777 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002778}
2779
2780static PyObject *
2781listiter_len(listiterobject *it)
2782{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 Py_ssize_t len;
2784 if (it->it_seq) {
2785 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2786 if (len >= 0)
2787 return PyLong_FromSsize_t(len);
2788 }
2789 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002790}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002791/*********************** List Reverse Iterator **************************/
2792
2793typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 PyObject_HEAD
2795 Py_ssize_t it_index;
2796 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002797} listreviterobject;
2798
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002799static PyObject *list_reversed(PyListObject *, PyObject *);
2800static void listreviter_dealloc(listreviterobject *);
2801static int listreviter_traverse(listreviterobject *, visitproc, void *);
2802static PyObject *listreviter_next(listreviterobject *);
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002803static PyObject *listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002804
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002805static PyMethodDef listreviter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
2807 {NULL, NULL} /* sentinel */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002808};
2809
Raymond Hettinger1021c442003-11-07 15:38:09 +00002810PyTypeObject PyListRevIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2812 "list_reverseiterator", /* tp_name */
2813 sizeof(listreviterobject), /* tp_basicsize */
2814 0, /* tp_itemsize */
2815 /* methods */
2816 (destructor)listreviter_dealloc, /* tp_dealloc */
2817 0, /* tp_print */
2818 0, /* tp_getattr */
2819 0, /* tp_setattr */
2820 0, /* tp_reserved */
2821 0, /* tp_repr */
2822 0, /* tp_as_number */
2823 0, /* tp_as_sequence */
2824 0, /* tp_as_mapping */
2825 0, /* tp_hash */
2826 0, /* tp_call */
2827 0, /* tp_str */
2828 PyObject_GenericGetAttr, /* tp_getattro */
2829 0, /* tp_setattro */
2830 0, /* tp_as_buffer */
2831 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2832 0, /* tp_doc */
2833 (traverseproc)listreviter_traverse, /* tp_traverse */
2834 0, /* tp_clear */
2835 0, /* tp_richcompare */
2836 0, /* tp_weaklistoffset */
2837 PyObject_SelfIter, /* tp_iter */
2838 (iternextfunc)listreviter_next, /* tp_iternext */
2839 listreviter_methods, /* tp_methods */
2840 0,
Raymond Hettinger1021c442003-11-07 15:38:09 +00002841};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002842
2843static PyObject *
2844list_reversed(PyListObject *seq, PyObject *unused)
2845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 listreviterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2849 if (it == NULL)
2850 return NULL;
2851 assert(PyList_Check(seq));
2852 it->it_index = PyList_GET_SIZE(seq) - 1;
2853 Py_INCREF(seq);
2854 it->it_seq = seq;
2855 PyObject_GC_Track(it);
2856 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002857}
2858
2859static void
2860listreviter_dealloc(listreviterobject *it)
2861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 PyObject_GC_UnTrack(it);
2863 Py_XDECREF(it->it_seq);
2864 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002865}
2866
2867static int
2868listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 Py_VISIT(it->it_seq);
2871 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002872}
2873
2874static PyObject *
2875listreviter_next(listreviterobject *it)
2876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 PyObject *item;
2878 Py_ssize_t index = it->it_index;
2879 PyListObject *seq = it->it_seq;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2882 item = PyList_GET_ITEM(seq, index);
2883 it->it_index--;
2884 Py_INCREF(item);
2885 return item;
2886 }
2887 it->it_index = -1;
2888 if (seq != NULL) {
2889 it->it_seq = NULL;
2890 Py_DECREF(seq);
2891 }
2892 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002893}
2894
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002895static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002896listreviter_len(listreviterobject *it)
2897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 Py_ssize_t len = it->it_index + 1;
2899 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2900 len = 0;
2901 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002902}