blob: e8b21f133cf3cdbd9185742168607961f398b6ae [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 Pitrou7f14f0d2010-05-09 16:14:21 +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
14 * responsiblity to overwrite them with sane values.
15 * 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 Pitrou7f14f0d2010-05-09 16:14:21 +000027 PyObject **items;
28 size_t new_allocated;
29 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000030
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +000058 if (newsize == 0)
59 new_allocated = 0;
60 items = self->ob_item;
61 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
62 PyMem_RESIZE(items, PyObject *, new_allocated);
63 else
64 items = NULL;
65 if (items == NULL) {
66 PyErr_NoMemory();
67 return -1;
68 }
69 self->ob_item = items;
70 Py_SIZE(self) = newsize;
71 self->allocated = new_allocated;
72 return 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000073}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000074
Christian Heimes77c02eb2008-02-09 02:18:51 +000075/* Debug statistic to compare allocations with reuse through the free list */
76#undef SHOW_ALLOC_COUNT
77#ifdef SHOW_ALLOC_COUNT
78static size_t count_alloc = 0;
79static size_t count_reuse = 0;
80
81static void
82show_alloc(void)
83{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000103 PyListObject *op;
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000104
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000115 PyListObject *op;
116 size_t nbytes;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000117#ifdef SHOW_ALLOC_COUNT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000139 count_reuse++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000140#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000146 count_alloc++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000147#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000237 if (list_resize(self, n+1) == -1)
238 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000239
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000268 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000269
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000277 if (list_resize(self, n+1) == -1)
278 return -1;
Raymond Hettinger40a03822004-04-12 13:05:09 +0000279
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000332 if (Py_SIZE(v) == 0) {
333 result = PyUnicode_FromString("[]");
334 goto Done;
335 }
Tim Petersa7259592001-06-16 05:11:17 +0000336
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000337 pieces = PyList_New(0);
338 if (pieces == NULL)
339 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000340
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000399 Py_ssize_t i;
400 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000401
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000506 Py_ssize_t i, j;
507 Py_ssize_t size;
508 PyListObject *np;
509 PyObject **p, **items;
510 PyObject *elem;
511 if (n < 0)
512 n = 0;
513 size = Py_SIZE(a) * n;
514 if (n && size/n != Py_SIZE(a))
515 return PyErr_NoMemory();
516 if (size == 0)
517 return PyList_New(0);
518 np = (PyListObject *) PyList_New(size);
519 if (np == NULL)
520 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000521
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000683 PyObject **items;
684 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000685
686
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000699 if (size > PY_SSIZE_T_MAX / n) {
700 return PyErr_NoMemory();
701 }
Christian Heimesaf98da12008-01-27 15:18:18 +0000702
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000703 if (list_resize(self, size*n) == -1)
704 return NULL;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000705
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000858 Py_DECREF(it);
859 Py_RETURN_NONE;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000860
861 error:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000875 PyObject *result;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000876
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000888 Py_ssize_t i = -1;
889 PyObject *v;
890 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000891
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000892 if (!PyArg_ParseTuple(args, "|n:pop", &i))
893 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +0000927 assert(lo && hi);
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000928
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000943/* Comparison function: PyObject_RichCompareBool with Py_LT.
Tim Petersa64dc242002-08-01 02:13:36 +0000944 * Returns -1 on error, 1 if x < y, 0 if x >= y.
945 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000946
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000947#define ISLT(X, Y) (PyObject_RichCompareBool(X, Y, Py_LT))
Tim Peters66860f62002-08-04 17:47:26 +0000948
949/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000950 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
951 started. It makes more sense in context <wink>. X and Y are PyObject*s.
952*/
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000953#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail; \
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000954 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000955
956/* binarysort is the best method for sorting small arrays: it does
957 few compares, but can do data movement quadratic in the number of
958 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000959 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000960 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000961 On entry, must have lo <= start <= hi, and that [lo, start) is already
962 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000963 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000964 Even in case of error, the output slice will be some permutation of
965 the input (nothing is lost or duplicated).
966*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000967static int
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000968binarysort(PyObject **lo, PyObject **hi, PyObject **start)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000969{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000970 register Py_ssize_t k;
971 register PyObject **l, **p, **r;
972 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000973
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000974 assert(lo <= start && start <= hi);
975 /* assert [lo, start) is sorted */
976 if (lo == start)
977 ++start;
978 for (; start < hi; ++start) {
979 /* set l to where *start belongs */
980 l = lo;
981 r = start;
982 pivot = *r;
983 /* Invariants:
984 * pivot >= all in [lo, l).
985 * pivot < all in [r, start).
986 * The second is vacuously true at the start.
987 */
988 assert(l < r);
989 do {
990 p = l + ((r - l) >> 1);
991 IFLT(pivot, *p)
992 r = p;
993 else
994 l = p+1;
995 } while (l < r);
996 assert(l == r);
997 /* The invariants still hold, so pivot >= all in [lo, l) and
998 pivot < all in [l, start), so pivot belongs at l. Note
999 that if there are elements equal to pivot, l points to the
1000 first slot after them -- that's why this sort is stable.
1001 Slide over to make room.
1002 Caution: using memmove is much slower under MSVC 5;
1003 we're not usually moving many slots. */
1004 for (p = start; p > l; --p)
1005 *p = *(p-1);
1006 *l = pivot;
1007 }
1008 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001009
1010 fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001011 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001012}
1013
Tim Petersa64dc242002-08-01 02:13:36 +00001014/*
1015Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1016is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001017
Tim Petersa64dc242002-08-01 02:13:36 +00001018 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001019
Tim Petersa64dc242002-08-01 02:13:36 +00001020or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001021
Tim Petersa64dc242002-08-01 02:13:36 +00001022 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001023
Tim Petersa64dc242002-08-01 02:13:36 +00001024Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1025For its intended use in a stable mergesort, the strictness of the defn of
1026"descending" is needed so that the caller can safely reverse a descending
1027sequence without violating stability (strict > ensures there are no equal
1028elements to get out of order).
1029
1030Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001031*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001032static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001033count_run(PyObject **lo, PyObject **hi, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001034{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001035 Py_ssize_t k;
1036 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001037
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001038 assert(lo < hi);
1039 *descending = 0;
1040 ++lo;
1041 if (lo == hi)
1042 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001043
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001044 n = 2;
1045 IFLT(*lo, *(lo-1)) {
1046 *descending = 1;
1047 for (lo = lo+1; lo < hi; ++lo, ++n) {
1048 IFLT(*lo, *(lo-1))
1049 ;
1050 else
1051 break;
1052 }
1053 }
1054 else {
1055 for (lo = lo+1; lo < hi; ++lo, ++n) {
1056 IFLT(*lo, *(lo-1))
1057 break;
1058 }
1059 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001060
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001061 return n;
Tim Petersa64dc242002-08-01 02:13:36 +00001062fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001063 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001064}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001065
Tim Petersa64dc242002-08-01 02:13:36 +00001066/*
1067Locate the proper position of key in a sorted vector; if the vector contains
1068an element equal to key, return the position immediately to the left of
1069the leftmost equal element. [gallop_right() does the same except returns
1070the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001071
Tim Petersa64dc242002-08-01 02:13:36 +00001072"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001073
Tim Petersa64dc242002-08-01 02:13:36 +00001074"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1075hint is to the final result, the faster this runs.
1076
1077The return value is the int k in 0..n such that
1078
1079 a[k-1] < key <= a[k]
1080
1081pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1082key belongs at index k; or, IOW, the first k elements of a should precede
1083key, and the last n-k should follow key.
1084
1085Returns -1 on error. See listsort.txt for info on the method.
1086*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001087static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001088gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001089{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001090 Py_ssize_t ofs;
1091 Py_ssize_t lastofs;
1092 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001093
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001094 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001095
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001096 a += hint;
1097 lastofs = 0;
1098 ofs = 1;
1099 IFLT(*a, key) {
1100 /* a[hint] < key -- gallop right, until
1101 * a[hint + lastofs] < key <= a[hint + ofs]
1102 */
1103 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1104 while (ofs < maxofs) {
1105 IFLT(a[ofs], key) {
1106 lastofs = ofs;
1107 ofs = (ofs << 1) + 1;
1108 if (ofs <= 0) /* int overflow */
1109 ofs = maxofs;
1110 }
1111 else /* key <= a[hint + ofs] */
1112 break;
1113 }
1114 if (ofs > maxofs)
1115 ofs = maxofs;
1116 /* Translate back to offsets relative to &a[0]. */
1117 lastofs += hint;
1118 ofs += hint;
1119 }
1120 else {
1121 /* key <= a[hint] -- gallop left, until
1122 * a[hint - ofs] < key <= a[hint - lastofs]
1123 */
1124 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1125 while (ofs < maxofs) {
1126 IFLT(*(a-ofs), key)
1127 break;
1128 /* key <= a[hint - ofs] */
1129 lastofs = ofs;
1130 ofs = (ofs << 1) + 1;
1131 if (ofs <= 0) /* int overflow */
1132 ofs = maxofs;
1133 }
1134 if (ofs > maxofs)
1135 ofs = maxofs;
1136 /* Translate back to positive offsets relative to &a[0]. */
1137 k = lastofs;
1138 lastofs = hint - ofs;
1139 ofs = hint - k;
1140 }
1141 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001142
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001143 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1144 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1145 * right of lastofs but no farther right than ofs. Do a binary
1146 * search, with invariant a[lastofs-1] < key <= a[ofs].
1147 */
1148 ++lastofs;
1149 while (lastofs < ofs) {
1150 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001151
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001152 IFLT(a[m], key)
1153 lastofs = m+1; /* a[m] < key */
1154 else
1155 ofs = m; /* key <= a[m] */
1156 }
1157 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1158 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001159
1160fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001161 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001162}
1163
1164/*
1165Exactly like gallop_left(), except that if key already exists in a[0:n],
1166finds the position immediately to the right of the rightmost equal value.
1167
1168The return value is the int k in 0..n such that
1169
1170 a[k-1] <= key < a[k]
1171
1172or -1 if error.
1173
1174The code duplication is massive, but this is enough different given that
1175we're sticking to "<" comparisons that it's much harder to follow if
1176written as one routine with yet another "left or right?" flag.
1177*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001178static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001179gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001180{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001181 Py_ssize_t ofs;
1182 Py_ssize_t lastofs;
1183 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001184
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001185 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001186
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001187 a += hint;
1188 lastofs = 0;
1189 ofs = 1;
1190 IFLT(key, *a) {
1191 /* key < a[hint] -- gallop left, until
1192 * a[hint - ofs] <= key < a[hint - lastofs]
1193 */
1194 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1195 while (ofs < maxofs) {
1196 IFLT(key, *(a-ofs)) {
1197 lastofs = ofs;
1198 ofs = (ofs << 1) + 1;
1199 if (ofs <= 0) /* int overflow */
1200 ofs = maxofs;
1201 }
1202 else /* a[hint - ofs] <= key */
1203 break;
1204 }
1205 if (ofs > maxofs)
1206 ofs = maxofs;
1207 /* Translate back to positive offsets relative to &a[0]. */
1208 k = lastofs;
1209 lastofs = hint - ofs;
1210 ofs = hint - k;
1211 }
1212 else {
1213 /* a[hint] <= key -- gallop right, until
1214 * a[hint + lastofs] <= key < a[hint + ofs]
1215 */
1216 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1217 while (ofs < maxofs) {
1218 IFLT(key, a[ofs])
1219 break;
1220 /* a[hint + ofs] <= key */
1221 lastofs = ofs;
1222 ofs = (ofs << 1) + 1;
1223 if (ofs <= 0) /* int overflow */
1224 ofs = maxofs;
1225 }
1226 if (ofs > maxofs)
1227 ofs = maxofs;
1228 /* Translate back to offsets relative to &a[0]. */
1229 lastofs += hint;
1230 ofs += hint;
1231 }
1232 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001233
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001234 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1235 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1236 * right of lastofs but no farther right than ofs. Do a binary
1237 * search, with invariant a[lastofs-1] <= key < a[ofs].
1238 */
1239 ++lastofs;
1240 while (lastofs < ofs) {
1241 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001242
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001243 IFLT(key, a[m])
1244 ofs = m; /* key < a[m] */
1245 else
1246 lastofs = m+1; /* a[m] <= key */
1247 }
1248 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1249 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001250
1251fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001252 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001253}
1254
1255/* The maximum number of entries in a MergeState's pending-runs stack.
1256 * This is enough to sort arrays of size up to about
1257 * 32 * phi ** MAX_MERGE_PENDING
1258 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1259 * with 2**64 elements.
1260 */
1261#define MAX_MERGE_PENDING 85
1262
Tim Peterse05f65a2002-08-10 05:21:15 +00001263/* When we get into galloping mode, we stay there until both runs win less
1264 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001265 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001266#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001267
1268/* Avoid malloc for small temp arrays. */
1269#define MERGESTATE_TEMP_SIZE 256
1270
1271/* One MergeState exists on the stack per invocation of mergesort. It's just
1272 * a convenient way to pass state around among the helper functions.
1273 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001274struct s_slice {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001275 PyObject **base;
1276 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001277};
1278
Tim Petersa64dc242002-08-01 02:13:36 +00001279typedef struct s_MergeState {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001280 /* This controls when we get *into* galloping mode. It's initialized
1281 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1282 * random data, and lower for highly structured data.
1283 */
1284 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001285
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001286 /* 'a' is temp storage to help with merges. It contains room for
1287 * alloced entries.
1288 */
1289 PyObject **a; /* may point to temparray below */
1290 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001291
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001292 /* A stack of n pending runs yet to be merged. Run #i starts at
1293 * address base[i] and extends for len[i] elements. It's always
1294 * true (so long as the indices are in bounds) that
1295 *
1296 * pending[i].base + pending[i].len == pending[i+1].base
1297 *
1298 * so we could cut the storage for this, but it's a minor amount,
1299 * and keeping all the info explicit simplifies the code.
1300 */
1301 int n;
1302 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001303
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001304 /* 'a' points to this when possible, rather than muck with malloc. */
1305 PyObject *temparray[MERGESTATE_TEMP_SIZE];
Tim Petersa64dc242002-08-01 02:13:36 +00001306} MergeState;
1307
1308/* Conceptually a MergeState's constructor. */
1309static void
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001310merge_init(MergeState *ms)
Tim Petersa64dc242002-08-01 02:13:36 +00001311{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001312 assert(ms != NULL);
1313 ms->a = ms->temparray;
1314 ms->alloced = MERGESTATE_TEMP_SIZE;
1315 ms->n = 0;
1316 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001317}
1318
1319/* Free all the temp memory owned by the MergeState. This must be called
1320 * when you're done with a MergeState, and may be called before then if
1321 * you want to free the temp memory early.
1322 */
1323static void
1324merge_freemem(MergeState *ms)
1325{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001326 assert(ms != NULL);
1327 if (ms->a != ms->temparray)
1328 PyMem_Free(ms->a);
1329 ms->a = ms->temparray;
1330 ms->alloced = MERGESTATE_TEMP_SIZE;
Tim Petersa64dc242002-08-01 02:13:36 +00001331}
1332
1333/* Ensure enough temp memory for 'need' array slots is available.
1334 * Returns 0 on success and -1 if the memory can't be gotten.
1335 */
1336static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001337merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001338{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001339 assert(ms != NULL);
1340 if (need <= ms->alloced)
1341 return 0;
1342 /* Don't realloc! That can cost cycles to copy the old data, but
1343 * we don't care what's in the block.
1344 */
1345 merge_freemem(ms);
1346 if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*)) {
1347 PyErr_NoMemory();
1348 return -1;
1349 }
1350 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1351 if (ms->a) {
1352 ms->alloced = need;
1353 return 0;
1354 }
1355 PyErr_NoMemory();
1356 merge_freemem(ms); /* reset to sane state */
1357 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001358}
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001359#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1360 merge_getmem(MS, NEED))
Tim Petersa64dc242002-08-01 02:13:36 +00001361
1362/* Merge the na elements starting at pa with the nb elements starting at pb
1363 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1364 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1365 * merge, and should have na <= nb. See listsort.txt for more info.
1366 * Return 0 if successful, -1 if error.
1367 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001368static Py_ssize_t
1369merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1370 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001371{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001372 Py_ssize_t k;
1373 PyObject **dest;
1374 int result = -1; /* guilty until proved innocent */
1375 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001376
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001377 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1378 if (MERGE_GETMEM(ms, na) < 0)
1379 return -1;
1380 memcpy(ms->a, pa, na * sizeof(PyObject*));
1381 dest = pa;
1382 pa = ms->a;
Tim Petersa64dc242002-08-01 02:13:36 +00001383
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001384 *dest++ = *pb++;
1385 --nb;
1386 if (nb == 0)
1387 goto Succeed;
1388 if (na == 1)
1389 goto CopyB;
Tim Petersa64dc242002-08-01 02:13:36 +00001390
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001391 min_gallop = ms->min_gallop;
1392 for (;;) {
1393 Py_ssize_t acount = 0; /* # of times A won in a row */
1394 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001395
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001396 /* Do the straightforward thing until (if ever) one run
1397 * appears to win consistently.
1398 */
1399 for (;;) {
1400 assert(na > 1 && nb > 0);
1401 k = ISLT(*pb, *pa);
1402 if (k) {
1403 if (k < 0)
1404 goto Fail;
1405 *dest++ = *pb++;
1406 ++bcount;
1407 acount = 0;
1408 --nb;
1409 if (nb == 0)
1410 goto Succeed;
1411 if (bcount >= min_gallop)
1412 break;
1413 }
1414 else {
1415 *dest++ = *pa++;
1416 ++acount;
1417 bcount = 0;
1418 --na;
1419 if (na == 1)
1420 goto CopyB;
1421 if (acount >= min_gallop)
1422 break;
1423 }
1424 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001425
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001426 /* One run is winning so consistently that galloping may
1427 * be a huge win. So try that, and continue galloping until
1428 * (if ever) neither run appears to be winning consistently
1429 * anymore.
1430 */
1431 ++min_gallop;
1432 do {
1433 assert(na > 1 && nb > 0);
1434 min_gallop -= min_gallop > 1;
1435 ms->min_gallop = min_gallop;
1436 k = gallop_right(*pb, pa, na, 0);
1437 acount = k;
1438 if (k) {
1439 if (k < 0)
1440 goto Fail;
1441 memcpy(dest, pa, k * sizeof(PyObject *));
1442 dest += k;
1443 pa += k;
1444 na -= k;
1445 if (na == 1)
1446 goto CopyB;
1447 /* na==0 is impossible now if the comparison
1448 * function is consistent, but we can't assume
1449 * that it is.
1450 */
1451 if (na == 0)
1452 goto Succeed;
1453 }
1454 *dest++ = *pb++;
1455 --nb;
1456 if (nb == 0)
1457 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001458
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001459 k = gallop_left(*pa, pb, nb, 0);
1460 bcount = k;
1461 if (k) {
1462 if (k < 0)
1463 goto Fail;
1464 memmove(dest, pb, k * sizeof(PyObject *));
1465 dest += k;
1466 pb += k;
1467 nb -= k;
1468 if (nb == 0)
1469 goto Succeed;
1470 }
1471 *dest++ = *pa++;
1472 --na;
1473 if (na == 1)
1474 goto CopyB;
1475 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1476 ++min_gallop; /* penalize it for leaving galloping mode */
1477 ms->min_gallop = min_gallop;
1478 }
Tim Petersa64dc242002-08-01 02:13:36 +00001479Succeed:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001480 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001481Fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001482 if (na)
1483 memcpy(dest, pa, na * sizeof(PyObject*));
1484 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001485CopyB:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001486 assert(na == 1 && nb > 0);
1487 /* The last element of pa belongs at the end of the merge. */
1488 memmove(dest, pb, nb * sizeof(PyObject *));
1489 dest[nb] = *pa;
1490 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001491}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001492
Tim Petersa64dc242002-08-01 02:13:36 +00001493/* Merge the na elements starting at pa with the nb elements starting at pb
1494 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1495 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1496 * merge, and should have na >= nb. See listsort.txt for more info.
1497 * Return 0 if successful, -1 if error.
1498 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001499static Py_ssize_t
1500merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001501{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001502 Py_ssize_t k;
1503 PyObject **dest;
1504 int result = -1; /* guilty until proved innocent */
1505 PyObject **basea;
1506 PyObject **baseb;
1507 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001508
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001509 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1510 if (MERGE_GETMEM(ms, nb) < 0)
1511 return -1;
1512 dest = pb + nb - 1;
1513 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1514 basea = pa;
1515 baseb = ms->a;
1516 pb = ms->a + nb - 1;
1517 pa += na - 1;
Tim Petersa64dc242002-08-01 02:13:36 +00001518
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001519 *dest-- = *pa--;
1520 --na;
1521 if (na == 0)
1522 goto Succeed;
1523 if (nb == 1)
1524 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001525
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001526 min_gallop = ms->min_gallop;
1527 for (;;) {
1528 Py_ssize_t acount = 0; /* # of times A won in a row */
1529 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001530
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001531 /* Do the straightforward thing until (if ever) one run
1532 * appears to win consistently.
1533 */
1534 for (;;) {
1535 assert(na > 0 && nb > 1);
1536 k = ISLT(*pb, *pa);
1537 if (k) {
1538 if (k < 0)
1539 goto Fail;
1540 *dest-- = *pa--;
1541 ++acount;
1542 bcount = 0;
1543 --na;
1544 if (na == 0)
1545 goto Succeed;
1546 if (acount >= min_gallop)
1547 break;
1548 }
1549 else {
1550 *dest-- = *pb--;
1551 ++bcount;
1552 acount = 0;
1553 --nb;
1554 if (nb == 1)
1555 goto CopyA;
1556 if (bcount >= min_gallop)
1557 break;
1558 }
1559 }
Tim Petersa64dc242002-08-01 02:13:36 +00001560
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001561 /* One run is winning so consistently that galloping may
1562 * be a huge win. So try that, and continue galloping until
1563 * (if ever) neither run appears to be winning consistently
1564 * anymore.
1565 */
1566 ++min_gallop;
1567 do {
1568 assert(na > 0 && nb > 1);
1569 min_gallop -= min_gallop > 1;
1570 ms->min_gallop = min_gallop;
1571 k = gallop_right(*pb, basea, na, na-1);
1572 if (k < 0)
1573 goto Fail;
1574 k = na - k;
1575 acount = k;
1576 if (k) {
1577 dest -= k;
1578 pa -= k;
1579 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1580 na -= k;
1581 if (na == 0)
1582 goto Succeed;
1583 }
1584 *dest-- = *pb--;
1585 --nb;
1586 if (nb == 1)
1587 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001588
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001589 k = gallop_left(*pa, baseb, nb, nb-1);
1590 if (k < 0)
1591 goto Fail;
1592 k = nb - k;
1593 bcount = k;
1594 if (k) {
1595 dest -= k;
1596 pb -= k;
1597 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1598 nb -= k;
1599 if (nb == 1)
1600 goto CopyA;
1601 /* nb==0 is impossible now if the comparison
1602 * function is consistent, but we can't assume
1603 * that it is.
1604 */
1605 if (nb == 0)
1606 goto Succeed;
1607 }
1608 *dest-- = *pa--;
1609 --na;
1610 if (na == 0)
1611 goto Succeed;
1612 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1613 ++min_gallop; /* penalize it for leaving galloping mode */
1614 ms->min_gallop = min_gallop;
1615 }
Tim Petersa64dc242002-08-01 02:13:36 +00001616Succeed:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001617 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001618Fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001619 if (nb)
1620 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1621 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001622CopyA:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001623 assert(nb == 1 && na > 0);
1624 /* The first element of pb belongs at the front of the merge. */
1625 dest -= na;
1626 pa -= na;
1627 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1628 *dest = *pb;
1629 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001630}
1631
1632/* Merge the two runs at stack indices i and i+1.
1633 * Returns 0 on success, -1 on error.
1634 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001635static Py_ssize_t
1636merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001637{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001638 PyObject **pa, **pb;
1639 Py_ssize_t na, nb;
1640 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001641
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001642 assert(ms != NULL);
1643 assert(ms->n >= 2);
1644 assert(i >= 0);
1645 assert(i == ms->n - 2 || i == ms->n - 3);
Tim Petersa64dc242002-08-01 02:13:36 +00001646
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001647 pa = ms->pending[i].base;
1648 na = ms->pending[i].len;
1649 pb = ms->pending[i+1].base;
1650 nb = ms->pending[i+1].len;
1651 assert(na > 0 && nb > 0);
1652 assert(pa + na == pb);
Tim Petersa64dc242002-08-01 02:13:36 +00001653
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001654 /* Record the length of the combined runs; if i is the 3rd-last
1655 * run now, also slide over the last run (which isn't involved
1656 * in this merge). The current run i+1 goes away in any case.
1657 */
1658 ms->pending[i].len = na + nb;
1659 if (i == ms->n - 3)
1660 ms->pending[i+1] = ms->pending[i+2];
1661 --ms->n;
Tim Petersa64dc242002-08-01 02:13:36 +00001662
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001663 /* Where does b start in a? Elements in a before that can be
1664 * ignored (already in place).
1665 */
1666 k = gallop_right(*pb, pa, na, 0);
1667 if (k < 0)
1668 return -1;
1669 pa += k;
1670 na -= k;
1671 if (na == 0)
1672 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001673
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001674 /* Where does a end in b? Elements in b after that can be
1675 * ignored (already in place).
1676 */
1677 nb = gallop_left(pa[na-1], pb, nb, nb-1);
1678 if (nb <= 0)
1679 return nb;
Tim Petersa64dc242002-08-01 02:13:36 +00001680
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001681 /* Merge what remains of the runs, using a temp array with
1682 * min(na, nb) elements.
1683 */
1684 if (na <= nb)
1685 return merge_lo(ms, pa, na, pb, nb);
1686 else
1687 return merge_hi(ms, pa, na, pb, nb);
Tim Petersa64dc242002-08-01 02:13:36 +00001688}
1689
1690/* Examine the stack of runs waiting to be merged, merging adjacent runs
1691 * until the stack invariants are re-established:
1692 *
1693 * 1. len[-3] > len[-2] + len[-1]
1694 * 2. len[-2] > len[-1]
1695 *
1696 * See listsort.txt for more info.
1697 *
1698 * Returns 0 on success, -1 on error.
1699 */
1700static int
1701merge_collapse(MergeState *ms)
1702{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001703 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001704
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001705 assert(ms);
1706 while (ms->n > 1) {
1707 Py_ssize_t n = ms->n - 2;
1708 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1709 if (p[n-1].len < p[n+1].len)
1710 --n;
1711 if (merge_at(ms, n) < 0)
1712 return -1;
1713 }
1714 else if (p[n].len <= p[n+1].len) {
1715 if (merge_at(ms, n) < 0)
1716 return -1;
1717 }
1718 else
1719 break;
1720 }
1721 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001722}
1723
1724/* Regardless of invariants, merge all runs on the stack until only one
1725 * remains. This is used at the end of the mergesort.
1726 *
1727 * Returns 0 on success, -1 on error.
1728 */
1729static int
1730merge_force_collapse(MergeState *ms)
1731{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001732 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001733
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001734 assert(ms);
1735 while (ms->n > 1) {
1736 Py_ssize_t n = ms->n - 2;
1737 if (n > 0 && p[n-1].len < p[n+1].len)
1738 --n;
1739 if (merge_at(ms, n) < 0)
1740 return -1;
1741 }
1742 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001743}
1744
1745/* Compute a good value for the minimum run length; natural runs shorter
1746 * than this are boosted artificially via binary insertion.
1747 *
1748 * If n < 64, return n (it's too small to bother with fancy stuff).
1749 * Else if n is an exact power of 2, return 32.
1750 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1751 * strictly less than, an exact power of 2.
1752 *
1753 * See listsort.txt for more info.
1754 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001755static Py_ssize_t
1756merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001757{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001758 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001759
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001760 assert(n >= 0);
1761 while (n >= 64) {
1762 r |= n & 1;
1763 n >>= 1;
1764 }
1765 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001766}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001767
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001768/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001769 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001770 which is returned during the undecorate phase. By exposing only the key
1771 during comparisons, the underlying sort stability characteristics are left
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001772 unchanged. Also, the comparison function will only see the key instead of
1773 a full record. */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001774
1775typedef struct {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001776 PyObject_HEAD
1777 PyObject *key;
1778 PyObject *value;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001779} sortwrapperobject;
1780
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001781PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001782static PyObject *
1783sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1784static void
1785sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001786
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001787PyTypeObject PySortWrapper_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001788 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1789 "sortwrapper", /* tp_name */
1790 sizeof(sortwrapperobject), /* tp_basicsize */
1791 0, /* tp_itemsize */
1792 /* methods */
1793 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1794 0, /* tp_print */
1795 0, /* tp_getattr */
1796 0, /* tp_setattr */
1797 0, /* tp_reserved */
1798 0, /* tp_repr */
1799 0, /* tp_as_number */
1800 0, /* tp_as_sequence */
1801 0, /* tp_as_mapping */
1802 0, /* tp_hash */
1803 0, /* tp_call */
1804 0, /* tp_str */
1805 PyObject_GenericGetAttr, /* tp_getattro */
1806 0, /* tp_setattro */
1807 0, /* tp_as_buffer */
1808 Py_TPFLAGS_DEFAULT, /* tp_flags */
1809 sortwrapper_doc, /* tp_doc */
1810 0, /* tp_traverse */
1811 0, /* tp_clear */
1812 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001813};
1814
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815
1816static PyObject *
1817sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1818{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001819 if (!PyObject_TypeCheck(b, &PySortWrapper_Type)) {
1820 PyErr_SetString(PyExc_TypeError,
1821 "expected a sortwrapperobject");
1822 return NULL;
1823 }
1824 return PyObject_RichCompare(a->key, b->key, op);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001825}
1826
1827static void
1828sortwrapper_dealloc(sortwrapperobject *so)
1829{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001830 Py_XDECREF(so->key);
1831 Py_XDECREF(so->value);
1832 PyObject_Del(so);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001833}
1834
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001835/* Returns a new reference to a sortwrapper.
1836 Consumes the references to the two underlying objects. */
1837
1838static PyObject *
1839build_sortwrapper(PyObject *key, PyObject *value)
1840{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001841 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001842
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001843 so = PyObject_New(sortwrapperobject, &PySortWrapper_Type);
1844 if (so == NULL)
1845 return NULL;
1846 so->key = key;
1847 so->value = value;
1848 return (PyObject *)so;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001849}
1850
1851/* Returns a new reference to the value underlying the wrapper. */
1852static PyObject *
1853sortwrapper_getvalue(PyObject *so)
1854{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001855 PyObject *value;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001856
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001857 if (!PyObject_TypeCheck(so, &PySortWrapper_Type)) {
1858 PyErr_SetString(PyExc_TypeError,
1859 "expected a sortwrapperobject");
1860 return NULL;
1861 }
1862 value = ((sortwrapperobject *)so)->value;
1863 Py_INCREF(value);
1864 return value;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001865}
1866
Tim Petersa64dc242002-08-01 02:13:36 +00001867/* An adaptive, stable, natural mergesort. See listsort.txt.
1868 * Returns Py_None on success, NULL on error. Even in case of error, the
1869 * list will be some permutation of its input state (nothing is lost or
1870 * duplicated).
1871 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001872static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001873listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001874{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001875 MergeState ms;
1876 PyObject **lo, **hi;
1877 Py_ssize_t nremaining;
1878 Py_ssize_t minrun;
1879 Py_ssize_t saved_ob_size, saved_allocated;
1880 PyObject **saved_ob_item;
1881 PyObject **final_ob_item;
1882 PyObject *result = NULL; /* guilty until proved innocent */
1883 int reverse = 0;
1884 PyObject *keyfunc = NULL;
1885 Py_ssize_t i;
1886 PyObject *key, *value, *kvpair;
1887 static char *kwlist[] = {"key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001888
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001889 assert(self != NULL);
1890 assert (PyList_Check(self));
1891 if (args != NULL) {
1892 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1893 kwlist, &keyfunc, &reverse))
1894 return NULL;
1895 if (Py_SIZE(args) > 0) {
1896 PyErr_SetString(PyExc_TypeError,
1897 "must use keyword argument for key function");
1898 return NULL;
1899 }
1900 }
1901 if (keyfunc == Py_None)
1902 keyfunc = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001903
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001904 /* The list is temporarily made empty, so that mutations performed
1905 * by comparison functions can't affect the slice of memory we're
1906 * sorting (allowing mutations during sorting is a core-dump
1907 * factory, since ob_item may change).
1908 */
1909 saved_ob_size = Py_SIZE(self);
1910 saved_ob_item = self->ob_item;
1911 saved_allocated = self->allocated;
1912 Py_SIZE(self) = 0;
1913 self->ob_item = NULL;
1914 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00001915
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001916 if (keyfunc != NULL) {
1917 for (i=0 ; i < saved_ob_size ; i++) {
1918 value = saved_ob_item[i];
1919 key = PyObject_CallFunctionObjArgs(keyfunc, value,
1920 NULL);
1921 if (key == NULL) {
1922 for (i=i-1 ; i>=0 ; i--) {
1923 kvpair = saved_ob_item[i];
1924 value = sortwrapper_getvalue(kvpair);
1925 saved_ob_item[i] = value;
1926 Py_DECREF(kvpair);
1927 }
1928 goto dsu_fail;
1929 }
1930 kvpair = build_sortwrapper(key, value);
1931 if (kvpair == NULL)
1932 goto dsu_fail;
1933 saved_ob_item[i] = kvpair;
1934 }
1935 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001936
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001937 /* Reverse sort stability achieved by initially reversing the list,
1938 applying a stable forward sort, then reversing the final result. */
1939 if (reverse && saved_ob_size > 1)
1940 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001941
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001942 merge_init(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001943
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001944 nremaining = saved_ob_size;
1945 if (nremaining < 2)
1946 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001947
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001948 /* March over the array once, left to right, finding natural runs,
1949 * and extending short natural runs to minrun elements.
1950 */
1951 lo = saved_ob_item;
1952 hi = lo + nremaining;
1953 minrun = merge_compute_minrun(nremaining);
1954 do {
1955 int descending;
1956 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00001957
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001958 /* Identify next run. */
1959 n = count_run(lo, hi, &descending);
1960 if (n < 0)
1961 goto fail;
1962 if (descending)
1963 reverse_slice(lo, lo + n);
1964 /* If short, extend to min(minrun, nremaining). */
1965 if (n < minrun) {
1966 const Py_ssize_t force = nremaining <= minrun ?
1967 nremaining : minrun;
1968 if (binarysort(lo, lo + force, lo + n) < 0)
1969 goto fail;
1970 n = force;
1971 }
1972 /* Push run onto pending-runs stack, and maybe merge. */
1973 assert(ms.n < MAX_MERGE_PENDING);
1974 ms.pending[ms.n].base = lo;
1975 ms.pending[ms.n].len = n;
1976 ++ms.n;
1977 if (merge_collapse(&ms) < 0)
1978 goto fail;
1979 /* Advance to find next run. */
1980 lo += n;
1981 nremaining -= n;
1982 } while (nremaining);
1983 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00001984
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001985 if (merge_force_collapse(&ms) < 0)
1986 goto fail;
1987 assert(ms.n == 1);
1988 assert(ms.pending[0].base == saved_ob_item);
1989 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00001990
1991succeed:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001992 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00001993fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001994 if (keyfunc != NULL) {
1995 for (i=0 ; i < saved_ob_size ; i++) {
1996 kvpair = saved_ob_item[i];
1997 value = sortwrapper_getvalue(kvpair);
1998 saved_ob_item[i] = value;
1999 Py_DECREF(kvpair);
2000 }
2001 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002002
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002003 if (self->allocated != -1 && result != NULL) {
2004 /* The user mucked with the list during the sort,
2005 * and we don't already have another error to report.
2006 */
2007 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2008 result = NULL;
2009 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002010
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002011 if (reverse && saved_ob_size > 1)
2012 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002013
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002014 merge_freemem(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002015
2016dsu_fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002017 final_ob_item = self->ob_item;
2018 i = Py_SIZE(self);
2019 Py_SIZE(self) = saved_ob_size;
2020 self->ob_item = saved_ob_item;
2021 self->allocated = saved_allocated;
2022 if (final_ob_item != NULL) {
2023 /* we cannot use list_clear() for this because it does not
2024 guarantee that the list is really empty when it returns */
2025 while (--i >= 0) {
2026 Py_XDECREF(final_ob_item[i]);
2027 }
2028 PyMem_FREE(final_ob_item);
2029 }
2030 Py_XINCREF(result);
2031 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002032}
Tim Peters330f9e92002-07-19 07:05:44 +00002033#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002034#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002035
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002036int
Fred Drakea2f55112000-07-09 15:16:51 +00002037PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002038{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002039 if (v == NULL || !PyList_Check(v)) {
2040 PyErr_BadInternalCall();
2041 return -1;
2042 }
2043 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2044 if (v == NULL)
2045 return -1;
2046 Py_DECREF(v);
2047 return 0;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002048}
2049
Guido van Rossumb86c5492001-02-12 22:06:02 +00002050static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002051listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002052{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002053 if (Py_SIZE(self) > 1)
2054 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2055 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002056}
2057
Guido van Rossum84c76f51990-10-30 13:32:20 +00002058int
Fred Drakea2f55112000-07-09 15:16:51 +00002059PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002060{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002061 PyListObject *self = (PyListObject *)v;
Tim Peters6063e262002-08-08 01:06:39 +00002062
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002063 if (v == NULL || !PyList_Check(v)) {
2064 PyErr_BadInternalCall();
2065 return -1;
2066 }
2067 if (Py_SIZE(self) > 1)
2068 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2069 return 0;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002070}
2071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002072PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002073PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002074{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002075 PyObject *w;
2076 PyObject **p, **q;
2077 Py_ssize_t n;
2078 if (v == NULL || !PyList_Check(v)) {
2079 PyErr_BadInternalCall();
2080 return NULL;
2081 }
2082 n = Py_SIZE(v);
2083 w = PyTuple_New(n);
2084 if (w == NULL)
2085 return NULL;
2086 p = ((PyTupleObject *)w)->ob_item;
2087 q = ((PyListObject *)v)->ob_item;
2088 while (--n >= 0) {
2089 Py_INCREF(*q);
2090 *p = *q;
2091 p++;
2092 q++;
2093 }
2094 return w;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002095}
2096
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002098listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002099{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002100 Py_ssize_t i, start=0, stop=Py_SIZE(self);
2101 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002102
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002103 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2104 _PyEval_SliceIndex, &start,
2105 _PyEval_SliceIndex, &stop))
2106 return NULL;
2107 if (start < 0) {
2108 start += Py_SIZE(self);
2109 if (start < 0)
2110 start = 0;
2111 }
2112 if (stop < 0) {
2113 stop += Py_SIZE(self);
2114 if (stop < 0)
2115 stop = 0;
2116 }
2117 for (i = start; i < stop && i < Py_SIZE(self); i++) {
2118 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2119 if (cmp > 0)
2120 return PyLong_FromSsize_t(i);
2121 else if (cmp < 0)
2122 return NULL;
2123 }
2124 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
2125 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002126}
2127
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002128static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002129listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002130{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002131 Py_ssize_t count = 0;
2132 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002133
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002134 for (i = 0; i < Py_SIZE(self); i++) {
2135 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2136 if (cmp > 0)
2137 count++;
2138 else if (cmp < 0)
2139 return NULL;
2140 }
2141 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002142}
2143
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002144static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002145listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002146{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002147 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002148
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002149 for (i = 0; i < Py_SIZE(self); i++) {
2150 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2151 if (cmp > 0) {
2152 if (list_ass_slice(self, i, i+1,
2153 (PyObject *)NULL) == 0)
2154 Py_RETURN_NONE;
2155 return NULL;
2156 }
2157 else if (cmp < 0)
2158 return NULL;
2159 }
2160 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2161 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002162}
2163
Jeremy Hylton8caad492000-06-23 14:18:11 +00002164static int
2165list_traverse(PyListObject *o, visitproc visit, void *arg)
2166{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002167 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002168
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002169 for (i = Py_SIZE(o); --i >= 0; )
2170 Py_VISIT(o->ob_item[i]);
2171 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002172}
2173
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002174static PyObject *
2175list_richcompare(PyObject *v, PyObject *w, int op)
2176{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002177 PyListObject *vl, *wl;
2178 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002179
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002180 if (!PyList_Check(v) || !PyList_Check(w)) {
2181 Py_INCREF(Py_NotImplemented);
2182 return Py_NotImplemented;
2183 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002184
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002185 vl = (PyListObject *)v;
2186 wl = (PyListObject *)w;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002187
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002188 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2189 /* Shortcut: if the lengths differ, the lists differ */
2190 PyObject *res;
2191 if (op == Py_EQ)
2192 res = Py_False;
2193 else
2194 res = Py_True;
2195 Py_INCREF(res);
2196 return res;
2197 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002198
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002199 /* Search for the first index where items are different */
2200 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2201 int k = PyObject_RichCompareBool(vl->ob_item[i],
2202 wl->ob_item[i], Py_EQ);
2203 if (k < 0)
2204 return NULL;
2205 if (!k)
2206 break;
2207 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002208
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002209 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2210 /* No more items to compare -- compare sizes */
2211 Py_ssize_t vs = Py_SIZE(vl);
2212 Py_ssize_t ws = Py_SIZE(wl);
2213 int cmp;
2214 PyObject *res;
2215 switch (op) {
2216 case Py_LT: cmp = vs < ws; break;
2217 case Py_LE: cmp = vs <= ws; break;
2218 case Py_EQ: cmp = vs == ws; break;
2219 case Py_NE: cmp = vs != ws; break;
2220 case Py_GT: cmp = vs > ws; break;
2221 case Py_GE: cmp = vs >= ws; break;
2222 default: return NULL; /* cannot happen */
2223 }
2224 if (cmp)
2225 res = Py_True;
2226 else
2227 res = Py_False;
2228 Py_INCREF(res);
2229 return res;
2230 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002231
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002232 /* We have an item that differs -- shortcuts for EQ/NE */
2233 if (op == Py_EQ) {
2234 Py_INCREF(Py_False);
2235 return Py_False;
2236 }
2237 if (op == Py_NE) {
2238 Py_INCREF(Py_True);
2239 return Py_True;
2240 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002241
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002242 /* Compare the final item again using the proper operator */
2243 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002244}
2245
Tim Peters6d6c1a32001-08-02 04:15:00 +00002246static int
2247list_init(PyListObject *self, PyObject *args, PyObject *kw)
2248{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002249 PyObject *arg = NULL;
2250 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002251
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002252 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2253 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002254
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002255 /* Verify list invariants established by PyType_GenericAlloc() */
2256 assert(0 <= Py_SIZE(self));
2257 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2258 assert(self->ob_item != NULL ||
2259 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002260
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002261 /* Empty previous contents */
2262 if (self->ob_item != NULL) {
2263 (void)list_clear(self);
2264 }
2265 if (arg != NULL) {
2266 PyObject *rv = listextend(self, arg);
2267 if (rv == NULL)
2268 return -1;
2269 Py_DECREF(rv);
2270 }
2271 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002272}
2273
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002274static PyObject *
2275list_sizeof(PyListObject *self)
2276{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002277 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002278
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002279 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
2280 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002281}
2282
Raymond Hettinger1021c442003-11-07 15:38:09 +00002283static PyObject *list_iter(PyObject *seq);
2284static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2285
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002286PyDoc_STRVAR(getitem_doc,
2287"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002288PyDoc_STRVAR(reversed_doc,
2289"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002290PyDoc_STRVAR(sizeof_doc,
2291"L.__sizeof__() -- size of L in memory, in bytes");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002292PyDoc_STRVAR(append_doc,
2293"L.append(object) -- append object to end");
2294PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002295"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002296PyDoc_STRVAR(insert_doc,
2297"L.insert(index, object) -- insert object before index");
2298PyDoc_STRVAR(pop_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002299"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2300"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002301PyDoc_STRVAR(remove_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002302"L.remove(value) -- remove first occurrence of value.\n"
2303"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002304PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002305"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2306"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002307PyDoc_STRVAR(count_doc,
2308"L.count(value) -> integer -- return number of occurrences of value");
2309PyDoc_STRVAR(reverse_doc,
2310"L.reverse() -- reverse *IN PLACE*");
2311PyDoc_STRVAR(sort_doc,
Benjamin Petersoncb9a5512008-09-30 02:08:36 +00002312"L.sort(key=None, reverse=False) -- stable sort *IN PLACE*");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002313
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002314static PyObject *list_subscript(PyListObject*, PyObject*);
2315
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002316static PyMethodDef list_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002317 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2318 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2319 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
2320 {"append", (PyCFunction)listappend, METH_O, append_doc},
2321 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
2322 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
2323 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
2324 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2325 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
2326 {"count", (PyCFunction)listcount, METH_O, count_doc},
2327 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2328 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
2329 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002330};
2331
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002332static PySequenceMethods list_as_sequence = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002333 (lenfunc)list_length, /* sq_length */
2334 (binaryfunc)list_concat, /* sq_concat */
2335 (ssizeargfunc)list_repeat, /* sq_repeat */
2336 (ssizeargfunc)list_item, /* sq_item */
2337 0, /* sq_slice */
2338 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2339 0, /* sq_ass_slice */
2340 (objobjproc)list_contains, /* sq_contains */
2341 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2342 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002343};
2344
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002345PyDoc_STRVAR(list_doc,
Ezio Melotti807e98e2010-03-01 04:10:55 +00002346"list() -> new empty list\n"
2347"list(iterable) -> new list initialized from iterable's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002348
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002349static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002350list_subscript(PyListObject* self, PyObject* item)
2351{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002352 if (PyIndex_Check(item)) {
2353 Py_ssize_t i;
2354 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2355 if (i == -1 && PyErr_Occurred())
2356 return NULL;
2357 if (i < 0)
2358 i += PyList_GET_SIZE(self);
2359 return list_item(self, i);
2360 }
2361 else if (PySlice_Check(item)) {
2362 Py_ssize_t start, stop, step, slicelength, cur, i;
2363 PyObject* result;
2364 PyObject* it;
2365 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002366
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002367 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
2368 &start, &stop, &step, &slicelength) < 0) {
2369 return NULL;
2370 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002371
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002372 if (slicelength <= 0) {
2373 return PyList_New(0);
2374 }
2375 else if (step == 1) {
2376 return list_slice(self, start, stop);
2377 }
2378 else {
2379 result = PyList_New(slicelength);
2380 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002381
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002382 src = self->ob_item;
2383 dest = ((PyListObject *)result)->ob_item;
2384 for (cur = start, i = 0; i < slicelength;
2385 cur += step, i++) {
2386 it = src[cur];
2387 Py_INCREF(it);
2388 dest[i] = it;
2389 }
Tim Peters3b01a122002-07-19 02:35:45 +00002390
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002391 return result;
2392 }
2393 }
2394 else {
2395 PyErr_Format(PyExc_TypeError,
2396 "list indices must be integers, not %.200s",
2397 item->ob_type->tp_name);
2398 return NULL;
2399 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002400}
2401
Tim Peters3b01a122002-07-19 02:35:45 +00002402static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002403list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2404{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002405 if (PyIndex_Check(item)) {
2406 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2407 if (i == -1 && PyErr_Occurred())
2408 return -1;
2409 if (i < 0)
2410 i += PyList_GET_SIZE(self);
2411 return list_ass_item(self, i, value);
2412 }
2413 else if (PySlice_Check(item)) {
2414 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002415
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002416 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
2417 &start, &stop, &step, &slicelength) < 0) {
2418 return -1;
2419 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002420
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002421 if (step == 1)
2422 return list_ass_slice(self, start, stop, value);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002423
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002424 /* Make sure s[5:2] = [..] inserts at the right place:
2425 before 5, not before 2. */
2426 if ((step < 0 && start < stop) ||
2427 (step > 0 && start > stop))
2428 stop = start;
Thomas Woutersed03b412007-08-28 21:37:11 +00002429
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002430 if (value == NULL) {
2431 /* delete slice */
2432 PyObject **garbage;
2433 size_t cur;
2434 Py_ssize_t i;
Tim Peters3b01a122002-07-19 02:35:45 +00002435
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002436 if (slicelength <= 0)
2437 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002438
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002439 if (step < 0) {
2440 stop = start + 1;
2441 start = stop + step*(slicelength - 1) - 1;
2442 step = -step;
2443 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002444
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002445 assert((size_t)slicelength <=
2446 PY_SIZE_MAX / sizeof(PyObject*));
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00002447
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002448 garbage = (PyObject**)
2449 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2450 if (!garbage) {
2451 PyErr_NoMemory();
2452 return -1;
2453 }
Tim Peters3b01a122002-07-19 02:35:45 +00002454
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002455 /* drawing pictures might help understand these for
2456 loops. Basically, we memmove the parts of the
2457 list that are *not* part of the slice: step-1
2458 items for each item that is part of the slice,
2459 and then tail end of the list that was not
2460 covered by the slice */
2461 for (cur = start, i = 0;
2462 cur < (size_t)stop;
2463 cur += step, i++) {
2464 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002465
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002466 garbage[i] = PyList_GET_ITEM(self, cur);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002467
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002468 if (cur + step >= (size_t)Py_SIZE(self)) {
2469 lim = Py_SIZE(self) - cur - 1;
2470 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00002471
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002472 memmove(self->ob_item + cur - i,
2473 self->ob_item + cur + 1,
2474 lim * sizeof(PyObject *));
2475 }
2476 cur = start + slicelength*step;
2477 if (cur < (size_t)Py_SIZE(self)) {
2478 memmove(self->ob_item + cur - slicelength,
2479 self->ob_item + cur,
2480 (Py_SIZE(self) - cur) *
2481 sizeof(PyObject *));
2482 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002483
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002484 Py_SIZE(self) -= slicelength;
2485 list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002486
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002487 for (i = 0; i < slicelength; i++) {
2488 Py_DECREF(garbage[i]);
2489 }
2490 PyMem_FREE(garbage);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002491
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002492 return 0;
2493 }
2494 else {
2495 /* assign slice */
2496 PyObject *ins, *seq;
2497 PyObject **garbage, **seqitems, **selfitems;
2498 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002499
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002500 /* protect against a[::-1] = a */
2501 if (self == (PyListObject*)value) {
2502 seq = list_slice((PyListObject*)value, 0,
2503 PyList_GET_SIZE(value));
2504 }
2505 else {
2506 seq = PySequence_Fast(value,
2507 "must assign iterable "
2508 "to extended slice");
2509 }
2510 if (!seq)
2511 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002512
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002513 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2514 PyErr_Format(PyExc_ValueError,
2515 "attempt to assign sequence of "
2516 "size %zd to extended slice of "
2517 "size %zd",
2518 PySequence_Fast_GET_SIZE(seq),
2519 slicelength);
2520 Py_DECREF(seq);
2521 return -1;
2522 }
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002523
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002524 if (!slicelength) {
2525 Py_DECREF(seq);
2526 return 0;
2527 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002528
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002529 garbage = (PyObject**)
2530 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2531 if (!garbage) {
2532 Py_DECREF(seq);
2533 PyErr_NoMemory();
2534 return -1;
2535 }
Tim Peters3b01a122002-07-19 02:35:45 +00002536
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002537 selfitems = self->ob_item;
2538 seqitems = PySequence_Fast_ITEMS(seq);
2539 for (cur = start, i = 0; i < slicelength;
2540 cur += step, i++) {
2541 garbage[i] = selfitems[cur];
2542 ins = seqitems[i];
2543 Py_INCREF(ins);
2544 selfitems[cur] = ins;
2545 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002546
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002547 for (i = 0; i < slicelength; i++) {
2548 Py_DECREF(garbage[i]);
2549 }
Tim Peters3b01a122002-07-19 02:35:45 +00002550
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002551 PyMem_FREE(garbage);
2552 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002553
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002554 return 0;
2555 }
2556 }
2557 else {
2558 PyErr_Format(PyExc_TypeError,
2559 "list indices must be integers, not %.200s",
2560 item->ob_type->tp_name);
2561 return -1;
2562 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002563}
2564
2565static PyMappingMethods list_as_mapping = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002566 (lenfunc)list_length,
2567 (binaryfunc)list_subscript,
2568 (objobjargproc)list_ass_subscript
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002569};
2570
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002571PyTypeObject PyList_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002572 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2573 "list",
2574 sizeof(PyListObject),
2575 0,
2576 (destructor)list_dealloc, /* tp_dealloc */
2577 0, /* tp_print */
2578 0, /* tp_getattr */
2579 0, /* tp_setattr */
2580 0, /* tp_reserved */
2581 (reprfunc)list_repr, /* tp_repr */
2582 0, /* tp_as_number */
2583 &list_as_sequence, /* tp_as_sequence */
2584 &list_as_mapping, /* tp_as_mapping */
2585 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
2586 0, /* tp_call */
2587 0, /* tp_str */
2588 PyObject_GenericGetAttr, /* tp_getattro */
2589 0, /* tp_setattro */
2590 0, /* tp_as_buffer */
2591 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2592 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
2593 list_doc, /* tp_doc */
2594 (traverseproc)list_traverse, /* tp_traverse */
2595 (inquiry)list_clear, /* tp_clear */
2596 list_richcompare, /* tp_richcompare */
2597 0, /* tp_weaklistoffset */
2598 list_iter, /* tp_iter */
2599 0, /* tp_iternext */
2600 list_methods, /* tp_methods */
2601 0, /* tp_members */
2602 0, /* tp_getset */
2603 0, /* tp_base */
2604 0, /* tp_dict */
2605 0, /* tp_descr_get */
2606 0, /* tp_descr_set */
2607 0, /* tp_dictoffset */
2608 (initproc)list_init, /* tp_init */
2609 PyType_GenericAlloc, /* tp_alloc */
2610 PyType_GenericNew, /* tp_new */
2611 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002612};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002613
2614
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002615/*********************** List Iterator **************************/
2616
2617typedef struct {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002618 PyObject_HEAD
2619 long it_index;
2620 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002621} listiterobject;
2622
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002623static PyObject *list_iter(PyObject *);
2624static void listiter_dealloc(listiterobject *);
2625static int listiter_traverse(listiterobject *, visitproc, void *);
2626static PyObject *listiter_next(listiterobject *);
2627static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002628
Armin Rigof5b3e362006-02-11 21:32:43 +00002629PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002630
2631static PyMethodDef listiter_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002632 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2633 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002634};
2635
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002636PyTypeObject PyListIter_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002637 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2638 "list_iterator", /* tp_name */
2639 sizeof(listiterobject), /* tp_basicsize */
2640 0, /* tp_itemsize */
2641 /* methods */
2642 (destructor)listiter_dealloc, /* tp_dealloc */
2643 0, /* tp_print */
2644 0, /* tp_getattr */
2645 0, /* tp_setattr */
2646 0, /* tp_reserved */
2647 0, /* tp_repr */
2648 0, /* tp_as_number */
2649 0, /* tp_as_sequence */
2650 0, /* tp_as_mapping */
2651 0, /* tp_hash */
2652 0, /* tp_call */
2653 0, /* tp_str */
2654 PyObject_GenericGetAttr, /* tp_getattro */
2655 0, /* tp_setattro */
2656 0, /* tp_as_buffer */
2657 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2658 0, /* tp_doc */
2659 (traverseproc)listiter_traverse, /* tp_traverse */
2660 0, /* tp_clear */
2661 0, /* tp_richcompare */
2662 0, /* tp_weaklistoffset */
2663 PyObject_SelfIter, /* tp_iter */
2664 (iternextfunc)listiter_next, /* tp_iternext */
2665 listiter_methods, /* tp_methods */
2666 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002667};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002668
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002669
2670static PyObject *
2671list_iter(PyObject *seq)
2672{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002673 listiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002674
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002675 if (!PyList_Check(seq)) {
2676 PyErr_BadInternalCall();
2677 return NULL;
2678 }
2679 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2680 if (it == NULL)
2681 return NULL;
2682 it->it_index = 0;
2683 Py_INCREF(seq);
2684 it->it_seq = (PyListObject *)seq;
2685 _PyObject_GC_TRACK(it);
2686 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002687}
2688
2689static void
2690listiter_dealloc(listiterobject *it)
2691{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002692 _PyObject_GC_UNTRACK(it);
2693 Py_XDECREF(it->it_seq);
2694 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002695}
2696
2697static int
2698listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2699{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002700 Py_VISIT(it->it_seq);
2701 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002702}
2703
2704static PyObject *
2705listiter_next(listiterobject *it)
2706{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002707 PyListObject *seq;
2708 PyObject *item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002709
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002710 assert(it != NULL);
2711 seq = it->it_seq;
2712 if (seq == NULL)
2713 return NULL;
2714 assert(PyList_Check(seq));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002715
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002716 if (it->it_index < PyList_GET_SIZE(seq)) {
2717 item = PyList_GET_ITEM(seq, it->it_index);
2718 ++it->it_index;
2719 Py_INCREF(item);
2720 return item;
2721 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002722
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002723 Py_DECREF(seq);
2724 it->it_seq = NULL;
2725 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002726}
2727
2728static PyObject *
2729listiter_len(listiterobject *it)
2730{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002731 Py_ssize_t len;
2732 if (it->it_seq) {
2733 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2734 if (len >= 0)
2735 return PyLong_FromSsize_t(len);
2736 }
2737 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002738}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002739/*********************** List Reverse Iterator **************************/
2740
2741typedef struct {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002742 PyObject_HEAD
2743 Py_ssize_t it_index;
2744 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002745} listreviterobject;
2746
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002747static PyObject *list_reversed(PyListObject *, PyObject *);
2748static void listreviter_dealloc(listreviterobject *);
2749static int listreviter_traverse(listreviterobject *, visitproc, void *);
2750static PyObject *listreviter_next(listreviterobject *);
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002751static PyObject *listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002752
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002753static PyMethodDef listreviter_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002754 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
2755 {NULL, NULL} /* sentinel */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002756};
2757
Raymond Hettinger1021c442003-11-07 15:38:09 +00002758PyTypeObject PyListRevIter_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002759 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2760 "list_reverseiterator", /* tp_name */
2761 sizeof(listreviterobject), /* tp_basicsize */
2762 0, /* tp_itemsize */
2763 /* methods */
2764 (destructor)listreviter_dealloc, /* tp_dealloc */
2765 0, /* tp_print */
2766 0, /* tp_getattr */
2767 0, /* tp_setattr */
2768 0, /* tp_reserved */
2769 0, /* tp_repr */
2770 0, /* tp_as_number */
2771 0, /* tp_as_sequence */
2772 0, /* tp_as_mapping */
2773 0, /* tp_hash */
2774 0, /* tp_call */
2775 0, /* tp_str */
2776 PyObject_GenericGetAttr, /* tp_getattro */
2777 0, /* tp_setattro */
2778 0, /* tp_as_buffer */
2779 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2780 0, /* tp_doc */
2781 (traverseproc)listreviter_traverse, /* tp_traverse */
2782 0, /* tp_clear */
2783 0, /* tp_richcompare */
2784 0, /* tp_weaklistoffset */
2785 PyObject_SelfIter, /* tp_iter */
2786 (iternextfunc)listreviter_next, /* tp_iternext */
2787 listreviter_methods, /* tp_methods */
2788 0,
Raymond Hettinger1021c442003-11-07 15:38:09 +00002789};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002790
2791static PyObject *
2792list_reversed(PyListObject *seq, PyObject *unused)
2793{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002794 listreviterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002795
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002796 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2797 if (it == NULL)
2798 return NULL;
2799 assert(PyList_Check(seq));
2800 it->it_index = PyList_GET_SIZE(seq) - 1;
2801 Py_INCREF(seq);
2802 it->it_seq = seq;
2803 PyObject_GC_Track(it);
2804 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002805}
2806
2807static void
2808listreviter_dealloc(listreviterobject *it)
2809{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002810 PyObject_GC_UnTrack(it);
2811 Py_XDECREF(it->it_seq);
2812 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002813}
2814
2815static int
2816listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2817{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002818 Py_VISIT(it->it_seq);
2819 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002820}
2821
2822static PyObject *
2823listreviter_next(listreviterobject *it)
2824{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002825 PyObject *item;
2826 Py_ssize_t index = it->it_index;
2827 PyListObject *seq = it->it_seq;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002828
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002829 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2830 item = PyList_GET_ITEM(seq, index);
2831 it->it_index--;
2832 Py_INCREF(item);
2833 return item;
2834 }
2835 it->it_index = -1;
2836 if (seq != NULL) {
2837 it->it_seq = NULL;
2838 Py_DECREF(seq);
2839 }
2840 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002841}
2842
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002843static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002844listreviter_len(listreviterobject *it)
2845{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002846 Py_ssize_t len = it->it_index + 1;
2847 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2848 len = 0;
2849 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002850}
2851