blob: 36f8b9dc70b9cdd0e2277440317bb67398d168d5 [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;
Mark Dickinsonc0420fd2011-09-19 19:18:37 +010061 if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 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;
Mark Dickinsonc0420fd2011-09-19 19:18:37 +0100513 if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 return PyErr_NoMemory();
Mark Dickinsonc0420fd2011-09-19 19:18:37 +0100515 size = Py_SIZE(a) * n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 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 *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000750listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 if (app1(self, v) == 0)
753 Py_RETURN_NONE;
754 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000755}
756
Barry Warsawdedf6d61998-10-09 16:37:25 +0000757static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000758listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 PyObject *it; /* iter(v) */
761 Py_ssize_t m; /* size of self */
762 Py_ssize_t n; /* guess for size of b */
763 Py_ssize_t mn; /* m + n */
764 Py_ssize_t i;
765 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 /* Special cases:
768 1) lists and tuples which can use PySequence_Fast ops
769 2) extending self to self requires making a copy first
770 */
771 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
772 PyObject **src, **dest;
773 b = PySequence_Fast(b, "argument must be iterable");
774 if (!b)
775 return NULL;
776 n = PySequence_Fast_GET_SIZE(b);
777 if (n == 0) {
778 /* short circuit when b is empty */
779 Py_DECREF(b);
780 Py_RETURN_NONE;
781 }
782 m = Py_SIZE(self);
783 if (list_resize(self, m + n) == -1) {
784 Py_DECREF(b);
785 return NULL;
786 }
787 /* note that we may still have self == b here for the
788 * situation a.extend(a), but the following code works
789 * in that case too. Just make sure to resize self
790 * before calling PySequence_Fast_ITEMS.
791 */
792 /* populate the end of self with b's items */
793 src = PySequence_Fast_ITEMS(b);
794 dest = self->ob_item + m;
795 for (i = 0; i < n; i++) {
796 PyObject *o = src[i];
797 Py_INCREF(o);
798 dest[i] = o;
799 }
800 Py_DECREF(b);
801 Py_RETURN_NONE;
802 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 it = PyObject_GetIter(b);
805 if (it == NULL)
806 return NULL;
807 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 /* Guess a result list size. */
810 n = _PyObject_LengthHint(b, 8);
811 if (n == -1) {
812 Py_DECREF(it);
813 return NULL;
814 }
815 m = Py_SIZE(self);
816 mn = m + n;
817 if (mn >= m) {
818 /* Make room. */
819 if (list_resize(self, mn) == -1)
820 goto error;
821 /* Make the list sane again. */
822 Py_SIZE(self) = m;
823 }
824 /* Else m + n overflowed; on the chance that n lied, and there really
825 * is enough room, ignore it. If n was telling the truth, we'll
826 * eventually run out of memory during the loop.
827 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 /* Run iterator to exhaustion. */
830 for (;;) {
831 PyObject *item = iternext(it);
832 if (item == NULL) {
833 if (PyErr_Occurred()) {
834 if (PyErr_ExceptionMatches(PyExc_StopIteration))
835 PyErr_Clear();
836 else
837 goto error;
838 }
839 break;
840 }
841 if (Py_SIZE(self) < self->allocated) {
842 /* steals ref */
843 PyList_SET_ITEM(self, Py_SIZE(self), item);
844 ++Py_SIZE(self);
845 }
846 else {
847 int status = app1(self, item);
848 Py_DECREF(item); /* append creates a new ref */
849 if (status < 0)
850 goto error;
851 }
852 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 /* Cut back result list if initial guess was too large. */
855 if (Py_SIZE(self) < self->allocated)
856 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 Py_DECREF(it);
859 Py_RETURN_NONE;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000860
861 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 Py_DECREF(it);
863 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000864}
865
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000866PyObject *
867_PyList_Extend(PyListObject *self, PyObject *b)
868{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 return listextend(self, b);
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000870}
871
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000872static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000873list_inplace_concat(PyListObject *self, PyObject *other)
874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 PyObject *result;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 result = listextend(self, other);
878 if (result == NULL)
879 return result;
880 Py_DECREF(result);
881 Py_INCREF(self);
882 return (PyObject *)self;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000883}
884
885static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000886listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 Py_ssize_t i = -1;
889 PyObject *v;
890 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 if (!PyArg_ParseTuple(args, "|n:pop", &i))
893 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 if (Py_SIZE(self) == 0) {
896 /* Special-case most common failure cause */
897 PyErr_SetString(PyExc_IndexError, "pop from empty list");
898 return NULL;
899 }
900 if (i < 0)
901 i += Py_SIZE(self);
902 if (i < 0 || i >= Py_SIZE(self)) {
903 PyErr_SetString(PyExc_IndexError, "pop index out of range");
904 return NULL;
905 }
906 v = self->ob_item[i];
907 if (i == Py_SIZE(self) - 1) {
908 status = list_resize(self, Py_SIZE(self) - 1);
909 assert(status >= 0);
910 return v; /* and v now owns the reference the list had */
911 }
912 Py_INCREF(v);
913 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
914 assert(status >= 0);
915 /* Use status, so that in a release build compilers don't
916 * complain about the unused name.
917 */
918 (void) status;
Brett Cannon651dd522004-08-08 21:21:18 +0000919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000921}
922
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000923/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
924static void
925reverse_slice(PyObject **lo, PyObject **hi)
926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 assert(lo && hi);
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 --hi;
930 while (lo < hi) {
931 PyObject *t = *lo;
932 *lo = *hi;
933 *hi = t;
934 ++lo;
935 --hi;
936 }
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000937}
938
Tim Petersa64dc242002-08-01 02:13:36 +0000939/* Lots of code for an adaptive, stable, natural mergesort. There are many
940 * pieces to this algorithm; read listsort.txt for overviews and details.
941 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000942
Daniel Stutzbach98338222010-12-02 21:55:33 +0000943/* A sortslice contains a pointer to an array of keys and a pointer to
944 * an array of corresponding values. In other words, keys[i]
945 * corresponds with values[i]. If values == NULL, then the keys are
946 * also the values.
947 *
948 * Several convenience routines are provided here, so that keys and
949 * values are always moved in sync.
950 */
951
952typedef struct {
953 PyObject **keys;
954 PyObject **values;
955} sortslice;
956
957Py_LOCAL_INLINE(void)
958sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
959{
960 s1->keys[i] = s2->keys[j];
961 if (s1->values != NULL)
962 s1->values[i] = s2->values[j];
963}
964
965Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000966sortslice_copy_incr(sortslice *dst, sortslice *src)
967{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000968 *dst->keys++ = *src->keys++;
969 if (dst->values != NULL)
970 *dst->values++ = *src->values++;
971}
972
973Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000974sortslice_copy_decr(sortslice *dst, sortslice *src)
975{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000976 *dst->keys-- = *src->keys--;
977 if (dst->values != NULL)
978 *dst->values-- = *src->values--;
979}
980
981
982Py_LOCAL_INLINE(void)
983sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000984 Py_ssize_t n)
985{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000986 memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
987 if (s1->values != NULL)
988 memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
989}
990
991Py_LOCAL_INLINE(void)
992sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000993 Py_ssize_t n)
994{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000995 memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
996 if (s1->values != NULL)
997 memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
998}
999
1000Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001001sortslice_advance(sortslice *slice, Py_ssize_t n)
1002{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001003 slice->keys += n;
1004 if (slice->values != NULL)
1005 slice->values += n;
1006}
1007
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001008/* Comparison function: PyObject_RichCompareBool with Py_LT.
Tim Petersa64dc242002-08-01 02:13:36 +00001009 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1010 */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001011
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001012#define ISLT(X, Y) (PyObject_RichCompareBool(X, Y, Py_LT))
Tim Peters66860f62002-08-04 17:47:26 +00001013
1014/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +00001015 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
1016 started. It makes more sense in context <wink>. X and Y are PyObject*s.
1017*/
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001018#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001020
1021/* binarysort is the best method for sorting small arrays: it does
1022 few compares, but can do data movement quadratic in the number of
1023 elements.
Guido van Rossum42812581998-06-17 14:15:44 +00001024 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +00001025 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001026 On entry, must have lo <= start <= hi, and that [lo, start) is already
1027 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +00001028 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001029 Even in case of error, the output slice will be some permutation of
1030 the input (nothing is lost or duplicated).
1031*/
Guido van Rossum3f236de1996-12-10 23:55:39 +00001032static int
Daniel Stutzbach98338222010-12-02 21:55:33 +00001033binarysort(sortslice lo, PyObject **hi, PyObject **start)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 register Py_ssize_t k;
1036 register PyObject **l, **p, **r;
1037 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001038
Daniel Stutzbach98338222010-12-02 21:55:33 +00001039 assert(lo.keys <= start && start <= hi);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 /* assert [lo, start) is sorted */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001041 if (lo.keys == start)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 ++start;
1043 for (; start < hi; ++start) {
1044 /* set l to where *start belongs */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001045 l = lo.keys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 r = start;
1047 pivot = *r;
1048 /* Invariants:
1049 * pivot >= all in [lo, l).
1050 * pivot < all in [r, start).
1051 * The second is vacuously true at the start.
1052 */
1053 assert(l < r);
1054 do {
1055 p = l + ((r - l) >> 1);
1056 IFLT(pivot, *p)
1057 r = p;
1058 else
1059 l = p+1;
1060 } while (l < r);
1061 assert(l == r);
1062 /* The invariants still hold, so pivot >= all in [lo, l) and
1063 pivot < all in [l, start), so pivot belongs at l. Note
1064 that if there are elements equal to pivot, l points to the
1065 first slot after them -- that's why this sort is stable.
1066 Slide over to make room.
1067 Caution: using memmove is much slower under MSVC 5;
1068 we're not usually moving many slots. */
1069 for (p = start; p > l; --p)
1070 *p = *(p-1);
1071 *l = pivot;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001072 if (lo.values != NULL) {
1073 Py_ssize_t offset = lo.values - lo.keys;
1074 p = start + offset;
1075 pivot = *p;
1076 l += offset;
1077 for (p = start + offset; p > l; --p)
1078 *p = *(p-1);
1079 *l = pivot;
1080 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 }
1082 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001083
1084 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001086}
1087
Tim Petersa64dc242002-08-01 02:13:36 +00001088/*
1089Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1090is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001091
Tim Petersa64dc242002-08-01 02:13:36 +00001092 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001093
Tim Petersa64dc242002-08-01 02:13:36 +00001094or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001095
Tim Petersa64dc242002-08-01 02:13:36 +00001096 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001097
Tim Petersa64dc242002-08-01 02:13:36 +00001098Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1099For its intended use in a stable mergesort, the strictness of the defn of
1100"descending" is needed so that the caller can safely reverse a descending
1101sequence without violating stability (strict > ensures there are no equal
1102elements to get out of order).
1103
1104Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001105*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001106static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001107count_run(PyObject **lo, PyObject **hi, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 Py_ssize_t k;
1110 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 assert(lo < hi);
1113 *descending = 0;
1114 ++lo;
1115 if (lo == hi)
1116 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 n = 2;
1119 IFLT(*lo, *(lo-1)) {
1120 *descending = 1;
1121 for (lo = lo+1; lo < hi; ++lo, ++n) {
1122 IFLT(*lo, *(lo-1))
1123 ;
1124 else
1125 break;
1126 }
1127 }
1128 else {
1129 for (lo = lo+1; lo < hi; ++lo, ++n) {
1130 IFLT(*lo, *(lo-1))
1131 break;
1132 }
1133 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 return n;
Tim Petersa64dc242002-08-01 02:13:36 +00001136fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001138}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001139
Tim Petersa64dc242002-08-01 02:13:36 +00001140/*
1141Locate the proper position of key in a sorted vector; if the vector contains
1142an element equal to key, return the position immediately to the left of
1143the leftmost equal element. [gallop_right() does the same except returns
1144the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001145
Tim Petersa64dc242002-08-01 02:13:36 +00001146"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001147
Tim Petersa64dc242002-08-01 02:13:36 +00001148"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1149hint is to the final result, the faster this runs.
1150
1151The return value is the int k in 0..n such that
1152
1153 a[k-1] < key <= a[k]
1154
1155pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1156key belongs at index k; or, IOW, the first k elements of a should precede
1157key, and the last n-k should follow key.
1158
1159Returns -1 on error. See listsort.txt for info on the method.
1160*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001161static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001162gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 Py_ssize_t ofs;
1165 Py_ssize_t lastofs;
1166 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 a += hint;
1171 lastofs = 0;
1172 ofs = 1;
1173 IFLT(*a, key) {
1174 /* a[hint] < key -- gallop right, until
1175 * a[hint + lastofs] < key <= a[hint + ofs]
1176 */
1177 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1178 while (ofs < maxofs) {
1179 IFLT(a[ofs], key) {
1180 lastofs = ofs;
1181 ofs = (ofs << 1) + 1;
1182 if (ofs <= 0) /* int overflow */
1183 ofs = maxofs;
1184 }
1185 else /* key <= a[hint + ofs] */
1186 break;
1187 }
1188 if (ofs > maxofs)
1189 ofs = maxofs;
1190 /* Translate back to offsets relative to &a[0]. */
1191 lastofs += hint;
1192 ofs += hint;
1193 }
1194 else {
1195 /* key <= a[hint] -- gallop left, until
1196 * a[hint - ofs] < key <= a[hint - lastofs]
1197 */
1198 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1199 while (ofs < maxofs) {
1200 IFLT(*(a-ofs), key)
1201 break;
1202 /* key <= a[hint - ofs] */
1203 lastofs = ofs;
1204 ofs = (ofs << 1) + 1;
1205 if (ofs <= 0) /* int overflow */
1206 ofs = maxofs;
1207 }
1208 if (ofs > maxofs)
1209 ofs = maxofs;
1210 /* Translate back to positive offsets relative to &a[0]. */
1211 k = lastofs;
1212 lastofs = hint - ofs;
1213 ofs = hint - k;
1214 }
1215 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1218 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1219 * right of lastofs but no farther right than ofs. Do a binary
1220 * search, with invariant a[lastofs-1] < key <= a[ofs].
1221 */
1222 ++lastofs;
1223 while (lastofs < ofs) {
1224 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 IFLT(a[m], key)
1227 lastofs = m+1; /* a[m] < key */
1228 else
1229 ofs = m; /* key <= a[m] */
1230 }
1231 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1232 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001233
1234fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001236}
1237
1238/*
1239Exactly like gallop_left(), except that if key already exists in a[0:n],
1240finds the position immediately to the right of the rightmost equal value.
1241
1242The return value is the int k in 0..n such that
1243
1244 a[k-1] <= key < a[k]
1245
1246or -1 if error.
1247
1248The code duplication is massive, but this is enough different given that
1249we're sticking to "<" comparisons that it's much harder to follow if
1250written as one routine with yet another "left or right?" flag.
1251*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001252static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001253gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 Py_ssize_t ofs;
1256 Py_ssize_t lastofs;
1257 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 a += hint;
1262 lastofs = 0;
1263 ofs = 1;
1264 IFLT(key, *a) {
1265 /* key < a[hint] -- gallop left, until
1266 * a[hint - ofs] <= key < a[hint - lastofs]
1267 */
1268 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1269 while (ofs < maxofs) {
1270 IFLT(key, *(a-ofs)) {
1271 lastofs = ofs;
1272 ofs = (ofs << 1) + 1;
1273 if (ofs <= 0) /* int overflow */
1274 ofs = maxofs;
1275 }
1276 else /* a[hint - ofs] <= key */
1277 break;
1278 }
1279 if (ofs > maxofs)
1280 ofs = maxofs;
1281 /* Translate back to positive offsets relative to &a[0]. */
1282 k = lastofs;
1283 lastofs = hint - ofs;
1284 ofs = hint - k;
1285 }
1286 else {
1287 /* a[hint] <= key -- gallop right, until
1288 * a[hint + lastofs] <= key < a[hint + ofs]
1289 */
1290 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1291 while (ofs < maxofs) {
1292 IFLT(key, a[ofs])
1293 break;
1294 /* a[hint + ofs] <= key */
1295 lastofs = ofs;
1296 ofs = (ofs << 1) + 1;
1297 if (ofs <= 0) /* int overflow */
1298 ofs = maxofs;
1299 }
1300 if (ofs > maxofs)
1301 ofs = maxofs;
1302 /* Translate back to offsets relative to &a[0]. */
1303 lastofs += hint;
1304 ofs += hint;
1305 }
1306 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1309 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1310 * right of lastofs but no farther right than ofs. Do a binary
1311 * search, with invariant a[lastofs-1] <= key < a[ofs].
1312 */
1313 ++lastofs;
1314 while (lastofs < ofs) {
1315 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 IFLT(key, a[m])
1318 ofs = m; /* key < a[m] */
1319 else
1320 lastofs = m+1; /* a[m] <= key */
1321 }
1322 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1323 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001324
1325fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001327}
1328
1329/* The maximum number of entries in a MergeState's pending-runs stack.
1330 * This is enough to sort arrays of size up to about
1331 * 32 * phi ** MAX_MERGE_PENDING
1332 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1333 * with 2**64 elements.
1334 */
1335#define MAX_MERGE_PENDING 85
1336
Tim Peterse05f65a2002-08-10 05:21:15 +00001337/* When we get into galloping mode, we stay there until both runs win less
1338 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001339 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001340#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001341
1342/* Avoid malloc for small temp arrays. */
1343#define MERGESTATE_TEMP_SIZE 256
1344
1345/* One MergeState exists on the stack per invocation of mergesort. It's just
1346 * a convenient way to pass state around among the helper functions.
1347 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001348struct s_slice {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001349 sortslice base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001351};
1352
Tim Petersa64dc242002-08-01 02:13:36 +00001353typedef struct s_MergeState {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 /* This controls when we get *into* galloping mode. It's initialized
1355 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1356 * random data, and lower for highly structured data.
1357 */
1358 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 /* 'a' is temp storage to help with merges. It contains room for
1361 * alloced entries.
1362 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001363 sortslice a; /* may point to temparray below */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 /* A stack of n pending runs yet to be merged. Run #i starts at
1367 * address base[i] and extends for len[i] elements. It's always
1368 * true (so long as the indices are in bounds) that
1369 *
1370 * pending[i].base + pending[i].len == pending[i+1].base
1371 *
1372 * so we could cut the storage for this, but it's a minor amount,
1373 * and keeping all the info explicit simplifies the code.
1374 */
1375 int n;
1376 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 /* 'a' points to this when possible, rather than muck with malloc. */
1379 PyObject *temparray[MERGESTATE_TEMP_SIZE];
Tim Petersa64dc242002-08-01 02:13:36 +00001380} MergeState;
1381
1382/* Conceptually a MergeState's constructor. */
1383static void
Victor Stinner0fcab4a2011-01-04 12:59:15 +00001384merge_init(MergeState *ms, Py_ssize_t list_size, int has_keyfunc)
Tim Petersa64dc242002-08-01 02:13:36 +00001385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001387 if (has_keyfunc) {
1388 /* The temporary space for merging will need at most half the list
1389 * size rounded up. Use the minimum possible space so we can use the
1390 * rest of temparray for other things. In particular, if there is
1391 * enough extra space, listsort() will use it to store the keys.
1392 */
1393 ms->alloced = (list_size + 1) / 2;
1394
1395 /* ms->alloced describes how many keys will be stored at
1396 ms->temparray, but we also need to store the values. Hence,
1397 ms->alloced is capped at half of MERGESTATE_TEMP_SIZE. */
1398 if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
1399 ms->alloced = MERGESTATE_TEMP_SIZE / 2;
1400 ms->a.values = &ms->temparray[ms->alloced];
1401 }
1402 else {
1403 ms->alloced = MERGESTATE_TEMP_SIZE;
1404 ms->a.values = NULL;
1405 }
1406 ms->a.keys = ms->temparray;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 ms->n = 0;
1408 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001409}
1410
1411/* Free all the temp memory owned by the MergeState. This must be called
1412 * when you're done with a MergeState, and may be called before then if
1413 * you want to free the temp memory early.
1414 */
1415static void
1416merge_freemem(MergeState *ms)
1417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001419 if (ms->a.keys != ms->temparray)
1420 PyMem_Free(ms->a.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001421}
1422
1423/* Ensure enough temp memory for 'need' array slots is available.
1424 * Returns 0 on success and -1 if the memory can't be gotten.
1425 */
1426static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001427merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001428{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001429 int multiplier;
1430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 assert(ms != NULL);
1432 if (need <= ms->alloced)
1433 return 0;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001434
1435 multiplier = ms->a.values != NULL ? 2 : 1;
1436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 /* Don't realloc! That can cost cycles to copy the old data, but
1438 * we don't care what's in the block.
1439 */
1440 merge_freemem(ms);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001441 if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*) / multiplier) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 PyErr_NoMemory();
1443 return -1;
1444 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001445 ms->a.keys = (PyObject**)PyMem_Malloc(multiplier * need
1446 * sizeof(PyObject *));
1447 if (ms->a.keys != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 ms->alloced = need;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001449 if (ms->a.values != NULL)
1450 ms->a.values = &ms->a.keys[need];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 return 0;
1452 }
1453 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001455}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1457 merge_getmem(MS, NEED))
Tim Petersa64dc242002-08-01 02:13:36 +00001458
Daniel Stutzbach98338222010-12-02 21:55:33 +00001459/* Merge the na elements starting at ssa with the nb elements starting at
1460 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1461 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1462 * should have na <= nb. See listsort.txt for more info. Return 0 if
1463 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001464 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001465static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001466merge_lo(MergeState *ms, sortslice ssa, Py_ssize_t na,
1467 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001470 sortslice dest;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 int result = -1; /* guilty until proved innocent */
1472 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001473
Daniel Stutzbach98338222010-12-02 21:55:33 +00001474 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1475 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 if (MERGE_GETMEM(ms, na) < 0)
1477 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001478 sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
1479 dest = ssa;
1480 ssa = ms->a;
Tim Petersa64dc242002-08-01 02:13:36 +00001481
Daniel Stutzbach98338222010-12-02 21:55:33 +00001482 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 --nb;
1484 if (nb == 0)
1485 goto Succeed;
1486 if (na == 1)
1487 goto CopyB;
Tim Petersa64dc242002-08-01 02:13:36 +00001488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 min_gallop = ms->min_gallop;
1490 for (;;) {
1491 Py_ssize_t acount = 0; /* # of times A won in a row */
1492 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 /* Do the straightforward thing until (if ever) one run
1495 * appears to win consistently.
1496 */
1497 for (;;) {
1498 assert(na > 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001499 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (k) {
1501 if (k < 0)
1502 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001503 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 ++bcount;
1505 acount = 0;
1506 --nb;
1507 if (nb == 0)
1508 goto Succeed;
1509 if (bcount >= min_gallop)
1510 break;
1511 }
1512 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001513 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 ++acount;
1515 bcount = 0;
1516 --na;
1517 if (na == 1)
1518 goto CopyB;
1519 if (acount >= min_gallop)
1520 break;
1521 }
1522 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 /* One run is winning so consistently that galloping may
1525 * be a huge win. So try that, and continue galloping until
1526 * (if ever) neither run appears to be winning consistently
1527 * anymore.
1528 */
1529 ++min_gallop;
1530 do {
1531 assert(na > 1 && nb > 0);
1532 min_gallop -= min_gallop > 1;
1533 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001534 k = gallop_right(ssb.keys[0], ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 acount = k;
1536 if (k) {
1537 if (k < 0)
1538 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001539 sortslice_memcpy(&dest, 0, &ssa, 0, k);
1540 sortslice_advance(&dest, k);
1541 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 na -= k;
1543 if (na == 1)
1544 goto CopyB;
1545 /* na==0 is impossible now if the comparison
1546 * function is consistent, but we can't assume
1547 * that it is.
1548 */
1549 if (na == 0)
1550 goto Succeed;
1551 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001552 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 --nb;
1554 if (nb == 0)
1555 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001556
Daniel Stutzbach98338222010-12-02 21:55:33 +00001557 k = gallop_left(ssa.keys[0], ssb.keys, nb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 bcount = k;
1559 if (k) {
1560 if (k < 0)
1561 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001562 sortslice_memmove(&dest, 0, &ssb, 0, k);
1563 sortslice_advance(&dest, k);
1564 sortslice_advance(&ssb, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 nb -= k;
1566 if (nb == 0)
1567 goto Succeed;
1568 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001569 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 --na;
1571 if (na == 1)
1572 goto CopyB;
1573 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1574 ++min_gallop; /* penalize it for leaving galloping mode */
1575 ms->min_gallop = min_gallop;
1576 }
Tim Petersa64dc242002-08-01 02:13:36 +00001577Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001579Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 if (na)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001581 sortslice_memcpy(&dest, 0, &ssa, 0, na);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001583CopyB:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 assert(na == 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001585 /* The last element of ssa belongs at the end of the merge. */
1586 sortslice_memmove(&dest, 0, &ssb, 0, nb);
1587 sortslice_copy(&dest, nb, &ssa, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001589}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001590
Daniel Stutzbach98338222010-12-02 21:55:33 +00001591/* Merge the na elements starting at pa with the nb elements starting at
1592 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1593 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1594 * should have na >= nb. See listsort.txt for more info. Return 0 if
1595 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001596 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001597static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001598merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
1599 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001602 sortslice dest, basea, baseb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 int result = -1; /* guilty until proved innocent */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001605
Daniel Stutzbach98338222010-12-02 21:55:33 +00001606 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1607 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 if (MERGE_GETMEM(ms, nb) < 0)
1609 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001610 dest = ssb;
1611 sortslice_advance(&dest, nb-1);
1612 sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
1613 basea = ssa;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 baseb = ms->a;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001615 ssb.keys = ms->a.keys + nb - 1;
1616 if (ssb.values != NULL)
1617 ssb.values = ms->a.values + nb - 1;
1618 sortslice_advance(&ssa, na - 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001619
Daniel Stutzbach98338222010-12-02 21:55:33 +00001620 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 --na;
1622 if (na == 0)
1623 goto Succeed;
1624 if (nb == 1)
1625 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 min_gallop = ms->min_gallop;
1628 for (;;) {
1629 Py_ssize_t acount = 0; /* # of times A won in a row */
1630 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 /* Do the straightforward thing until (if ever) one run
1633 * appears to win consistently.
1634 */
1635 for (;;) {
1636 assert(na > 0 && nb > 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001637 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 if (k) {
1639 if (k < 0)
1640 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001641 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 ++acount;
1643 bcount = 0;
1644 --na;
1645 if (na == 0)
1646 goto Succeed;
1647 if (acount >= min_gallop)
1648 break;
1649 }
1650 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001651 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 ++bcount;
1653 acount = 0;
1654 --nb;
1655 if (nb == 1)
1656 goto CopyA;
1657 if (bcount >= min_gallop)
1658 break;
1659 }
1660 }
Tim Petersa64dc242002-08-01 02:13:36 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 /* One run is winning so consistently that galloping may
1663 * be a huge win. So try that, and continue galloping until
1664 * (if ever) neither run appears to be winning consistently
1665 * anymore.
1666 */
1667 ++min_gallop;
1668 do {
1669 assert(na > 0 && nb > 1);
1670 min_gallop -= min_gallop > 1;
1671 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001672 k = gallop_right(ssb.keys[0], basea.keys, na, na-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 if (k < 0)
1674 goto Fail;
1675 k = na - k;
1676 acount = k;
1677 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001678 sortslice_advance(&dest, -k);
1679 sortslice_advance(&ssa, -k);
1680 sortslice_memmove(&dest, 1, &ssa, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 na -= k;
1682 if (na == 0)
1683 goto Succeed;
1684 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001685 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 --nb;
1687 if (nb == 1)
1688 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001689
Daniel Stutzbach98338222010-12-02 21:55:33 +00001690 k = gallop_left(ssa.keys[0], baseb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 if (k < 0)
1692 goto Fail;
1693 k = nb - k;
1694 bcount = k;
1695 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001696 sortslice_advance(&dest, -k);
1697 sortslice_advance(&ssb, -k);
1698 sortslice_memcpy(&dest, 1, &ssb, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 nb -= k;
1700 if (nb == 1)
1701 goto CopyA;
1702 /* nb==0 is impossible now if the comparison
1703 * function is consistent, but we can't assume
1704 * that it is.
1705 */
1706 if (nb == 0)
1707 goto Succeed;
1708 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001709 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 --na;
1711 if (na == 0)
1712 goto Succeed;
1713 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1714 ++min_gallop; /* penalize it for leaving galloping mode */
1715 ms->min_gallop = min_gallop;
1716 }
Tim Petersa64dc242002-08-01 02:13:36 +00001717Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001719Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 if (nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001721 sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001723CopyA:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 assert(nb == 1 && na > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001725 /* The first element of ssb belongs at the front of the merge. */
1726 sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
1727 sortslice_advance(&dest, -na);
1728 sortslice_advance(&ssa, -na);
1729 sortslice_copy(&dest, 0, &ssb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001731}
1732
1733/* Merge the two runs at stack indices i and i+1.
1734 * Returns 0 on success, -1 on error.
1735 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001736static Py_ssize_t
1737merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001738{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001739 sortslice ssa, ssb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 Py_ssize_t na, nb;
1741 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 assert(ms != NULL);
1744 assert(ms->n >= 2);
1745 assert(i >= 0);
1746 assert(i == ms->n - 2 || i == ms->n - 3);
Tim Petersa64dc242002-08-01 02:13:36 +00001747
Daniel Stutzbach98338222010-12-02 21:55:33 +00001748 ssa = ms->pending[i].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 na = ms->pending[i].len;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001750 ssb = ms->pending[i+1].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 nb = ms->pending[i+1].len;
1752 assert(na > 0 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001753 assert(ssa.keys + na == ssb.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 /* Record the length of the combined runs; if i is the 3rd-last
1756 * run now, also slide over the last run (which isn't involved
1757 * in this merge). The current run i+1 goes away in any case.
1758 */
1759 ms->pending[i].len = na + nb;
1760 if (i == ms->n - 3)
1761 ms->pending[i+1] = ms->pending[i+2];
1762 --ms->n;
Tim Petersa64dc242002-08-01 02:13:36 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 /* Where does b start in a? Elements in a before that can be
1765 * ignored (already in place).
1766 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001767 k = gallop_right(*ssb.keys, ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 if (k < 0)
1769 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001770 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 na -= k;
1772 if (na == 0)
1773 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 /* Where does a end in b? Elements in b after that can be
1776 * ignored (already in place).
1777 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001778 nb = gallop_left(ssa.keys[na-1], ssb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 if (nb <= 0)
1780 return nb;
Tim Petersa64dc242002-08-01 02:13:36 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 /* Merge what remains of the runs, using a temp array with
1783 * min(na, nb) elements.
1784 */
1785 if (na <= nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001786 return merge_lo(ms, ssa, na, ssb, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 else
Daniel Stutzbach98338222010-12-02 21:55:33 +00001788 return merge_hi(ms, ssa, na, ssb, nb);
Tim Petersa64dc242002-08-01 02:13:36 +00001789}
1790
1791/* Examine the stack of runs waiting to be merged, merging adjacent runs
1792 * until the stack invariants are re-established:
1793 *
1794 * 1. len[-3] > len[-2] + len[-1]
1795 * 2. len[-2] > len[-1]
1796 *
1797 * See listsort.txt for more info.
1798 *
1799 * Returns 0 on success, -1 on error.
1800 */
1801static int
1802merge_collapse(MergeState *ms)
1803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 assert(ms);
1807 while (ms->n > 1) {
1808 Py_ssize_t n = ms->n - 2;
1809 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1810 if (p[n-1].len < p[n+1].len)
1811 --n;
1812 if (merge_at(ms, n) < 0)
1813 return -1;
1814 }
1815 else if (p[n].len <= p[n+1].len) {
1816 if (merge_at(ms, n) < 0)
1817 return -1;
1818 }
1819 else
1820 break;
1821 }
1822 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001823}
1824
1825/* Regardless of invariants, merge all runs on the stack until only one
1826 * remains. This is used at the end of the mergesort.
1827 *
1828 * Returns 0 on success, -1 on error.
1829 */
1830static int
1831merge_force_collapse(MergeState *ms)
1832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 assert(ms);
1836 while (ms->n > 1) {
1837 Py_ssize_t n = ms->n - 2;
1838 if (n > 0 && p[n-1].len < p[n+1].len)
1839 --n;
1840 if (merge_at(ms, n) < 0)
1841 return -1;
1842 }
1843 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001844}
1845
1846/* Compute a good value for the minimum run length; natural runs shorter
1847 * than this are boosted artificially via binary insertion.
1848 *
1849 * If n < 64, return n (it's too small to bother with fancy stuff).
1850 * Else if n is an exact power of 2, return 32.
1851 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1852 * strictly less than, an exact power of 2.
1853 *
1854 * See listsort.txt for more info.
1855 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001856static Py_ssize_t
1857merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 assert(n >= 0);
1862 while (n >= 64) {
1863 r |= n & 1;
1864 n >>= 1;
1865 }
1866 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001867}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001868
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869static void
Daniel Stutzbach98338222010-12-02 21:55:33 +00001870reverse_sortslice(sortslice *s, Py_ssize_t n)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001871{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001872 reverse_slice(s->keys, &s->keys[n]);
1873 if (s->values != NULL)
1874 reverse_slice(s->values, &s->values[n]);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001875}
1876
Tim Petersa64dc242002-08-01 02:13:36 +00001877/* An adaptive, stable, natural mergesort. See listsort.txt.
1878 * Returns Py_None on success, NULL on error. Even in case of error, the
1879 * list will be some permutation of its input state (nothing is lost or
1880 * duplicated).
1881 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001882static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001883listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 MergeState ms;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 Py_ssize_t nremaining;
1887 Py_ssize_t minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001888 sortslice lo;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 Py_ssize_t saved_ob_size, saved_allocated;
1890 PyObject **saved_ob_item;
1891 PyObject **final_ob_item;
1892 PyObject *result = NULL; /* guilty until proved innocent */
1893 int reverse = 0;
1894 PyObject *keyfunc = NULL;
1895 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 static char *kwlist[] = {"key", "reverse", 0};
Daniel Stutzbach98338222010-12-02 21:55:33 +00001897 PyObject **keys;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 assert(self != NULL);
1900 assert (PyList_Check(self));
1901 if (args != NULL) {
1902 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1903 kwlist, &keyfunc, &reverse))
1904 return NULL;
1905 if (Py_SIZE(args) > 0) {
1906 PyErr_SetString(PyExc_TypeError,
1907 "must use keyword argument for key function");
1908 return NULL;
1909 }
1910 }
1911 if (keyfunc == Py_None)
1912 keyfunc = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 /* The list is temporarily made empty, so that mutations performed
1915 * by comparison functions can't affect the slice of memory we're
1916 * sorting (allowing mutations during sorting is a core-dump
1917 * factory, since ob_item may change).
1918 */
1919 saved_ob_size = Py_SIZE(self);
1920 saved_ob_item = self->ob_item;
1921 saved_allocated = self->allocated;
1922 Py_SIZE(self) = 0;
1923 self->ob_item = NULL;
1924 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00001925
Daniel Stutzbach98338222010-12-02 21:55:33 +00001926 if (keyfunc == NULL) {
1927 keys = NULL;
1928 lo.keys = saved_ob_item;
1929 lo.values = NULL;
1930 }
1931 else {
1932 if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
1933 /* Leverage stack space we allocated but won't otherwise use */
1934 keys = &ms.temparray[saved_ob_size+1];
1935 else {
1936 keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size);
1937 if (keys == NULL)
1938 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001940
1941 for (i = 0; i < saved_ob_size ; i++) {
1942 keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i],
1943 NULL);
1944 if (keys[i] == NULL) {
1945 for (i=i-1 ; i>=0 ; i--)
1946 Py_DECREF(keys[i]);
Daniel Stutzbacheda70b82011-05-04 12:46:28 -07001947 if (keys != &ms.temparray[saved_ob_size+1])
1948 PyMem_FREE(keys);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001949 goto keyfunc_fail;
1950 }
1951 }
1952
1953 lo.keys = keys;
1954 lo.values = saved_ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001956
Daniel Stutzbach98338222010-12-02 21:55:33 +00001957 merge_init(&ms, saved_ob_size, keys != NULL);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 nremaining = saved_ob_size;
1960 if (nremaining < 2)
1961 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001962
Benjamin Peterson05380642010-08-23 19:35:39 +00001963 /* Reverse sort stability achieved by initially reversing the list,
1964 applying a stable forward sort, then reversing the final result. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001965 if (reverse) {
1966 if (keys != NULL)
1967 reverse_slice(&keys[0], &keys[saved_ob_size]);
1968 reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
1969 }
Benjamin Peterson05380642010-08-23 19:35:39 +00001970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 /* March over the array once, left to right, finding natural runs,
1972 * and extending short natural runs to minrun elements.
1973 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 minrun = merge_compute_minrun(nremaining);
1975 do {
1976 int descending;
1977 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 /* Identify next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001980 n = count_run(lo.keys, lo.keys + nremaining, &descending);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 if (n < 0)
1982 goto fail;
1983 if (descending)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001984 reverse_sortslice(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 /* If short, extend to min(minrun, nremaining). */
1986 if (n < minrun) {
1987 const Py_ssize_t force = nremaining <= minrun ?
1988 nremaining : minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001989 if (binarysort(lo, lo.keys + force, lo.keys + n) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 goto fail;
1991 n = force;
1992 }
1993 /* Push run onto pending-runs stack, and maybe merge. */
1994 assert(ms.n < MAX_MERGE_PENDING);
1995 ms.pending[ms.n].base = lo;
1996 ms.pending[ms.n].len = n;
1997 ++ms.n;
1998 if (merge_collapse(&ms) < 0)
1999 goto fail;
2000 /* Advance to find next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002001 sortslice_advance(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 nremaining -= n;
2003 } while (nremaining);
Tim Peters330f9e92002-07-19 07:05:44 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 if (merge_force_collapse(&ms) < 0)
2006 goto fail;
2007 assert(ms.n == 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002008 assert(keys == NULL
2009 ? ms.pending[0].base.keys == saved_ob_item
2010 : ms.pending[0].base.keys == &keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 assert(ms.pending[0].len == saved_ob_size);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002012 lo = ms.pending[0].base;
Tim Petersa64dc242002-08-01 02:13:36 +00002013
2014succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002016fail:
Daniel Stutzbach98338222010-12-02 21:55:33 +00002017 if (keys != NULL) {
2018 for (i = 0; i < saved_ob_size; i++)
2019 Py_DECREF(keys[i]);
2020 if (keys != &ms.temparray[saved_ob_size+1])
2021 PyMem_FREE(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 if (self->allocated != -1 && result != NULL) {
2025 /* The user mucked with the list during the sort,
2026 * and we don't already have another error to report.
2027 */
2028 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2029 result = NULL;
2030 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 if (reverse && saved_ob_size > 1)
2033 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 merge_freemem(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002036
Daniel Stutzbach98338222010-12-02 21:55:33 +00002037keyfunc_fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 final_ob_item = self->ob_item;
2039 i = Py_SIZE(self);
2040 Py_SIZE(self) = saved_ob_size;
2041 self->ob_item = saved_ob_item;
2042 self->allocated = saved_allocated;
2043 if (final_ob_item != NULL) {
2044 /* we cannot use list_clear() for this because it does not
2045 guarantee that the list is really empty when it returns */
2046 while (--i >= 0) {
2047 Py_XDECREF(final_ob_item[i]);
2048 }
2049 PyMem_FREE(final_ob_item);
2050 }
2051 Py_XINCREF(result);
2052 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002053}
Tim Peters330f9e92002-07-19 07:05:44 +00002054#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002055#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002056
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002057int
Fred Drakea2f55112000-07-09 15:16:51 +00002058PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 if (v == NULL || !PyList_Check(v)) {
2061 PyErr_BadInternalCall();
2062 return -1;
2063 }
2064 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2065 if (v == NULL)
2066 return -1;
2067 Py_DECREF(v);
2068 return 0;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002069}
2070
Guido van Rossumb86c5492001-02-12 22:06:02 +00002071static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002072listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 if (Py_SIZE(self) > 1)
2075 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2076 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002077}
2078
Guido van Rossum84c76f51990-10-30 13:32:20 +00002079int
Fred Drakea2f55112000-07-09 15:16:51 +00002080PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 PyListObject *self = (PyListObject *)v;
Tim Peters6063e262002-08-08 01:06:39 +00002083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 if (v == NULL || !PyList_Check(v)) {
2085 PyErr_BadInternalCall();
2086 return -1;
2087 }
2088 if (Py_SIZE(self) > 1)
2089 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2090 return 0;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002091}
2092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002094PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 PyObject *w;
2097 PyObject **p, **q;
2098 Py_ssize_t n;
2099 if (v == NULL || !PyList_Check(v)) {
2100 PyErr_BadInternalCall();
2101 return NULL;
2102 }
2103 n = Py_SIZE(v);
2104 w = PyTuple_New(n);
2105 if (w == NULL)
2106 return NULL;
2107 p = ((PyTupleObject *)w)->ob_item;
2108 q = ((PyListObject *)v)->ob_item;
2109 while (--n >= 0) {
2110 Py_INCREF(*q);
2111 *p = *q;
2112 p++;
2113 q++;
2114 }
2115 return w;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002116}
2117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002118static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002119listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 Py_ssize_t i, start=0, stop=Py_SIZE(self);
2122 PyObject *v, *format_tuple, *err_string;
2123 static PyObject *err_format = NULL;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2126 _PyEval_SliceIndex, &start,
2127 _PyEval_SliceIndex, &stop))
2128 return NULL;
2129 if (start < 0) {
2130 start += Py_SIZE(self);
2131 if (start < 0)
2132 start = 0;
2133 }
2134 if (stop < 0) {
2135 stop += Py_SIZE(self);
2136 if (stop < 0)
2137 stop = 0;
2138 }
2139 for (i = start; i < stop && i < Py_SIZE(self); i++) {
2140 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2141 if (cmp > 0)
2142 return PyLong_FromSsize_t(i);
2143 else if (cmp < 0)
2144 return NULL;
2145 }
2146 if (err_format == NULL) {
2147 err_format = PyUnicode_FromString("%r is not in list");
2148 if (err_format == NULL)
2149 return NULL;
2150 }
2151 format_tuple = PyTuple_Pack(1, v);
2152 if (format_tuple == NULL)
2153 return NULL;
2154 err_string = PyUnicode_Format(err_format, format_tuple);
2155 Py_DECREF(format_tuple);
2156 if (err_string == NULL)
2157 return NULL;
2158 PyErr_SetObject(PyExc_ValueError, err_string);
2159 Py_DECREF(err_string);
2160 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002161}
2162
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002163static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002164listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 Py_ssize_t count = 0;
2167 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 for (i = 0; i < Py_SIZE(self); i++) {
2170 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2171 if (cmp > 0)
2172 count++;
2173 else if (cmp < 0)
2174 return NULL;
2175 }
2176 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002177}
2178
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002179static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002180listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 for (i = 0; i < Py_SIZE(self); i++) {
2185 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2186 if (cmp > 0) {
2187 if (list_ass_slice(self, i, i+1,
2188 (PyObject *)NULL) == 0)
2189 Py_RETURN_NONE;
2190 return NULL;
2191 }
2192 else if (cmp < 0)
2193 return NULL;
2194 }
2195 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2196 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002197}
2198
Jeremy Hylton8caad492000-06-23 14:18:11 +00002199static int
2200list_traverse(PyListObject *o, visitproc visit, void *arg)
2201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 for (i = Py_SIZE(o); --i >= 0; )
2205 Py_VISIT(o->ob_item[i]);
2206 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002207}
2208
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002209static PyObject *
2210list_richcompare(PyObject *v, PyObject *w, int op)
2211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 PyListObject *vl, *wl;
2213 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 if (!PyList_Check(v) || !PyList_Check(w)) {
2216 Py_INCREF(Py_NotImplemented);
2217 return Py_NotImplemented;
2218 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 vl = (PyListObject *)v;
2221 wl = (PyListObject *)w;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2224 /* Shortcut: if the lengths differ, the lists differ */
2225 PyObject *res;
2226 if (op == Py_EQ)
2227 res = Py_False;
2228 else
2229 res = Py_True;
2230 Py_INCREF(res);
2231 return res;
2232 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 /* Search for the first index where items are different */
2235 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2236 int k = PyObject_RichCompareBool(vl->ob_item[i],
2237 wl->ob_item[i], Py_EQ);
2238 if (k < 0)
2239 return NULL;
2240 if (!k)
2241 break;
2242 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2245 /* No more items to compare -- compare sizes */
2246 Py_ssize_t vs = Py_SIZE(vl);
2247 Py_ssize_t ws = Py_SIZE(wl);
2248 int cmp;
2249 PyObject *res;
2250 switch (op) {
2251 case Py_LT: cmp = vs < ws; break;
2252 case Py_LE: cmp = vs <= ws; break;
2253 case Py_EQ: cmp = vs == ws; break;
2254 case Py_NE: cmp = vs != ws; break;
2255 case Py_GT: cmp = vs > ws; break;
2256 case Py_GE: cmp = vs >= ws; break;
2257 default: return NULL; /* cannot happen */
2258 }
2259 if (cmp)
2260 res = Py_True;
2261 else
2262 res = Py_False;
2263 Py_INCREF(res);
2264 return res;
2265 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 /* We have an item that differs -- shortcuts for EQ/NE */
2268 if (op == Py_EQ) {
2269 Py_INCREF(Py_False);
2270 return Py_False;
2271 }
2272 if (op == Py_NE) {
2273 Py_INCREF(Py_True);
2274 return Py_True;
2275 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* Compare the final item again using the proper operator */
2278 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002279}
2280
Tim Peters6d6c1a32001-08-02 04:15:00 +00002281static int
2282list_init(PyListObject *self, PyObject *args, PyObject *kw)
2283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 PyObject *arg = NULL;
2285 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2288 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 /* Verify list invariants established by PyType_GenericAlloc() */
2291 assert(0 <= Py_SIZE(self));
2292 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2293 assert(self->ob_item != NULL ||
2294 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 /* Empty previous contents */
2297 if (self->ob_item != NULL) {
2298 (void)list_clear(self);
2299 }
2300 if (arg != NULL) {
2301 PyObject *rv = listextend(self, arg);
2302 if (rv == NULL)
2303 return -1;
2304 Py_DECREF(rv);
2305 }
2306 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002307}
2308
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002309static PyObject *
2310list_sizeof(PyListObject *self)
2311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
2315 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002316}
2317
Raymond Hettinger1021c442003-11-07 15:38:09 +00002318static PyObject *list_iter(PyObject *seq);
2319static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2320
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002321PyDoc_STRVAR(getitem_doc,
2322"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002323PyDoc_STRVAR(reversed_doc,
2324"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002325PyDoc_STRVAR(sizeof_doc,
2326"L.__sizeof__() -- size of L in memory, in bytes");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002327PyDoc_STRVAR(append_doc,
2328"L.append(object) -- append object to end");
2329PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002330"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002331PyDoc_STRVAR(insert_doc,
2332"L.insert(index, object) -- insert object before index");
2333PyDoc_STRVAR(pop_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002334"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2335"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002336PyDoc_STRVAR(remove_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002337"L.remove(value) -- remove first occurrence of value.\n"
2338"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002339PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002340"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2341"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002342PyDoc_STRVAR(count_doc,
2343"L.count(value) -> integer -- return number of occurrences of value");
2344PyDoc_STRVAR(reverse_doc,
2345"L.reverse() -- reverse *IN PLACE*");
2346PyDoc_STRVAR(sort_doc,
Benjamin Petersoncb9a5512008-09-30 02:08:36 +00002347"L.sort(key=None, reverse=False) -- stable sort *IN PLACE*");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002348
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002349static PyObject *list_subscript(PyListObject*, PyObject*);
2350
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002351static PyMethodDef list_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2353 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2354 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
2355 {"append", (PyCFunction)listappend, METH_O, append_doc},
2356 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
2357 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
2358 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
2359 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2360 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
2361 {"count", (PyCFunction)listcount, METH_O, count_doc},
2362 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2363 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
2364 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002365};
2366
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002367static PySequenceMethods list_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 (lenfunc)list_length, /* sq_length */
2369 (binaryfunc)list_concat, /* sq_concat */
2370 (ssizeargfunc)list_repeat, /* sq_repeat */
2371 (ssizeargfunc)list_item, /* sq_item */
2372 0, /* sq_slice */
2373 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2374 0, /* sq_ass_slice */
2375 (objobjproc)list_contains, /* sq_contains */
2376 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2377 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002378};
2379
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002380PyDoc_STRVAR(list_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002381"list() -> new empty list\n"
2382"list(iterable) -> new list initialized from iterable's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002383
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002384static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002385list_subscript(PyListObject* self, PyObject* item)
2386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 if (PyIndex_Check(item)) {
2388 Py_ssize_t i;
2389 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2390 if (i == -1 && PyErr_Occurred())
2391 return NULL;
2392 if (i < 0)
2393 i += PyList_GET_SIZE(self);
2394 return list_item(self, i);
2395 }
2396 else if (PySlice_Check(item)) {
2397 Py_ssize_t start, stop, step, slicelength, cur, i;
2398 PyObject* result;
2399 PyObject* it;
2400 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002401
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002402 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 &start, &stop, &step, &slicelength) < 0) {
2404 return NULL;
2405 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 if (slicelength <= 0) {
2408 return PyList_New(0);
2409 }
2410 else if (step == 1) {
2411 return list_slice(self, start, stop);
2412 }
2413 else {
2414 result = PyList_New(slicelength);
2415 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 src = self->ob_item;
2418 dest = ((PyListObject *)result)->ob_item;
2419 for (cur = start, i = 0; i < slicelength;
2420 cur += step, i++) {
2421 it = src[cur];
2422 Py_INCREF(it);
2423 dest[i] = it;
2424 }
Tim Peters3b01a122002-07-19 02:35:45 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 return result;
2427 }
2428 }
2429 else {
2430 PyErr_Format(PyExc_TypeError,
2431 "list indices must be integers, not %.200s",
2432 item->ob_type->tp_name);
2433 return NULL;
2434 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002435}
2436
Tim Peters3b01a122002-07-19 02:35:45 +00002437static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002438list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 if (PyIndex_Check(item)) {
2441 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2442 if (i == -1 && PyErr_Occurred())
2443 return -1;
2444 if (i < 0)
2445 i += PyList_GET_SIZE(self);
2446 return list_ass_item(self, i, value);
2447 }
2448 else if (PySlice_Check(item)) {
2449 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002450
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002451 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 &start, &stop, &step, &slicelength) < 0) {
2453 return -1;
2454 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 if (step == 1)
2457 return list_ass_slice(self, start, stop, value);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 /* Make sure s[5:2] = [..] inserts at the right place:
2460 before 5, not before 2. */
2461 if ((step < 0 && start < stop) ||
2462 (step > 0 && start > stop))
2463 stop = start;
Thomas Woutersed03b412007-08-28 21:37:11 +00002464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 if (value == NULL) {
2466 /* delete slice */
2467 PyObject **garbage;
2468 size_t cur;
2469 Py_ssize_t i;
Tim Peters3b01a122002-07-19 02:35:45 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 if (slicelength <= 0)
2472 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 if (step < 0) {
2475 stop = start + 1;
2476 start = stop + step*(slicelength - 1) - 1;
2477 step = -step;
2478 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 assert((size_t)slicelength <=
2481 PY_SIZE_MAX / sizeof(PyObject*));
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00002482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 garbage = (PyObject**)
2484 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2485 if (!garbage) {
2486 PyErr_NoMemory();
2487 return -1;
2488 }
Tim Peters3b01a122002-07-19 02:35:45 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 /* drawing pictures might help understand these for
2491 loops. Basically, we memmove the parts of the
2492 list that are *not* part of the slice: step-1
2493 items for each item that is part of the slice,
2494 and then tail end of the list that was not
2495 covered by the slice */
2496 for (cur = start, i = 0;
2497 cur < (size_t)stop;
2498 cur += step, i++) {
2499 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 garbage[i] = PyList_GET_ITEM(self, cur);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 if (cur + step >= (size_t)Py_SIZE(self)) {
2504 lim = Py_SIZE(self) - cur - 1;
2505 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 memmove(self->ob_item + cur - i,
2508 self->ob_item + cur + 1,
2509 lim * sizeof(PyObject *));
2510 }
2511 cur = start + slicelength*step;
2512 if (cur < (size_t)Py_SIZE(self)) {
2513 memmove(self->ob_item + cur - slicelength,
2514 self->ob_item + cur,
2515 (Py_SIZE(self) - cur) *
2516 sizeof(PyObject *));
2517 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 Py_SIZE(self) -= slicelength;
2520 list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 for (i = 0; i < slicelength; i++) {
2523 Py_DECREF(garbage[i]);
2524 }
2525 PyMem_FREE(garbage);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 return 0;
2528 }
2529 else {
2530 /* assign slice */
2531 PyObject *ins, *seq;
2532 PyObject **garbage, **seqitems, **selfitems;
2533 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 /* protect against a[::-1] = a */
2536 if (self == (PyListObject*)value) {
2537 seq = list_slice((PyListObject*)value, 0,
2538 PyList_GET_SIZE(value));
2539 }
2540 else {
2541 seq = PySequence_Fast(value,
2542 "must assign iterable "
2543 "to extended slice");
2544 }
2545 if (!seq)
2546 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2549 PyErr_Format(PyExc_ValueError,
2550 "attempt to assign sequence of "
2551 "size %zd to extended slice of "
2552 "size %zd",
2553 PySequence_Fast_GET_SIZE(seq),
2554 slicelength);
2555 Py_DECREF(seq);
2556 return -1;
2557 }
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (!slicelength) {
2560 Py_DECREF(seq);
2561 return 0;
2562 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 garbage = (PyObject**)
2565 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2566 if (!garbage) {
2567 Py_DECREF(seq);
2568 PyErr_NoMemory();
2569 return -1;
2570 }
Tim Peters3b01a122002-07-19 02:35:45 +00002571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 selfitems = self->ob_item;
2573 seqitems = PySequence_Fast_ITEMS(seq);
2574 for (cur = start, i = 0; i < slicelength;
2575 cur += step, i++) {
2576 garbage[i] = selfitems[cur];
2577 ins = seqitems[i];
2578 Py_INCREF(ins);
2579 selfitems[cur] = ins;
2580 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 for (i = 0; i < slicelength; i++) {
2583 Py_DECREF(garbage[i]);
2584 }
Tim Peters3b01a122002-07-19 02:35:45 +00002585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 PyMem_FREE(garbage);
2587 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 return 0;
2590 }
2591 }
2592 else {
2593 PyErr_Format(PyExc_TypeError,
2594 "list indices must be integers, not %.200s",
2595 item->ob_type->tp_name);
2596 return -1;
2597 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002598}
2599
2600static PyMappingMethods list_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 (lenfunc)list_length,
2602 (binaryfunc)list_subscript,
2603 (objobjargproc)list_ass_subscript
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002604};
2605
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002606PyTypeObject PyList_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2608 "list",
2609 sizeof(PyListObject),
2610 0,
2611 (destructor)list_dealloc, /* tp_dealloc */
2612 0, /* tp_print */
2613 0, /* tp_getattr */
2614 0, /* tp_setattr */
2615 0, /* tp_reserved */
2616 (reprfunc)list_repr, /* tp_repr */
2617 0, /* tp_as_number */
2618 &list_as_sequence, /* tp_as_sequence */
2619 &list_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002620 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 0, /* tp_call */
2622 0, /* tp_str */
2623 PyObject_GenericGetAttr, /* tp_getattro */
2624 0, /* tp_setattro */
2625 0, /* tp_as_buffer */
2626 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2627 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
2628 list_doc, /* tp_doc */
2629 (traverseproc)list_traverse, /* tp_traverse */
2630 (inquiry)list_clear, /* tp_clear */
2631 list_richcompare, /* tp_richcompare */
2632 0, /* tp_weaklistoffset */
2633 list_iter, /* tp_iter */
2634 0, /* tp_iternext */
2635 list_methods, /* tp_methods */
2636 0, /* tp_members */
2637 0, /* tp_getset */
2638 0, /* tp_base */
2639 0, /* tp_dict */
2640 0, /* tp_descr_get */
2641 0, /* tp_descr_set */
2642 0, /* tp_dictoffset */
2643 (initproc)list_init, /* tp_init */
2644 PyType_GenericAlloc, /* tp_alloc */
2645 PyType_GenericNew, /* tp_new */
2646 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002647};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002648
2649
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002650/*********************** List Iterator **************************/
2651
2652typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 PyObject_HEAD
2654 long it_index;
2655 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002656} listiterobject;
2657
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002658static PyObject *list_iter(PyObject *);
2659static void listiter_dealloc(listiterobject *);
2660static int listiter_traverse(listiterobject *, visitproc, void *);
2661static PyObject *listiter_next(listiterobject *);
2662static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002663
Armin Rigof5b3e362006-02-11 21:32:43 +00002664PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002665
2666static PyMethodDef listiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2668 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002669};
2670
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002671PyTypeObject PyListIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2673 "list_iterator", /* tp_name */
2674 sizeof(listiterobject), /* tp_basicsize */
2675 0, /* tp_itemsize */
2676 /* methods */
2677 (destructor)listiter_dealloc, /* tp_dealloc */
2678 0, /* tp_print */
2679 0, /* tp_getattr */
2680 0, /* tp_setattr */
2681 0, /* tp_reserved */
2682 0, /* tp_repr */
2683 0, /* tp_as_number */
2684 0, /* tp_as_sequence */
2685 0, /* tp_as_mapping */
2686 0, /* tp_hash */
2687 0, /* tp_call */
2688 0, /* tp_str */
2689 PyObject_GenericGetAttr, /* tp_getattro */
2690 0, /* tp_setattro */
2691 0, /* tp_as_buffer */
2692 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2693 0, /* tp_doc */
2694 (traverseproc)listiter_traverse, /* tp_traverse */
2695 0, /* tp_clear */
2696 0, /* tp_richcompare */
2697 0, /* tp_weaklistoffset */
2698 PyObject_SelfIter, /* tp_iter */
2699 (iternextfunc)listiter_next, /* tp_iternext */
2700 listiter_methods, /* tp_methods */
2701 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002702};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002703
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002704
2705static PyObject *
2706list_iter(PyObject *seq)
2707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 listiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 if (!PyList_Check(seq)) {
2711 PyErr_BadInternalCall();
2712 return NULL;
2713 }
2714 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2715 if (it == NULL)
2716 return NULL;
2717 it->it_index = 0;
2718 Py_INCREF(seq);
2719 it->it_seq = (PyListObject *)seq;
2720 _PyObject_GC_TRACK(it);
2721 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002722}
2723
2724static void
2725listiter_dealloc(listiterobject *it)
2726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 _PyObject_GC_UNTRACK(it);
2728 Py_XDECREF(it->it_seq);
2729 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002730}
2731
2732static int
2733listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 Py_VISIT(it->it_seq);
2736 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002737}
2738
2739static PyObject *
2740listiter_next(listiterobject *it)
2741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 PyListObject *seq;
2743 PyObject *item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 assert(it != NULL);
2746 seq = it->it_seq;
2747 if (seq == NULL)
2748 return NULL;
2749 assert(PyList_Check(seq));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 if (it->it_index < PyList_GET_SIZE(seq)) {
2752 item = PyList_GET_ITEM(seq, it->it_index);
2753 ++it->it_index;
2754 Py_INCREF(item);
2755 return item;
2756 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 Py_DECREF(seq);
2759 it->it_seq = NULL;
2760 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002761}
2762
2763static PyObject *
2764listiter_len(listiterobject *it)
2765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 Py_ssize_t len;
2767 if (it->it_seq) {
2768 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2769 if (len >= 0)
2770 return PyLong_FromSsize_t(len);
2771 }
2772 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002773}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002774/*********************** List Reverse Iterator **************************/
2775
2776typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 PyObject_HEAD
2778 Py_ssize_t it_index;
2779 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002780} listreviterobject;
2781
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002782static PyObject *list_reversed(PyListObject *, PyObject *);
2783static void listreviter_dealloc(listreviterobject *);
2784static int listreviter_traverse(listreviterobject *, visitproc, void *);
2785static PyObject *listreviter_next(listreviterobject *);
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002786static PyObject *listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002787
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002788static PyMethodDef listreviter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
2790 {NULL, NULL} /* sentinel */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002791};
2792
Raymond Hettinger1021c442003-11-07 15:38:09 +00002793PyTypeObject PyListRevIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2795 "list_reverseiterator", /* tp_name */
2796 sizeof(listreviterobject), /* tp_basicsize */
2797 0, /* tp_itemsize */
2798 /* methods */
2799 (destructor)listreviter_dealloc, /* tp_dealloc */
2800 0, /* tp_print */
2801 0, /* tp_getattr */
2802 0, /* tp_setattr */
2803 0, /* tp_reserved */
2804 0, /* tp_repr */
2805 0, /* tp_as_number */
2806 0, /* tp_as_sequence */
2807 0, /* tp_as_mapping */
2808 0, /* tp_hash */
2809 0, /* tp_call */
2810 0, /* tp_str */
2811 PyObject_GenericGetAttr, /* tp_getattro */
2812 0, /* tp_setattro */
2813 0, /* tp_as_buffer */
2814 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2815 0, /* tp_doc */
2816 (traverseproc)listreviter_traverse, /* tp_traverse */
2817 0, /* tp_clear */
2818 0, /* tp_richcompare */
2819 0, /* tp_weaklistoffset */
2820 PyObject_SelfIter, /* tp_iter */
2821 (iternextfunc)listreviter_next, /* tp_iternext */
2822 listreviter_methods, /* tp_methods */
2823 0,
Raymond Hettinger1021c442003-11-07 15:38:09 +00002824};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002825
2826static PyObject *
2827list_reversed(PyListObject *seq, PyObject *unused)
2828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 listreviterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2832 if (it == NULL)
2833 return NULL;
2834 assert(PyList_Check(seq));
2835 it->it_index = PyList_GET_SIZE(seq) - 1;
2836 Py_INCREF(seq);
2837 it->it_seq = seq;
2838 PyObject_GC_Track(it);
2839 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002840}
2841
2842static void
2843listreviter_dealloc(listreviterobject *it)
2844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 PyObject_GC_UnTrack(it);
2846 Py_XDECREF(it->it_seq);
2847 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002848}
2849
2850static int
2851listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 Py_VISIT(it->it_seq);
2854 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002855}
2856
2857static PyObject *
2858listreviter_next(listreviterobject *it)
2859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 PyObject *item;
2861 Py_ssize_t index = it->it_index;
2862 PyListObject *seq = it->it_seq;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2865 item = PyList_GET_ITEM(seq, index);
2866 it->it_index--;
2867 Py_INCREF(item);
2868 return item;
2869 }
2870 it->it_index = -1;
2871 if (seq != NULL) {
2872 it->it_seq = NULL;
2873 Py_DECREF(seq);
2874 }
2875 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002876}
2877
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002878static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002879listreviter_len(listreviterobject *it)
2880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 Py_ssize_t len = it->it_index + 1;
2882 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2883 len = 0;
2884 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002885}