blob: e7c4c82703ff58e5641f1ebb9fc28410d367c25a [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"
Antoine Pitrou0197ff92012-03-22 14:38:16 +01004#include "accu.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00005
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00006#ifdef STDC_HEADERS
7#include <stddef.h>
8#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00009#include <sys/types.h> /* For size_t */
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000010#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Tim Peters8d9eb102004-07-31 02:24:20 +000012/* Ensure ob_item has room for at least newsize elements, and set
13 * ob_size to newsize. If newsize > ob_size on entry, the content
14 * of the new slots at exit is undefined heap trash; it's the caller's
Ezio Melotti13925002011-03-16 11:05:33 +020015 * responsibility to overwrite them with sane values.
Tim Peters8d9eb102004-07-31 02:24:20 +000016 * The number of allocated elements may grow, shrink, or stay the same.
17 * Failure is impossible if newsize <= self.allocated on entry, although
18 * that partly relies on an assumption that the system realloc() never
19 * fails when passed a number of bytes <= the number of bytes last
20 * allocated (the C standard doesn't guarantee this, but it's hard to
21 * imagine a realloc implementation where it wouldn't be true).
22 * Note that self->ob_item may change, and even if newsize is less
23 * than ob_size on entry.
24 */
Guido van Rossuma46d51d1995-01-26 22:59:43 +000025static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000026list_resize(PyListObject *self, Py_ssize_t newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028 PyObject **items;
29 size_t new_allocated;
30 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 /* Bypass realloc() when a previous overallocation is large enough
33 to accommodate the newsize. If the newsize falls lower than half
34 the allocated size, then proceed with the realloc() to shrink the list.
35 */
36 if (allocated >= newsize && newsize >= (allocated >> 1)) {
37 assert(self->ob_item != NULL || newsize == 0);
38 Py_SIZE(self) = newsize;
39 return 0;
40 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +000041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 /* This over-allocates proportional to the list size, making room
43 * for additional growth. The over-allocation is mild, but is
44 * enough to give linear-time amortized behavior over a long
45 * sequence of appends() in the presence of a poorly-performing
46 * system realloc().
47 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
48 */
49 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +000050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 /* check for integer overflow */
52 if (new_allocated > PY_SIZE_MAX - newsize) {
53 PyErr_NoMemory();
54 return -1;
55 } else {
56 new_allocated += newsize;
57 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +000058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 if (newsize == 0)
60 new_allocated = 0;
61 items = self->ob_item;
Mark Dickinsonc0420fd2011-09-19 19:18:37 +010062 if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 PyMem_RESIZE(items, PyObject *, new_allocated);
64 else
65 items = NULL;
66 if (items == NULL) {
67 PyErr_NoMemory();
68 return -1;
69 }
70 self->ob_item = items;
71 Py_SIZE(self) = newsize;
72 self->allocated = new_allocated;
73 return 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000074}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000075
Christian Heimes77c02eb2008-02-09 02:18:51 +000076/* Debug statistic to compare allocations with reuse through the free list */
77#undef SHOW_ALLOC_COUNT
78#ifdef SHOW_ALLOC_COUNT
79static size_t count_alloc = 0;
80static size_t count_reuse = 0;
81
82static void
83show_alloc(void)
84{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
86 count_alloc);
87 fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
88 "d\n", count_reuse);
89 fprintf(stderr, "%.2f%% reuse rate\n\n",
90 (100.0*count_reuse/(count_alloc+count_reuse)));
Christian Heimes77c02eb2008-02-09 02:18:51 +000091}
92#endif
93
Raymond Hettinger0468e412004-05-05 05:37:53 +000094/* Empty list reuse scheme to save calls to malloc and free */
Christian Heimes2202f872008-02-06 14:31:34 +000095#ifndef PyList_MAXFREELIST
96#define PyList_MAXFREELIST 80
97#endif
98static PyListObject *free_list[PyList_MAXFREELIST];
99static int numfree = 0;
Raymond Hettinger0468e412004-05-05 05:37:53 +0000100
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100101int
102PyList_ClearFreeList(void)
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 PyListObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100105 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 while (numfree) {
107 op = free_list[--numfree];
108 assert(PyList_CheckExact(op));
109 PyObject_GC_Del(op);
110 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100111 return ret;
112}
113
114void
115PyList_Fini(void)
116{
117 PyList_ClearFreeList();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000118}
119
David Malcolm49526f42012-06-22 14:55:41 -0400120/* Print summary info about the state of the optimized allocator */
121void
122_PyList_DebugMallocStats(FILE *out)
123{
124 _PyDebugAllocatorStats(out,
125 "free PyListObject",
126 numfree, sizeof(PyListObject));
127}
128
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000130PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 PyListObject *op;
133 size_t nbytes;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000134#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 static int initialized = 0;
136 if (!initialized) {
137 Py_AtExit(show_alloc);
138 initialized = 1;
139 }
Christian Heimes77c02eb2008-02-09 02:18:51 +0000140#endif
Tim Peters3986d4e2004-07-29 02:28:42 +0000141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 if (size < 0) {
143 PyErr_BadInternalCall();
144 return NULL;
145 }
146 /* Check for overflow without an actual overflow,
147 * which can cause compiler to optimise out */
148 if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *))
149 return PyErr_NoMemory();
150 nbytes = size * sizeof(PyObject *);
151 if (numfree) {
152 numfree--;
153 op = free_list[numfree];
154 _Py_NewReference((PyObject *)op);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000155#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 count_reuse++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 } else {
159 op = PyObject_GC_New(PyListObject, &PyList_Type);
160 if (op == NULL)
161 return NULL;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000162#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 count_alloc++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 }
166 if (size <= 0)
167 op->ob_item = NULL;
168 else {
169 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
170 if (op->ob_item == NULL) {
171 Py_DECREF(op);
172 return PyErr_NoMemory();
173 }
174 memset(op->ob_item, 0, nbytes);
175 }
176 Py_SIZE(op) = size;
177 op->allocated = size;
178 _PyObject_GC_TRACK(op);
179 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180}
181
Martin v. Löwis18e16552006-02-15 17:27:45 +0000182Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000183PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 if (!PyList_Check(op)) {
186 PyErr_BadInternalCall();
187 return -1;
188 }
189 else
190 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191}
192
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000193static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000194
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000196PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 if (!PyList_Check(op)) {
199 PyErr_BadInternalCall();
200 return NULL;
201 }
202 if (i < 0 || i >= Py_SIZE(op)) {
203 if (indexerr == NULL) {
204 indexerr = PyUnicode_FromString(
205 "list index out of range");
206 if (indexerr == NULL)
207 return NULL;
208 }
209 PyErr_SetObject(PyExc_IndexError, indexerr);
210 return NULL;
211 }
212 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213}
214
215int
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200216PyList_SetItem(PyObject *op, Py_ssize_t i,
217 PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200219 PyObject *olditem;
220 PyObject **p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 if (!PyList_Check(op)) {
222 Py_XDECREF(newitem);
223 PyErr_BadInternalCall();
224 return -1;
225 }
226 if (i < 0 || i >= Py_SIZE(op)) {
227 Py_XDECREF(newitem);
228 PyErr_SetString(PyExc_IndexError,
229 "list assignment index out of range");
230 return -1;
231 }
232 p = ((PyListObject *)op) -> ob_item + i;
233 olditem = *p;
234 *p = newitem;
235 Py_XDECREF(olditem);
236 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237}
238
239static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000240ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 Py_ssize_t i, n = Py_SIZE(self);
243 PyObject **items;
244 if (v == NULL) {
245 PyErr_BadInternalCall();
246 return -1;
247 }
248 if (n == PY_SSIZE_T_MAX) {
249 PyErr_SetString(PyExc_OverflowError,
250 "cannot add more objects to list");
251 return -1;
252 }
Tim Petersb38e2b62004-07-29 02:29:26 +0000253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 if (list_resize(self, n+1) == -1)
255 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 if (where < 0) {
258 where += n;
259 if (where < 0)
260 where = 0;
261 }
262 if (where > n)
263 where = n;
264 items = self->ob_item;
265 for (i = n; --i >= where; )
266 items[i+1] = items[i];
267 Py_INCREF(v);
268 items[where] = v;
269 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270}
271
272int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000273PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 if (!PyList_Check(op)) {
276 PyErr_BadInternalCall();
277 return -1;
278 }
279 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280}
281
Raymond Hettinger40a03822004-04-12 13:05:09 +0000282static int
283app1(PyListObject *self, PyObject *v)
284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 assert (v != NULL);
288 if (n == PY_SSIZE_T_MAX) {
289 PyErr_SetString(PyExc_OverflowError,
290 "cannot add more objects to list");
291 return -1;
292 }
Raymond Hettinger40a03822004-04-12 13:05:09 +0000293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 if (list_resize(self, n+1) == -1)
295 return -1;
Raymond Hettinger40a03822004-04-12 13:05:09 +0000296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 Py_INCREF(v);
298 PyList_SET_ITEM(self, n, v);
299 return 0;
Raymond Hettinger40a03822004-04-12 13:05:09 +0000300}
301
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302int
Fred Drakea2f55112000-07-09 15:16:51 +0000303PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 if (PyList_Check(op) && (newitem != NULL))
306 return app1((PyListObject *)op, newitem);
307 PyErr_BadInternalCall();
308 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309}
310
311/* Methods */
312
313static void
Fred Drakea2f55112000-07-09 15:16:51 +0000314list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 Py_ssize_t i;
317 PyObject_GC_UnTrack(op);
318 Py_TRASHCAN_SAFE_BEGIN(op)
319 if (op->ob_item != NULL) {
320 /* Do it backwards, for Christian Tismer.
321 There's a simple test case where somehow this reduces
322 thrashing when a *very* large list is created and
323 immediately deleted. */
324 i = Py_SIZE(op);
325 while (--i >= 0) {
326 Py_XDECREF(op->ob_item[i]);
327 }
328 PyMem_FREE(op->ob_item);
329 }
330 if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
331 free_list[numfree++] = op;
332 else
333 Py_TYPE(op)->tp_free((PyObject *)op);
334 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335}
336
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000338list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 Py_ssize_t i;
Victor Stinner5c733472013-11-18 21:11:57 +0100341 PyObject *s;
Victor Stinner5c733472013-11-18 21:11:57 +0100342 _PyUnicodeWriter writer;
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200343
344 if (Py_SIZE(v) == 0) {
345 return PyUnicode_FromString("[]");
346 }
347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 i = Py_ReprEnter((PyObject*)v);
349 if (i != 0) {
350 return i > 0 ? PyUnicode_FromString("[...]") : NULL;
351 }
Tim Petersa7259592001-06-16 05:11:17 +0000352
Victor Stinner5c733472013-11-18 21:11:57 +0100353 _PyUnicodeWriter_Init(&writer);
354 writer.overallocate = 1;
Victor Stinnerb8fb1972013-11-18 22:15:44 +0100355 /* "[" + "1" + ", 2" * (len - 1) + "]" */
356 writer.min_length = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +0000357
Victor Stinner5c733472013-11-18 21:11:57 +0100358 if (_PyUnicodeWriter_WriteChar(&writer, '[') < 0)
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200359 goto error;
Tim Petersa7259592001-06-16 05:11:17 +0000360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 /* Do repr() on each element. Note that this may mutate the list,
362 so must refetch the list size on each iteration. */
363 for (i = 0; i < Py_SIZE(v); ++i) {
Victor Stinner5c733472013-11-18 21:11:57 +0100364 if (i > 0) {
Victor Stinner4a587072013-11-19 12:54:53 +0100365 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
Victor Stinner5c733472013-11-18 21:11:57 +0100366 goto error;
367 }
368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200370 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 s = PyObject_Repr(v->ob_item[i]);
372 Py_LeaveRecursiveCall();
Victor Stinner5c733472013-11-18 21:11:57 +0100373 if (s == NULL)
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200374 goto error;
Victor Stinner5c733472013-11-18 21:11:57 +0100375
376 if (_PyUnicodeWriter_WriteStr(&writer, s) < 0) {
377 Py_DECREF(s);
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200378 goto error;
Victor Stinner5c733472013-11-18 21:11:57 +0100379 }
380 Py_DECREF(s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 }
Victor Stinner5c733472013-11-18 21:11:57 +0100382
Victor Stinner4d3f1092013-11-19 12:09:00 +0100383 writer.overallocate = 0;
Victor Stinner5c733472013-11-18 21:11:57 +0100384 if (_PyUnicodeWriter_WriteChar(&writer, ']') < 0)
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200385 goto error;
Tim Petersa7259592001-06-16 05:11:17 +0000386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 Py_ReprLeave((PyObject *)v);
Victor Stinner5c733472013-11-18 21:11:57 +0100388 return _PyUnicodeWriter_Finish(&writer);
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200389
390error:
Victor Stinner5c733472013-11-18 21:11:57 +0100391 _PyUnicodeWriter_Dealloc(&writer);
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200392 Py_ReprLeave((PyObject *)v);
393 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394}
395
Martin v. Löwis18e16552006-02-15 17:27:45 +0000396static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000397list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400}
401
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000402static int
Fred Drakea2f55112000-07-09 15:16:51 +0000403list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 Py_ssize_t i;
406 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
409 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
410 Py_EQ);
411 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000412}
413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000415list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 if (i < 0 || i >= Py_SIZE(a)) {
418 if (indexerr == NULL) {
419 indexerr = PyUnicode_FromString(
420 "list index out of range");
421 if (indexerr == NULL)
422 return NULL;
423 }
424 PyErr_SetObject(PyExc_IndexError, indexerr);
425 return NULL;
426 }
427 Py_INCREF(a->ob_item[i]);
428 return a->ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429}
430
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000432list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 PyListObject *np;
435 PyObject **src, **dest;
436 Py_ssize_t i, len;
437 if (ilow < 0)
438 ilow = 0;
439 else if (ilow > Py_SIZE(a))
440 ilow = Py_SIZE(a);
441 if (ihigh < ilow)
442 ihigh = ilow;
443 else if (ihigh > Py_SIZE(a))
444 ihigh = Py_SIZE(a);
445 len = ihigh - ilow;
446 np = (PyListObject *) PyList_New(len);
447 if (np == NULL)
448 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 src = a->ob_item + ilow;
451 dest = np->ob_item;
452 for (i = 0; i < len; i++) {
453 PyObject *v = src[i];
454 Py_INCREF(v);
455 dest[i] = v;
456 }
457 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458}
459
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000461PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (!PyList_Check(a)) {
464 PyErr_BadInternalCall();
465 return NULL;
466 }
467 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000468}
469
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000471list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 Py_ssize_t size;
474 Py_ssize_t i;
475 PyObject **src, **dest;
476 PyListObject *np;
477 if (!PyList_Check(bb)) {
478 PyErr_Format(PyExc_TypeError,
479 "can only concatenate list (not \"%.200s\") to list",
480 bb->ob_type->tp_name);
481 return NULL;
482 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483#define b ((PyListObject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 size = Py_SIZE(a) + Py_SIZE(b);
485 if (size < 0)
486 return PyErr_NoMemory();
487 np = (PyListObject *) PyList_New(size);
488 if (np == NULL) {
489 return NULL;
490 }
491 src = a->ob_item;
492 dest = np->ob_item;
493 for (i = 0; i < Py_SIZE(a); i++) {
494 PyObject *v = src[i];
495 Py_INCREF(v);
496 dest[i] = v;
497 }
498 src = b->ob_item;
499 dest = np->ob_item + Py_SIZE(a);
500 for (i = 0; i < Py_SIZE(b); i++) {
501 PyObject *v = src[i];
502 Py_INCREF(v);
503 dest[i] = v;
504 }
505 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000506#undef b
507}
508
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 Py_ssize_t i, j;
513 Py_ssize_t size;
514 PyListObject *np;
515 PyObject **p, **items;
516 PyObject *elem;
517 if (n < 0)
518 n = 0;
Mark Dickinsonc0420fd2011-09-19 19:18:37 +0100519 if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 return PyErr_NoMemory();
Mark Dickinsonc0420fd2011-09-19 19:18:37 +0100521 size = Py_SIZE(a) * n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 if (size == 0)
523 return PyList_New(0);
524 np = (PyListObject *) PyList_New(size);
525 if (np == NULL)
526 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 items = np->ob_item;
529 if (Py_SIZE(a) == 1) {
530 elem = a->ob_item[0];
531 for (i = 0; i < n; i++) {
532 items[i] = elem;
533 Py_INCREF(elem);
534 }
535 return (PyObject *) np;
536 }
537 p = np->ob_item;
538 items = a->ob_item;
539 for (i = 0; i < n; i++) {
540 for (j = 0; j < Py_SIZE(a); j++) {
541 *p = items[j];
542 Py_INCREF(*p);
543 p++;
544 }
545 }
546 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000547}
548
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549static int
Armin Rigo93677f02004-07-29 12:40:23 +0000550list_clear(PyListObject *a)
551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 Py_ssize_t i;
553 PyObject **item = a->ob_item;
554 if (item != NULL) {
555 /* Because XDECREF can recursively invoke operations on
556 this list, we make it empty first. */
557 i = Py_SIZE(a);
558 Py_SIZE(a) = 0;
559 a->ob_item = NULL;
560 a->allocated = 0;
561 while (--i >= 0) {
562 Py_XDECREF(item[i]);
563 }
564 PyMem_FREE(item);
565 }
566 /* Never fails; the return value can be ignored.
567 Note that there is no guarantee that the list is actually empty
568 at this point, because XDECREF may have populated it again! */
569 return 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000570}
571
Tim Peters8fc4a912004-07-31 21:53:19 +0000572/* a[ilow:ihigh] = v if v != NULL.
573 * del a[ilow:ihigh] if v == NULL.
574 *
575 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
576 * guaranteed the call cannot fail.
577 */
Armin Rigo93677f02004-07-29 12:40:23 +0000578static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000579list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 /* Because [X]DECREF can recursively invoke list operations on
582 this list, we must postpone all [X]DECREF activity until
583 after the list is back in its canonical shape. Therefore
584 we must allocate an additional array, 'recycle', into which
585 we temporarily copy the items that are deleted from the
586 list. :-( */
587 PyObject *recycle_on_stack[8];
588 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
589 PyObject **item;
590 PyObject **vitem = NULL;
591 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
592 Py_ssize_t n; /* # of elements in replacement list */
593 Py_ssize_t norig; /* # of elements in list getting replaced */
594 Py_ssize_t d; /* Change in size */
595 Py_ssize_t k;
596 size_t s;
597 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598#define b ((PyListObject *)v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 if (v == NULL)
600 n = 0;
601 else {
602 if (a == b) {
603 /* Special case "a[i:j] = a" -- copy b first */
604 v = list_slice(b, 0, Py_SIZE(b));
605 if (v == NULL)
606 return result;
607 result = list_ass_slice(a, ilow, ihigh, v);
608 Py_DECREF(v);
609 return result;
610 }
611 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
612 if(v_as_SF == NULL)
613 goto Error;
614 n = PySequence_Fast_GET_SIZE(v_as_SF);
615 vitem = PySequence_Fast_ITEMS(v_as_SF);
616 }
617 if (ilow < 0)
618 ilow = 0;
619 else if (ilow > Py_SIZE(a))
620 ilow = Py_SIZE(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (ihigh < ilow)
623 ihigh = ilow;
624 else if (ihigh > Py_SIZE(a))
625 ihigh = Py_SIZE(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 norig = ihigh - ilow;
628 assert(norig >= 0);
629 d = n - norig;
630 if (Py_SIZE(a) + d == 0) {
631 Py_XDECREF(v_as_SF);
632 return list_clear(a);
633 }
634 item = a->ob_item;
635 /* recycle the items that we are about to remove */
636 s = norig * sizeof(PyObject *);
637 if (s > sizeof(recycle_on_stack)) {
638 recycle = (PyObject **)PyMem_MALLOC(s);
639 if (recycle == NULL) {
640 PyErr_NoMemory();
641 goto Error;
642 }
643 }
644 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 if (d < 0) { /* Delete -d items */
Victor Stinner2c40f642013-07-19 23:06:21 +0200647 Py_ssize_t tail;
648 tail = (Py_SIZE(a) - ihigh) * sizeof(PyObject *);
649 memmove(&item[ihigh+d], &item[ihigh], tail);
650 if (list_resize(a, Py_SIZE(a) + d) < 0) {
651 memmove(&item[ihigh], &item[ihigh+d], tail);
652 memcpy(&item[ilow], recycle, s);
653 goto Error;
654 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 item = a->ob_item;
656 }
657 else if (d > 0) { /* Insert d items */
658 k = Py_SIZE(a);
659 if (list_resize(a, k+d) < 0)
660 goto Error;
661 item = a->ob_item;
662 memmove(&item[ihigh+d], &item[ihigh],
663 (k - ihigh)*sizeof(PyObject *));
664 }
665 for (k = 0; k < n; k++, ilow++) {
666 PyObject *w = vitem[k];
667 Py_XINCREF(w);
668 item[ilow] = w;
669 }
670 for (k = norig - 1; k >= 0; --k)
671 Py_XDECREF(recycle[k]);
672 result = 0;
Tim Peters8d9eb102004-07-31 02:24:20 +0000673 Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 if (recycle != recycle_on_stack)
675 PyMem_FREE(recycle);
676 Py_XDECREF(v_as_SF);
677 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000678#undef b
679}
680
Guido van Rossum234f9421993-06-17 12:35:49 +0000681int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000682PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (!PyList_Check(a)) {
685 PyErr_BadInternalCall();
686 return -1;
687 }
688 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000689}
690
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000691static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000692list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 PyObject **items;
695 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000696
697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 size = PyList_GET_SIZE(self);
699 if (size == 0 || n == 1) {
700 Py_INCREF(self);
701 return (PyObject *)self;
702 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 if (n < 1) {
705 (void)list_clear(self);
706 Py_INCREF(self);
707 return (PyObject *)self;
708 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 if (size > PY_SSIZE_T_MAX / n) {
711 return PyErr_NoMemory();
712 }
Christian Heimesaf98da12008-01-27 15:18:18 +0000713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 if (list_resize(self, size*n) == -1)
715 return NULL;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 p = size;
718 items = self->ob_item;
719 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
720 for (j = 0; j < size; j++) {
721 PyObject *o = items[j];
722 Py_INCREF(o);
723 items[p++] = o;
724 }
725 }
726 Py_INCREF(self);
727 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000728}
729
Guido van Rossum4a450d01991-04-03 19:05:18 +0000730static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000731list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 PyObject *old_value;
734 if (i < 0 || i >= Py_SIZE(a)) {
735 PyErr_SetString(PyExc_IndexError,
736 "list assignment index out of range");
737 return -1;
738 }
739 if (v == NULL)
740 return list_ass_slice(a, i, i+1, v);
741 Py_INCREF(v);
742 old_value = a->ob_item[i];
743 a->ob_item[i] = v;
744 Py_DECREF(old_value);
745 return 0;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000746}
747
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000749listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 Py_ssize_t i;
752 PyObject *v;
753 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
754 return NULL;
755 if (ins1(self, i, v) == 0)
756 Py_RETURN_NONE;
757 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758}
759
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760static PyObject *
Eli Benderskycbbaa962011-02-25 05:47:53 +0000761listclear(PyListObject *self)
762{
763 list_clear(self);
764 Py_RETURN_NONE;
765}
766
767static PyObject *
768listcopy(PyListObject *self)
769{
770 return list_slice(self, 0, Py_SIZE(self));
771}
772
773static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000774listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 if (app1(self, v) == 0)
777 Py_RETURN_NONE;
778 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000779}
780
Barry Warsawdedf6d61998-10-09 16:37:25 +0000781static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000782listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 PyObject *it; /* iter(v) */
785 Py_ssize_t m; /* size of self */
786 Py_ssize_t n; /* guess for size of b */
787 Py_ssize_t mn; /* m + n */
788 Py_ssize_t i;
789 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 /* Special cases:
792 1) lists and tuples which can use PySequence_Fast ops
793 2) extending self to self requires making a copy first
794 */
795 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
796 PyObject **src, **dest;
797 b = PySequence_Fast(b, "argument must be iterable");
798 if (!b)
799 return NULL;
800 n = PySequence_Fast_GET_SIZE(b);
801 if (n == 0) {
802 /* short circuit when b is empty */
803 Py_DECREF(b);
804 Py_RETURN_NONE;
805 }
806 m = Py_SIZE(self);
807 if (list_resize(self, m + n) == -1) {
808 Py_DECREF(b);
809 return NULL;
810 }
811 /* note that we may still have self == b here for the
812 * situation a.extend(a), but the following code works
813 * in that case too. Just make sure to resize self
814 * before calling PySequence_Fast_ITEMS.
815 */
816 /* populate the end of self with b's items */
817 src = PySequence_Fast_ITEMS(b);
818 dest = self->ob_item + m;
819 for (i = 0; i < n; i++) {
820 PyObject *o = src[i];
821 Py_INCREF(o);
822 dest[i] = o;
823 }
824 Py_DECREF(b);
825 Py_RETURN_NONE;
826 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 it = PyObject_GetIter(b);
829 if (it == NULL)
830 return NULL;
831 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 /* Guess a result list size. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200834 n = PyObject_LengthHint(b, 8);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 if (n == -1) {
836 Py_DECREF(it);
837 return NULL;
838 }
839 m = Py_SIZE(self);
840 mn = m + n;
841 if (mn >= m) {
842 /* Make room. */
843 if (list_resize(self, mn) == -1)
844 goto error;
845 /* Make the list sane again. */
846 Py_SIZE(self) = m;
847 }
848 /* Else m + n overflowed; on the chance that n lied, and there really
849 * is enough room, ignore it. If n was telling the truth, we'll
850 * eventually run out of memory during the loop.
851 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 /* Run iterator to exhaustion. */
854 for (;;) {
855 PyObject *item = iternext(it);
856 if (item == NULL) {
857 if (PyErr_Occurred()) {
858 if (PyErr_ExceptionMatches(PyExc_StopIteration))
859 PyErr_Clear();
860 else
861 goto error;
862 }
863 break;
864 }
865 if (Py_SIZE(self) < self->allocated) {
866 /* steals ref */
867 PyList_SET_ITEM(self, Py_SIZE(self), item);
868 ++Py_SIZE(self);
869 }
870 else {
871 int status = app1(self, item);
872 Py_DECREF(item); /* append creates a new ref */
873 if (status < 0)
874 goto error;
875 }
876 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 /* Cut back result list if initial guess was too large. */
Victor Stinner32fd6ea2013-07-16 21:45:58 +0200879 if (Py_SIZE(self) < self->allocated) {
880 if (list_resize(self, Py_SIZE(self)) < 0)
881 goto error;
882 }
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 Py_DECREF(it);
885 Py_RETURN_NONE;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000886
887 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 Py_DECREF(it);
889 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000890}
891
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000892PyObject *
893_PyList_Extend(PyListObject *self, PyObject *b)
894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 return listextend(self, b);
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000896}
897
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000898static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000899list_inplace_concat(PyListObject *self, PyObject *other)
900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 PyObject *result;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 result = listextend(self, other);
904 if (result == NULL)
905 return result;
906 Py_DECREF(result);
907 Py_INCREF(self);
908 return (PyObject *)self;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000909}
910
911static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000912listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 Py_ssize_t i = -1;
915 PyObject *v;
916 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 if (!PyArg_ParseTuple(args, "|n:pop", &i))
919 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 if (Py_SIZE(self) == 0) {
922 /* Special-case most common failure cause */
923 PyErr_SetString(PyExc_IndexError, "pop from empty list");
924 return NULL;
925 }
926 if (i < 0)
927 i += Py_SIZE(self);
928 if (i < 0 || i >= Py_SIZE(self)) {
929 PyErr_SetString(PyExc_IndexError, "pop index out of range");
930 return NULL;
931 }
932 v = self->ob_item[i];
933 if (i == Py_SIZE(self) - 1) {
934 status = list_resize(self, Py_SIZE(self) - 1);
Victor Stinnerb27cd3e2013-07-08 22:20:44 +0200935 if (status >= 0)
936 return v; /* and v now owns the reference the list had */
937 else
938 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 }
940 Py_INCREF(v);
941 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
Victor Stinner095d99f2013-07-17 21:58:01 +0200942 if (status < 0) {
943 Py_DECREF(v);
944 return NULL;
945 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000947}
948
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000949/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
950static void
951reverse_slice(PyObject **lo, PyObject **hi)
952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 assert(lo && hi);
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 --hi;
956 while (lo < hi) {
957 PyObject *t = *lo;
958 *lo = *hi;
959 *hi = t;
960 ++lo;
961 --hi;
962 }
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000963}
964
Tim Petersa64dc242002-08-01 02:13:36 +0000965/* Lots of code for an adaptive, stable, natural mergesort. There are many
966 * pieces to this algorithm; read listsort.txt for overviews and details.
967 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000968
Daniel Stutzbach98338222010-12-02 21:55:33 +0000969/* A sortslice contains a pointer to an array of keys and a pointer to
970 * an array of corresponding values. In other words, keys[i]
971 * corresponds with values[i]. If values == NULL, then the keys are
972 * also the values.
973 *
974 * Several convenience routines are provided here, so that keys and
975 * values are always moved in sync.
976 */
977
978typedef struct {
979 PyObject **keys;
980 PyObject **values;
981} sortslice;
982
983Py_LOCAL_INLINE(void)
984sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
985{
986 s1->keys[i] = s2->keys[j];
987 if (s1->values != NULL)
988 s1->values[i] = s2->values[j];
989}
990
991Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000992sortslice_copy_incr(sortslice *dst, sortslice *src)
993{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000994 *dst->keys++ = *src->keys++;
995 if (dst->values != NULL)
996 *dst->values++ = *src->values++;
997}
998
999Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001000sortslice_copy_decr(sortslice *dst, sortslice *src)
1001{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001002 *dst->keys-- = *src->keys--;
1003 if (dst->values != NULL)
1004 *dst->values-- = *src->values--;
1005}
1006
1007
1008Py_LOCAL_INLINE(void)
1009sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001010 Py_ssize_t n)
1011{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001012 memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1013 if (s1->values != NULL)
1014 memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1015}
1016
1017Py_LOCAL_INLINE(void)
1018sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001019 Py_ssize_t n)
1020{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001021 memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1022 if (s1->values != NULL)
1023 memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1024}
1025
1026Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001027sortslice_advance(sortslice *slice, Py_ssize_t n)
1028{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001029 slice->keys += n;
1030 if (slice->values != NULL)
1031 slice->values += n;
1032}
1033
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001034/* Comparison function: PyObject_RichCompareBool with Py_LT.
Tim Petersa64dc242002-08-01 02:13:36 +00001035 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1036 */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001037
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001038#define ISLT(X, Y) (PyObject_RichCompareBool(X, Y, Py_LT))
Tim Peters66860f62002-08-04 17:47:26 +00001039
1040/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +00001041 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
1042 started. It makes more sense in context <wink>. X and Y are PyObject*s.
1043*/
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001044#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001046
1047/* binarysort is the best method for sorting small arrays: it does
1048 few compares, but can do data movement quadratic in the number of
1049 elements.
Guido van Rossum42812581998-06-17 14:15:44 +00001050 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +00001051 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001052 On entry, must have lo <= start <= hi, and that [lo, start) is already
1053 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +00001054 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001055 Even in case of error, the output slice will be some permutation of
1056 the input (nothing is lost or duplicated).
1057*/
Guido van Rossum3f236de1996-12-10 23:55:39 +00001058static int
Daniel Stutzbach98338222010-12-02 21:55:33 +00001059binarysort(sortslice lo, PyObject **hi, PyObject **start)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001060{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001061 Py_ssize_t k;
1062 PyObject **l, **p, **r;
1063 PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001064
Daniel Stutzbach98338222010-12-02 21:55:33 +00001065 assert(lo.keys <= start && start <= hi);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 /* assert [lo, start) is sorted */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001067 if (lo.keys == start)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 ++start;
1069 for (; start < hi; ++start) {
1070 /* set l to where *start belongs */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001071 l = lo.keys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 r = start;
1073 pivot = *r;
1074 /* Invariants:
1075 * pivot >= all in [lo, l).
1076 * pivot < all in [r, start).
1077 * The second is vacuously true at the start.
1078 */
1079 assert(l < r);
1080 do {
1081 p = l + ((r - l) >> 1);
1082 IFLT(pivot, *p)
1083 r = p;
1084 else
1085 l = p+1;
1086 } while (l < r);
1087 assert(l == r);
1088 /* The invariants still hold, so pivot >= all in [lo, l) and
1089 pivot < all in [l, start), so pivot belongs at l. Note
1090 that if there are elements equal to pivot, l points to the
1091 first slot after them -- that's why this sort is stable.
1092 Slide over to make room.
1093 Caution: using memmove is much slower under MSVC 5;
1094 we're not usually moving many slots. */
1095 for (p = start; p > l; --p)
1096 *p = *(p-1);
1097 *l = pivot;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001098 if (lo.values != NULL) {
1099 Py_ssize_t offset = lo.values - lo.keys;
1100 p = start + offset;
1101 pivot = *p;
1102 l += offset;
1103 for (p = start + offset; p > l; --p)
1104 *p = *(p-1);
1105 *l = pivot;
1106 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 }
1108 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001109
1110 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001112}
1113
Tim Petersa64dc242002-08-01 02:13:36 +00001114/*
1115Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1116is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001117
Tim Petersa64dc242002-08-01 02:13:36 +00001118 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001119
Tim Petersa64dc242002-08-01 02:13:36 +00001120or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001121
Tim Petersa64dc242002-08-01 02:13:36 +00001122 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001123
Tim Petersa64dc242002-08-01 02:13:36 +00001124Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1125For its intended use in a stable mergesort, the strictness of the defn of
1126"descending" is needed so that the caller can safely reverse a descending
1127sequence without violating stability (strict > ensures there are no equal
1128elements to get out of order).
1129
1130Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001131*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001132static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001133count_run(PyObject **lo, PyObject **hi, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 Py_ssize_t k;
1136 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 assert(lo < hi);
1139 *descending = 0;
1140 ++lo;
1141 if (lo == hi)
1142 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 n = 2;
1145 IFLT(*lo, *(lo-1)) {
1146 *descending = 1;
1147 for (lo = lo+1; lo < hi; ++lo, ++n) {
1148 IFLT(*lo, *(lo-1))
1149 ;
1150 else
1151 break;
1152 }
1153 }
1154 else {
1155 for (lo = lo+1; lo < hi; ++lo, ++n) {
1156 IFLT(*lo, *(lo-1))
1157 break;
1158 }
1159 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 return n;
Tim Petersa64dc242002-08-01 02:13:36 +00001162fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001164}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001165
Tim Petersa64dc242002-08-01 02:13:36 +00001166/*
1167Locate the proper position of key in a sorted vector; if the vector contains
1168an element equal to key, return the position immediately to the left of
1169the leftmost equal element. [gallop_right() does the same except returns
1170the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001171
Tim Petersa64dc242002-08-01 02:13:36 +00001172"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001173
Tim Petersa64dc242002-08-01 02:13:36 +00001174"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1175hint is to the final result, the faster this runs.
1176
1177The return value is the int k in 0..n such that
1178
1179 a[k-1] < key <= a[k]
1180
1181pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1182key belongs at index k; or, IOW, the first k elements of a should precede
1183key, and the last n-k should follow key.
1184
1185Returns -1 on error. See listsort.txt for info on the method.
1186*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001187static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001188gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 Py_ssize_t ofs;
1191 Py_ssize_t lastofs;
1192 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 a += hint;
1197 lastofs = 0;
1198 ofs = 1;
1199 IFLT(*a, key) {
1200 /* a[hint] < key -- gallop right, until
1201 * a[hint + lastofs] < key <= a[hint + ofs]
1202 */
1203 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1204 while (ofs < maxofs) {
1205 IFLT(a[ofs], key) {
1206 lastofs = ofs;
1207 ofs = (ofs << 1) + 1;
1208 if (ofs <= 0) /* int overflow */
1209 ofs = maxofs;
1210 }
1211 else /* key <= a[hint + ofs] */
1212 break;
1213 }
1214 if (ofs > maxofs)
1215 ofs = maxofs;
1216 /* Translate back to offsets relative to &a[0]. */
1217 lastofs += hint;
1218 ofs += hint;
1219 }
1220 else {
1221 /* key <= a[hint] -- gallop left, until
1222 * a[hint - ofs] < key <= a[hint - lastofs]
1223 */
1224 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1225 while (ofs < maxofs) {
1226 IFLT(*(a-ofs), key)
1227 break;
1228 /* key <= a[hint - ofs] */
1229 lastofs = ofs;
1230 ofs = (ofs << 1) + 1;
1231 if (ofs <= 0) /* int overflow */
1232 ofs = maxofs;
1233 }
1234 if (ofs > maxofs)
1235 ofs = maxofs;
1236 /* Translate back to positive offsets relative to &a[0]. */
1237 k = lastofs;
1238 lastofs = hint - ofs;
1239 ofs = hint - k;
1240 }
1241 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1244 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1245 * right of lastofs but no farther right than ofs. Do a binary
1246 * search, with invariant a[lastofs-1] < key <= a[ofs].
1247 */
1248 ++lastofs;
1249 while (lastofs < ofs) {
1250 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 IFLT(a[m], key)
1253 lastofs = m+1; /* a[m] < key */
1254 else
1255 ofs = m; /* key <= a[m] */
1256 }
1257 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1258 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001259
1260fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001262}
1263
1264/*
1265Exactly like gallop_left(), except that if key already exists in a[0:n],
1266finds the position immediately to the right of the rightmost equal value.
1267
1268The return value is the int k in 0..n such that
1269
1270 a[k-1] <= key < a[k]
1271
1272or -1 if error.
1273
1274The code duplication is massive, but this is enough different given that
1275we're sticking to "<" comparisons that it's much harder to follow if
1276written as one routine with yet another "left or right?" flag.
1277*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001278static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001279gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 Py_ssize_t ofs;
1282 Py_ssize_t lastofs;
1283 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 a += hint;
1288 lastofs = 0;
1289 ofs = 1;
1290 IFLT(key, *a) {
1291 /* key < a[hint] -- gallop left, until
1292 * a[hint - ofs] <= key < a[hint - lastofs]
1293 */
1294 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1295 while (ofs < maxofs) {
1296 IFLT(key, *(a-ofs)) {
1297 lastofs = ofs;
1298 ofs = (ofs << 1) + 1;
1299 if (ofs <= 0) /* int overflow */
1300 ofs = maxofs;
1301 }
1302 else /* a[hint - ofs] <= key */
1303 break;
1304 }
1305 if (ofs > maxofs)
1306 ofs = maxofs;
1307 /* Translate back to positive offsets relative to &a[0]. */
1308 k = lastofs;
1309 lastofs = hint - ofs;
1310 ofs = hint - k;
1311 }
1312 else {
1313 /* a[hint] <= key -- gallop right, until
1314 * a[hint + lastofs] <= key < a[hint + ofs]
1315 */
1316 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1317 while (ofs < maxofs) {
1318 IFLT(key, a[ofs])
1319 break;
1320 /* a[hint + ofs] <= key */
1321 lastofs = ofs;
1322 ofs = (ofs << 1) + 1;
1323 if (ofs <= 0) /* int overflow */
1324 ofs = maxofs;
1325 }
1326 if (ofs > maxofs)
1327 ofs = maxofs;
1328 /* Translate back to offsets relative to &a[0]. */
1329 lastofs += hint;
1330 ofs += hint;
1331 }
1332 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1335 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1336 * right of lastofs but no farther right than ofs. Do a binary
1337 * search, with invariant a[lastofs-1] <= key < a[ofs].
1338 */
1339 ++lastofs;
1340 while (lastofs < ofs) {
1341 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 IFLT(key, a[m])
1344 ofs = m; /* key < a[m] */
1345 else
1346 lastofs = m+1; /* a[m] <= key */
1347 }
1348 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1349 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001350
1351fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001353}
1354
1355/* The maximum number of entries in a MergeState's pending-runs stack.
1356 * This is enough to sort arrays of size up to about
1357 * 32 * phi ** MAX_MERGE_PENDING
1358 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1359 * with 2**64 elements.
1360 */
1361#define MAX_MERGE_PENDING 85
1362
Tim Peterse05f65a2002-08-10 05:21:15 +00001363/* When we get into galloping mode, we stay there until both runs win less
1364 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001365 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001366#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001367
1368/* Avoid malloc for small temp arrays. */
1369#define MERGESTATE_TEMP_SIZE 256
1370
1371/* One MergeState exists on the stack per invocation of mergesort. It's just
1372 * a convenient way to pass state around among the helper functions.
1373 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001374struct s_slice {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001375 sortslice base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001377};
1378
Tim Petersa64dc242002-08-01 02:13:36 +00001379typedef struct s_MergeState {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 /* This controls when we get *into* galloping mode. It's initialized
1381 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1382 * random data, and lower for highly structured data.
1383 */
1384 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 /* 'a' is temp storage to help with merges. It contains room for
1387 * alloced entries.
1388 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001389 sortslice a; /* may point to temparray below */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 /* A stack of n pending runs yet to be merged. Run #i starts at
1393 * address base[i] and extends for len[i] elements. It's always
1394 * true (so long as the indices are in bounds) that
1395 *
1396 * pending[i].base + pending[i].len == pending[i+1].base
1397 *
1398 * so we could cut the storage for this, but it's a minor amount,
1399 * and keeping all the info explicit simplifies the code.
1400 */
1401 int n;
1402 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 /* 'a' points to this when possible, rather than muck with malloc. */
1405 PyObject *temparray[MERGESTATE_TEMP_SIZE];
Tim Petersa64dc242002-08-01 02:13:36 +00001406} MergeState;
1407
1408/* Conceptually a MergeState's constructor. */
1409static void
Victor Stinner0fcab4a2011-01-04 12:59:15 +00001410merge_init(MergeState *ms, Py_ssize_t list_size, int has_keyfunc)
Tim Petersa64dc242002-08-01 02:13:36 +00001411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001413 if (has_keyfunc) {
1414 /* The temporary space for merging will need at most half the list
1415 * size rounded up. Use the minimum possible space so we can use the
1416 * rest of temparray for other things. In particular, if there is
1417 * enough extra space, listsort() will use it to store the keys.
1418 */
1419 ms->alloced = (list_size + 1) / 2;
1420
1421 /* ms->alloced describes how many keys will be stored at
1422 ms->temparray, but we also need to store the values. Hence,
1423 ms->alloced is capped at half of MERGESTATE_TEMP_SIZE. */
1424 if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
1425 ms->alloced = MERGESTATE_TEMP_SIZE / 2;
1426 ms->a.values = &ms->temparray[ms->alloced];
1427 }
1428 else {
1429 ms->alloced = MERGESTATE_TEMP_SIZE;
1430 ms->a.values = NULL;
1431 }
1432 ms->a.keys = ms->temparray;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 ms->n = 0;
1434 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001435}
1436
1437/* Free all the temp memory owned by the MergeState. This must be called
1438 * when you're done with a MergeState, and may be called before then if
1439 * you want to free the temp memory early.
1440 */
1441static void
1442merge_freemem(MergeState *ms)
1443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001445 if (ms->a.keys != ms->temparray)
1446 PyMem_Free(ms->a.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001447}
1448
1449/* Ensure enough temp memory for 'need' array slots is available.
1450 * Returns 0 on success and -1 if the memory can't be gotten.
1451 */
1452static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001453merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001454{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001455 int multiplier;
1456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 assert(ms != NULL);
1458 if (need <= ms->alloced)
1459 return 0;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001460
1461 multiplier = ms->a.values != NULL ? 2 : 1;
1462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 /* Don't realloc! That can cost cycles to copy the old data, but
1464 * we don't care what's in the block.
1465 */
1466 merge_freemem(ms);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001467 if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*) / multiplier) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 PyErr_NoMemory();
1469 return -1;
1470 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001471 ms->a.keys = (PyObject**)PyMem_Malloc(multiplier * need
1472 * sizeof(PyObject *));
1473 if (ms->a.keys != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 ms->alloced = need;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001475 if (ms->a.values != NULL)
1476 ms->a.values = &ms->a.keys[need];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 return 0;
1478 }
1479 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001481}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1483 merge_getmem(MS, NEED))
Tim Petersa64dc242002-08-01 02:13:36 +00001484
Daniel Stutzbach98338222010-12-02 21:55:33 +00001485/* Merge the na elements starting at ssa with the nb elements starting at
1486 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1487 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1488 * should have na <= nb. See listsort.txt for more info. Return 0 if
1489 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001490 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001491static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001492merge_lo(MergeState *ms, sortslice ssa, Py_ssize_t na,
1493 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001496 sortslice dest;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 int result = -1; /* guilty until proved innocent */
1498 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001499
Daniel Stutzbach98338222010-12-02 21:55:33 +00001500 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1501 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 if (MERGE_GETMEM(ms, na) < 0)
1503 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001504 sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
1505 dest = ssa;
1506 ssa = ms->a;
Tim Petersa64dc242002-08-01 02:13:36 +00001507
Daniel Stutzbach98338222010-12-02 21:55:33 +00001508 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 --nb;
1510 if (nb == 0)
1511 goto Succeed;
1512 if (na == 1)
1513 goto CopyB;
Tim Petersa64dc242002-08-01 02:13:36 +00001514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 min_gallop = ms->min_gallop;
1516 for (;;) {
1517 Py_ssize_t acount = 0; /* # of times A won in a row */
1518 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 /* Do the straightforward thing until (if ever) one run
1521 * appears to win consistently.
1522 */
1523 for (;;) {
1524 assert(na > 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001525 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 if (k) {
1527 if (k < 0)
1528 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001529 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 ++bcount;
1531 acount = 0;
1532 --nb;
1533 if (nb == 0)
1534 goto Succeed;
1535 if (bcount >= min_gallop)
1536 break;
1537 }
1538 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001539 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 ++acount;
1541 bcount = 0;
1542 --na;
1543 if (na == 1)
1544 goto CopyB;
1545 if (acount >= min_gallop)
1546 break;
1547 }
1548 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 /* One run is winning so consistently that galloping may
1551 * be a huge win. So try that, and continue galloping until
1552 * (if ever) neither run appears to be winning consistently
1553 * anymore.
1554 */
1555 ++min_gallop;
1556 do {
1557 assert(na > 1 && nb > 0);
1558 min_gallop -= min_gallop > 1;
1559 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001560 k = gallop_right(ssb.keys[0], ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 acount = k;
1562 if (k) {
1563 if (k < 0)
1564 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001565 sortslice_memcpy(&dest, 0, &ssa, 0, k);
1566 sortslice_advance(&dest, k);
1567 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 na -= k;
1569 if (na == 1)
1570 goto CopyB;
1571 /* na==0 is impossible now if the comparison
1572 * function is consistent, but we can't assume
1573 * that it is.
1574 */
1575 if (na == 0)
1576 goto Succeed;
1577 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001578 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 --nb;
1580 if (nb == 0)
1581 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001582
Daniel Stutzbach98338222010-12-02 21:55:33 +00001583 k = gallop_left(ssa.keys[0], ssb.keys, nb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 bcount = k;
1585 if (k) {
1586 if (k < 0)
1587 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001588 sortslice_memmove(&dest, 0, &ssb, 0, k);
1589 sortslice_advance(&dest, k);
1590 sortslice_advance(&ssb, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 nb -= k;
1592 if (nb == 0)
1593 goto Succeed;
1594 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001595 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 --na;
1597 if (na == 1)
1598 goto CopyB;
1599 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1600 ++min_gallop; /* penalize it for leaving galloping mode */
1601 ms->min_gallop = min_gallop;
1602 }
Tim Petersa64dc242002-08-01 02:13:36 +00001603Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001605Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 if (na)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001607 sortslice_memcpy(&dest, 0, &ssa, 0, na);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001609CopyB:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 assert(na == 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001611 /* The last element of ssa belongs at the end of the merge. */
1612 sortslice_memmove(&dest, 0, &ssb, 0, nb);
1613 sortslice_copy(&dest, nb, &ssa, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001615}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001616
Daniel Stutzbach98338222010-12-02 21:55:33 +00001617/* Merge the na elements starting at pa with the nb elements starting at
1618 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1619 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1620 * should have na >= nb. See listsort.txt for more info. Return 0 if
1621 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001622 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001623static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001624merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
1625 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001628 sortslice dest, basea, baseb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 int result = -1; /* guilty until proved innocent */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001631
Daniel Stutzbach98338222010-12-02 21:55:33 +00001632 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1633 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 if (MERGE_GETMEM(ms, nb) < 0)
1635 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001636 dest = ssb;
1637 sortslice_advance(&dest, nb-1);
1638 sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
1639 basea = ssa;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 baseb = ms->a;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001641 ssb.keys = ms->a.keys + nb - 1;
1642 if (ssb.values != NULL)
1643 ssb.values = ms->a.values + nb - 1;
1644 sortslice_advance(&ssa, na - 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001645
Daniel Stutzbach98338222010-12-02 21:55:33 +00001646 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 --na;
1648 if (na == 0)
1649 goto Succeed;
1650 if (nb == 1)
1651 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 min_gallop = ms->min_gallop;
1654 for (;;) {
1655 Py_ssize_t acount = 0; /* # of times A won in a row */
1656 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 /* Do the straightforward thing until (if ever) one run
1659 * appears to win consistently.
1660 */
1661 for (;;) {
1662 assert(na > 0 && nb > 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001663 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 if (k) {
1665 if (k < 0)
1666 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001667 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 ++acount;
1669 bcount = 0;
1670 --na;
1671 if (na == 0)
1672 goto Succeed;
1673 if (acount >= min_gallop)
1674 break;
1675 }
1676 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001677 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 ++bcount;
1679 acount = 0;
1680 --nb;
1681 if (nb == 1)
1682 goto CopyA;
1683 if (bcount >= min_gallop)
1684 break;
1685 }
1686 }
Tim Petersa64dc242002-08-01 02:13:36 +00001687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 /* One run is winning so consistently that galloping may
1689 * be a huge win. So try that, and continue galloping until
1690 * (if ever) neither run appears to be winning consistently
1691 * anymore.
1692 */
1693 ++min_gallop;
1694 do {
1695 assert(na > 0 && nb > 1);
1696 min_gallop -= min_gallop > 1;
1697 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001698 k = gallop_right(ssb.keys[0], basea.keys, na, na-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 if (k < 0)
1700 goto Fail;
1701 k = na - k;
1702 acount = k;
1703 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001704 sortslice_advance(&dest, -k);
1705 sortslice_advance(&ssa, -k);
1706 sortslice_memmove(&dest, 1, &ssa, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 na -= k;
1708 if (na == 0)
1709 goto Succeed;
1710 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001711 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 --nb;
1713 if (nb == 1)
1714 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001715
Daniel Stutzbach98338222010-12-02 21:55:33 +00001716 k = gallop_left(ssa.keys[0], baseb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 if (k < 0)
1718 goto Fail;
1719 k = nb - k;
1720 bcount = k;
1721 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001722 sortslice_advance(&dest, -k);
1723 sortslice_advance(&ssb, -k);
1724 sortslice_memcpy(&dest, 1, &ssb, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 nb -= k;
1726 if (nb == 1)
1727 goto CopyA;
1728 /* nb==0 is impossible now if the comparison
1729 * function is consistent, but we can't assume
1730 * that it is.
1731 */
1732 if (nb == 0)
1733 goto Succeed;
1734 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001735 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 --na;
1737 if (na == 0)
1738 goto Succeed;
1739 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1740 ++min_gallop; /* penalize it for leaving galloping mode */
1741 ms->min_gallop = min_gallop;
1742 }
Tim Petersa64dc242002-08-01 02:13:36 +00001743Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001745Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 if (nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001747 sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001749CopyA:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 assert(nb == 1 && na > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001751 /* The first element of ssb belongs at the front of the merge. */
1752 sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
1753 sortslice_advance(&dest, -na);
1754 sortslice_advance(&ssa, -na);
1755 sortslice_copy(&dest, 0, &ssb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001757}
1758
1759/* Merge the two runs at stack indices i and i+1.
1760 * Returns 0 on success, -1 on error.
1761 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001762static Py_ssize_t
1763merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001764{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001765 sortslice ssa, ssb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 Py_ssize_t na, nb;
1767 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 assert(ms != NULL);
1770 assert(ms->n >= 2);
1771 assert(i >= 0);
1772 assert(i == ms->n - 2 || i == ms->n - 3);
Tim Petersa64dc242002-08-01 02:13:36 +00001773
Daniel Stutzbach98338222010-12-02 21:55:33 +00001774 ssa = ms->pending[i].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 na = ms->pending[i].len;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001776 ssb = ms->pending[i+1].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 nb = ms->pending[i+1].len;
1778 assert(na > 0 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001779 assert(ssa.keys + na == ssb.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 /* Record the length of the combined runs; if i is the 3rd-last
1782 * run now, also slide over the last run (which isn't involved
1783 * in this merge). The current run i+1 goes away in any case.
1784 */
1785 ms->pending[i].len = na + nb;
1786 if (i == ms->n - 3)
1787 ms->pending[i+1] = ms->pending[i+2];
1788 --ms->n;
Tim Petersa64dc242002-08-01 02:13:36 +00001789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 /* Where does b start in a? Elements in a before that can be
1791 * ignored (already in place).
1792 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001793 k = gallop_right(*ssb.keys, ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 if (k < 0)
1795 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001796 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 na -= k;
1798 if (na == 0)
1799 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 /* Where does a end in b? Elements in b after that can be
1802 * ignored (already in place).
1803 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001804 nb = gallop_left(ssa.keys[na-1], ssb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 if (nb <= 0)
1806 return nb;
Tim Petersa64dc242002-08-01 02:13:36 +00001807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 /* Merge what remains of the runs, using a temp array with
1809 * min(na, nb) elements.
1810 */
1811 if (na <= nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001812 return merge_lo(ms, ssa, na, ssb, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 else
Daniel Stutzbach98338222010-12-02 21:55:33 +00001814 return merge_hi(ms, ssa, na, ssb, nb);
Tim Petersa64dc242002-08-01 02:13:36 +00001815}
1816
1817/* Examine the stack of runs waiting to be merged, merging adjacent runs
1818 * until the stack invariants are re-established:
1819 *
1820 * 1. len[-3] > len[-2] + len[-1]
1821 * 2. len[-2] > len[-1]
1822 *
1823 * See listsort.txt for more info.
1824 *
1825 * Returns 0 on success, -1 on error.
1826 */
1827static int
1828merge_collapse(MergeState *ms)
1829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 assert(ms);
1833 while (ms->n > 1) {
1834 Py_ssize_t n = ms->n - 2;
1835 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1836 if (p[n-1].len < p[n+1].len)
1837 --n;
1838 if (merge_at(ms, n) < 0)
1839 return -1;
1840 }
1841 else if (p[n].len <= p[n+1].len) {
1842 if (merge_at(ms, n) < 0)
1843 return -1;
1844 }
1845 else
1846 break;
1847 }
1848 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001849}
1850
1851/* Regardless of invariants, merge all runs on the stack until only one
1852 * remains. This is used at the end of the mergesort.
1853 *
1854 * Returns 0 on success, -1 on error.
1855 */
1856static int
1857merge_force_collapse(MergeState *ms)
1858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 assert(ms);
1862 while (ms->n > 1) {
1863 Py_ssize_t n = ms->n - 2;
1864 if (n > 0 && p[n-1].len < p[n+1].len)
1865 --n;
1866 if (merge_at(ms, n) < 0)
1867 return -1;
1868 }
1869 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001870}
1871
1872/* Compute a good value for the minimum run length; natural runs shorter
1873 * than this are boosted artificially via binary insertion.
1874 *
1875 * If n < 64, return n (it's too small to bother with fancy stuff).
1876 * Else if n is an exact power of 2, return 32.
1877 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1878 * strictly less than, an exact power of 2.
1879 *
1880 * See listsort.txt for more info.
1881 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001882static Py_ssize_t
1883merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 assert(n >= 0);
1888 while (n >= 64) {
1889 r |= n & 1;
1890 n >>= 1;
1891 }
1892 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001893}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001894
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001895static void
Daniel Stutzbach98338222010-12-02 21:55:33 +00001896reverse_sortslice(sortslice *s, Py_ssize_t n)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001897{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001898 reverse_slice(s->keys, &s->keys[n]);
1899 if (s->values != NULL)
1900 reverse_slice(s->values, &s->values[n]);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001901}
1902
Tim Petersa64dc242002-08-01 02:13:36 +00001903/* An adaptive, stable, natural mergesort. See listsort.txt.
1904 * Returns Py_None on success, NULL on error. Even in case of error, the
1905 * list will be some permutation of its input state (nothing is lost or
1906 * duplicated).
1907 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001908static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001909listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 MergeState ms;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 Py_ssize_t nremaining;
1913 Py_ssize_t minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001914 sortslice lo;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 Py_ssize_t saved_ob_size, saved_allocated;
1916 PyObject **saved_ob_item;
1917 PyObject **final_ob_item;
1918 PyObject *result = NULL; /* guilty until proved innocent */
1919 int reverse = 0;
1920 PyObject *keyfunc = NULL;
1921 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 static char *kwlist[] = {"key", "reverse", 0};
Daniel Stutzbach98338222010-12-02 21:55:33 +00001923 PyObject **keys;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 assert(self != NULL);
1926 assert (PyList_Check(self));
1927 if (args != NULL) {
1928 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1929 kwlist, &keyfunc, &reverse))
1930 return NULL;
1931 if (Py_SIZE(args) > 0) {
1932 PyErr_SetString(PyExc_TypeError,
1933 "must use keyword argument for key function");
1934 return NULL;
1935 }
1936 }
1937 if (keyfunc == Py_None)
1938 keyfunc = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 /* The list is temporarily made empty, so that mutations performed
1941 * by comparison functions can't affect the slice of memory we're
1942 * sorting (allowing mutations during sorting is a core-dump
1943 * factory, since ob_item may change).
1944 */
1945 saved_ob_size = Py_SIZE(self);
1946 saved_ob_item = self->ob_item;
1947 saved_allocated = self->allocated;
1948 Py_SIZE(self) = 0;
1949 self->ob_item = NULL;
1950 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00001951
Daniel Stutzbach98338222010-12-02 21:55:33 +00001952 if (keyfunc == NULL) {
1953 keys = NULL;
1954 lo.keys = saved_ob_item;
1955 lo.values = NULL;
1956 }
1957 else {
1958 if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
1959 /* Leverage stack space we allocated but won't otherwise use */
1960 keys = &ms.temparray[saved_ob_size+1];
1961 else {
1962 keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size);
1963 if (keys == NULL)
1964 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001966
1967 for (i = 0; i < saved_ob_size ; i++) {
1968 keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i],
1969 NULL);
1970 if (keys[i] == NULL) {
1971 for (i=i-1 ; i>=0 ; i--)
1972 Py_DECREF(keys[i]);
Benjamin Peterson4a42cd42014-03-15 12:21:28 -05001973 if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
Daniel Stutzbach8eda5f72011-03-02 23:37:50 +00001974 PyMem_FREE(keys);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001975 goto keyfunc_fail;
1976 }
1977 }
1978
1979 lo.keys = keys;
1980 lo.values = saved_ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001982
Daniel Stutzbach98338222010-12-02 21:55:33 +00001983 merge_init(&ms, saved_ob_size, keys != NULL);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 nremaining = saved_ob_size;
1986 if (nremaining < 2)
1987 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001988
Benjamin Peterson05380642010-08-23 19:35:39 +00001989 /* Reverse sort stability achieved by initially reversing the list,
1990 applying a stable forward sort, then reversing the final result. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001991 if (reverse) {
1992 if (keys != NULL)
1993 reverse_slice(&keys[0], &keys[saved_ob_size]);
1994 reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
1995 }
Benjamin Peterson05380642010-08-23 19:35:39 +00001996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 /* March over the array once, left to right, finding natural runs,
1998 * and extending short natural runs to minrun elements.
1999 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 minrun = merge_compute_minrun(nremaining);
2001 do {
2002 int descending;
2003 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 /* Identify next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002006 n = count_run(lo.keys, lo.keys + nremaining, &descending);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 if (n < 0)
2008 goto fail;
2009 if (descending)
Daniel Stutzbach98338222010-12-02 21:55:33 +00002010 reverse_sortslice(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 /* If short, extend to min(minrun, nremaining). */
2012 if (n < minrun) {
2013 const Py_ssize_t force = nremaining <= minrun ?
2014 nremaining : minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00002015 if (binarysort(lo, lo.keys + force, lo.keys + n) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 goto fail;
2017 n = force;
2018 }
2019 /* Push run onto pending-runs stack, and maybe merge. */
2020 assert(ms.n < MAX_MERGE_PENDING);
2021 ms.pending[ms.n].base = lo;
2022 ms.pending[ms.n].len = n;
2023 ++ms.n;
2024 if (merge_collapse(&ms) < 0)
2025 goto fail;
2026 /* Advance to find next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002027 sortslice_advance(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 nremaining -= n;
2029 } while (nremaining);
Tim Peters330f9e92002-07-19 07:05:44 +00002030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 if (merge_force_collapse(&ms) < 0)
2032 goto fail;
2033 assert(ms.n == 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002034 assert(keys == NULL
2035 ? ms.pending[0].base.keys == saved_ob_item
2036 : ms.pending[0].base.keys == &keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 assert(ms.pending[0].len == saved_ob_size);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002038 lo = ms.pending[0].base;
Tim Petersa64dc242002-08-01 02:13:36 +00002039
2040succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002042fail:
Daniel Stutzbach98338222010-12-02 21:55:33 +00002043 if (keys != NULL) {
2044 for (i = 0; i < saved_ob_size; i++)
2045 Py_DECREF(keys[i]);
Benjamin Petersonef87f8c2014-03-14 21:54:31 -05002046 if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
Daniel Stutzbach98338222010-12-02 21:55:33 +00002047 PyMem_FREE(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 if (self->allocated != -1 && result != NULL) {
2051 /* The user mucked with the list during the sort,
2052 * and we don't already have another error to report.
2053 */
2054 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2055 result = NULL;
2056 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (reverse && saved_ob_size > 1)
2059 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 merge_freemem(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002062
Daniel Stutzbach98338222010-12-02 21:55:33 +00002063keyfunc_fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 final_ob_item = self->ob_item;
2065 i = Py_SIZE(self);
2066 Py_SIZE(self) = saved_ob_size;
2067 self->ob_item = saved_ob_item;
2068 self->allocated = saved_allocated;
2069 if (final_ob_item != NULL) {
2070 /* we cannot use list_clear() for this because it does not
2071 guarantee that the list is really empty when it returns */
2072 while (--i >= 0) {
2073 Py_XDECREF(final_ob_item[i]);
2074 }
2075 PyMem_FREE(final_ob_item);
2076 }
2077 Py_XINCREF(result);
2078 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002079}
Tim Peters330f9e92002-07-19 07:05:44 +00002080#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002081#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002082
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002083int
Fred Drakea2f55112000-07-09 15:16:51 +00002084PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 if (v == NULL || !PyList_Check(v)) {
2087 PyErr_BadInternalCall();
2088 return -1;
2089 }
2090 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2091 if (v == NULL)
2092 return -1;
2093 Py_DECREF(v);
2094 return 0;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002095}
2096
Guido van Rossumb86c5492001-02-12 22:06:02 +00002097static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002098listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 if (Py_SIZE(self) > 1)
2101 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2102 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002103}
2104
Guido van Rossum84c76f51990-10-30 13:32:20 +00002105int
Fred Drakea2f55112000-07-09 15:16:51 +00002106PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 PyListObject *self = (PyListObject *)v;
Tim Peters6063e262002-08-08 01:06:39 +00002109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 if (v == NULL || !PyList_Check(v)) {
2111 PyErr_BadInternalCall();
2112 return -1;
2113 }
2114 if (Py_SIZE(self) > 1)
2115 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2116 return 0;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002117}
2118
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002119PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002120PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 PyObject *w;
2123 PyObject **p, **q;
2124 Py_ssize_t n;
2125 if (v == NULL || !PyList_Check(v)) {
2126 PyErr_BadInternalCall();
2127 return NULL;
2128 }
2129 n = Py_SIZE(v);
2130 w = PyTuple_New(n);
2131 if (w == NULL)
2132 return NULL;
2133 p = ((PyTupleObject *)w)->ob_item;
2134 q = ((PyListObject *)v)->ob_item;
2135 while (--n >= 0) {
2136 Py_INCREF(*q);
2137 *p = *q;
2138 p++;
2139 q++;
2140 }
2141 return w;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002142}
2143
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002144static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002145listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Amaury Forgeot d'Arc864741b2011-11-06 15:10:48 +01002148 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002149
Petri Lehtinenebfaabd2011-11-06 21:02:39 +02002150 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2151 _PyEval_SliceIndex, &start,
2152 _PyEval_SliceIndex, &stop))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 return NULL;
2154 if (start < 0) {
2155 start += Py_SIZE(self);
2156 if (start < 0)
2157 start = 0;
2158 }
2159 if (stop < 0) {
2160 stop += Py_SIZE(self);
2161 if (stop < 0)
2162 stop = 0;
2163 }
2164 for (i = start; i < stop && i < Py_SIZE(self); i++) {
2165 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2166 if (cmp > 0)
2167 return PyLong_FromSsize_t(i);
2168 else if (cmp < 0)
2169 return NULL;
2170 }
Amaury Forgeot d'Arc864741b2011-11-06 15:10:48 +01002171 PyErr_Format(PyExc_ValueError, "%R is not in list", v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002173}
2174
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002176listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 Py_ssize_t count = 0;
2179 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 for (i = 0; i < Py_SIZE(self); i++) {
2182 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2183 if (cmp > 0)
2184 count++;
2185 else if (cmp < 0)
2186 return NULL;
2187 }
2188 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002189}
2190
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002191static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002192listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 for (i = 0; i < Py_SIZE(self); i++) {
2197 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2198 if (cmp > 0) {
2199 if (list_ass_slice(self, i, i+1,
2200 (PyObject *)NULL) == 0)
2201 Py_RETURN_NONE;
2202 return NULL;
2203 }
2204 else if (cmp < 0)
2205 return NULL;
2206 }
2207 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2208 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002209}
2210
Jeremy Hylton8caad492000-06-23 14:18:11 +00002211static int
2212list_traverse(PyListObject *o, visitproc visit, void *arg)
2213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 for (i = Py_SIZE(o); --i >= 0; )
2217 Py_VISIT(o->ob_item[i]);
2218 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002219}
2220
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002221static PyObject *
2222list_richcompare(PyObject *v, PyObject *w, int op)
2223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 PyListObject *vl, *wl;
2225 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002226
Brian Curtindfc80e32011-08-10 20:28:54 -05002227 if (!PyList_Check(v) || !PyList_Check(w))
2228 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 vl = (PyListObject *)v;
2231 wl = (PyListObject *)w;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2234 /* Shortcut: if the lengths differ, the lists differ */
2235 PyObject *res;
2236 if (op == Py_EQ)
2237 res = Py_False;
2238 else
2239 res = Py_True;
2240 Py_INCREF(res);
2241 return res;
2242 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 /* Search for the first index where items are different */
2245 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2246 int k = PyObject_RichCompareBool(vl->ob_item[i],
2247 wl->ob_item[i], Py_EQ);
2248 if (k < 0)
2249 return NULL;
2250 if (!k)
2251 break;
2252 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2255 /* No more items to compare -- compare sizes */
2256 Py_ssize_t vs = Py_SIZE(vl);
2257 Py_ssize_t ws = Py_SIZE(wl);
2258 int cmp;
2259 PyObject *res;
2260 switch (op) {
2261 case Py_LT: cmp = vs < ws; break;
2262 case Py_LE: cmp = vs <= ws; break;
2263 case Py_EQ: cmp = vs == ws; break;
2264 case Py_NE: cmp = vs != ws; break;
2265 case Py_GT: cmp = vs > ws; break;
2266 case Py_GE: cmp = vs >= ws; break;
2267 default: return NULL; /* cannot happen */
2268 }
2269 if (cmp)
2270 res = Py_True;
2271 else
2272 res = Py_False;
2273 Py_INCREF(res);
2274 return res;
2275 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* We have an item that differs -- shortcuts for EQ/NE */
2278 if (op == Py_EQ) {
2279 Py_INCREF(Py_False);
2280 return Py_False;
2281 }
2282 if (op == Py_NE) {
2283 Py_INCREF(Py_True);
2284 return Py_True;
2285 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 /* Compare the final item again using the proper operator */
2288 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002289}
2290
Tim Peters6d6c1a32001-08-02 04:15:00 +00002291static int
2292list_init(PyListObject *self, PyObject *args, PyObject *kw)
2293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 PyObject *arg = NULL;
2295 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2298 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 /* Verify list invariants established by PyType_GenericAlloc() */
2301 assert(0 <= Py_SIZE(self));
2302 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2303 assert(self->ob_item != NULL ||
2304 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 /* Empty previous contents */
2307 if (self->ob_item != NULL) {
2308 (void)list_clear(self);
2309 }
2310 if (arg != NULL) {
2311 PyObject *rv = listextend(self, arg);
2312 if (rv == NULL)
2313 return -1;
2314 Py_DECREF(rv);
2315 }
2316 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002317}
2318
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002319static PyObject *
2320list_sizeof(PyListObject *self)
2321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
2325 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002326}
2327
Raymond Hettinger1021c442003-11-07 15:38:09 +00002328static PyObject *list_iter(PyObject *seq);
2329static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2330
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002331PyDoc_STRVAR(getitem_doc,
2332"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002333PyDoc_STRVAR(reversed_doc,
2334"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002335PyDoc_STRVAR(sizeof_doc,
2336"L.__sizeof__() -- size of L in memory, in bytes");
Eli Benderskycbbaa962011-02-25 05:47:53 +00002337PyDoc_STRVAR(clear_doc,
2338"L.clear() -> None -- remove all items from L");
2339PyDoc_STRVAR(copy_doc,
2340"L.copy() -> list -- a shallow copy of L");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002341PyDoc_STRVAR(append_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002342"L.append(object) -> None -- append object to end");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002343PyDoc_STRVAR(extend_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002344"L.extend(iterable) -> None -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002345PyDoc_STRVAR(insert_doc,
2346"L.insert(index, object) -- insert object before index");
2347PyDoc_STRVAR(pop_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002348"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2349"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002350PyDoc_STRVAR(remove_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002351"L.remove(value) -> None -- remove first occurrence of value.\n"
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002352"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002353PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002354"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2355"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002356PyDoc_STRVAR(count_doc,
2357"L.count(value) -> integer -- return number of occurrences of value");
2358PyDoc_STRVAR(reverse_doc,
2359"L.reverse() -- reverse *IN PLACE*");
2360PyDoc_STRVAR(sort_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002361"L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002362
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002363static PyObject *list_subscript(PyListObject*, PyObject*);
2364
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002365static PyMethodDef list_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2367 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2368 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002369 {"clear", (PyCFunction)listclear, METH_NOARGS, clear_doc},
2370 {"copy", (PyCFunction)listcopy, METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 {"append", (PyCFunction)listappend, METH_O, append_doc},
2372 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002373 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
2375 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2376 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
2377 {"count", (PyCFunction)listcount, METH_O, count_doc},
2378 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2379 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
2380 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002381};
2382
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002383static PySequenceMethods list_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 (lenfunc)list_length, /* sq_length */
2385 (binaryfunc)list_concat, /* sq_concat */
2386 (ssizeargfunc)list_repeat, /* sq_repeat */
2387 (ssizeargfunc)list_item, /* sq_item */
2388 0, /* sq_slice */
2389 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2390 0, /* sq_ass_slice */
2391 (objobjproc)list_contains, /* sq_contains */
2392 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2393 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002394};
2395
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002396PyDoc_STRVAR(list_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002397"list() -> new empty list\n"
2398"list(iterable) -> new list initialized from iterable's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002399
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002400static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002401list_subscript(PyListObject* self, PyObject* item)
2402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 if (PyIndex_Check(item)) {
2404 Py_ssize_t i;
2405 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2406 if (i == -1 && PyErr_Occurred())
2407 return NULL;
2408 if (i < 0)
2409 i += PyList_GET_SIZE(self);
2410 return list_item(self, i);
2411 }
2412 else if (PySlice_Check(item)) {
2413 Py_ssize_t start, stop, step, slicelength, cur, i;
2414 PyObject* result;
2415 PyObject* it;
2416 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002417
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002418 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 &start, &stop, &step, &slicelength) < 0) {
2420 return NULL;
2421 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 if (slicelength <= 0) {
2424 return PyList_New(0);
2425 }
2426 else if (step == 1) {
2427 return list_slice(self, start, stop);
2428 }
2429 else {
2430 result = PyList_New(slicelength);
2431 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 src = self->ob_item;
2434 dest = ((PyListObject *)result)->ob_item;
2435 for (cur = start, i = 0; i < slicelength;
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002436 cur += (size_t)step, i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 it = src[cur];
2438 Py_INCREF(it);
2439 dest[i] = it;
2440 }
Tim Peters3b01a122002-07-19 02:35:45 +00002441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 return result;
2443 }
2444 }
2445 else {
2446 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04002447 "list indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 item->ob_type->tp_name);
2449 return NULL;
2450 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002451}
2452
Tim Peters3b01a122002-07-19 02:35:45 +00002453static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002454list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 if (PyIndex_Check(item)) {
2457 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2458 if (i == -1 && PyErr_Occurred())
2459 return -1;
2460 if (i < 0)
2461 i += PyList_GET_SIZE(self);
2462 return list_ass_item(self, i, value);
2463 }
2464 else if (PySlice_Check(item)) {
2465 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002466
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002467 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 &start, &stop, &step, &slicelength) < 0) {
2469 return -1;
2470 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 if (step == 1)
2473 return list_ass_slice(self, start, stop, value);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 /* Make sure s[5:2] = [..] inserts at the right place:
2476 before 5, not before 2. */
2477 if ((step < 0 && start < stop) ||
2478 (step > 0 && start > stop))
2479 stop = start;
Thomas Woutersed03b412007-08-28 21:37:11 +00002480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 if (value == NULL) {
2482 /* delete slice */
2483 PyObject **garbage;
2484 size_t cur;
2485 Py_ssize_t i;
Victor Stinner35f28032013-11-21 12:16:35 +01002486 int res;
Tim Peters3b01a122002-07-19 02:35:45 +00002487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 if (slicelength <= 0)
2489 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 if (step < 0) {
2492 stop = start + 1;
2493 start = stop + step*(slicelength - 1) - 1;
2494 step = -step;
2495 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 assert((size_t)slicelength <=
2498 PY_SIZE_MAX / sizeof(PyObject*));
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 garbage = (PyObject**)
2501 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2502 if (!garbage) {
2503 PyErr_NoMemory();
2504 return -1;
2505 }
Tim Peters3b01a122002-07-19 02:35:45 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 /* drawing pictures might help understand these for
2508 loops. Basically, we memmove the parts of the
2509 list that are *not* part of the slice: step-1
2510 items for each item that is part of the slice,
2511 and then tail end of the list that was not
2512 covered by the slice */
2513 for (cur = start, i = 0;
2514 cur < (size_t)stop;
2515 cur += step, i++) {
2516 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 garbage[i] = PyList_GET_ITEM(self, cur);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 if (cur + step >= (size_t)Py_SIZE(self)) {
2521 lim = Py_SIZE(self) - cur - 1;
2522 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 memmove(self->ob_item + cur - i,
2525 self->ob_item + cur + 1,
2526 lim * sizeof(PyObject *));
2527 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002528 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 if (cur < (size_t)Py_SIZE(self)) {
2530 memmove(self->ob_item + cur - slicelength,
2531 self->ob_item + cur,
2532 (Py_SIZE(self) - cur) *
2533 sizeof(PyObject *));
2534 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 Py_SIZE(self) -= slicelength;
Victor Stinner35f28032013-11-21 12:16:35 +01002537 res = list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 for (i = 0; i < slicelength; i++) {
2540 Py_DECREF(garbage[i]);
2541 }
2542 PyMem_FREE(garbage);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002543
Victor Stinner35f28032013-11-21 12:16:35 +01002544 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 }
2546 else {
2547 /* assign slice */
2548 PyObject *ins, *seq;
2549 PyObject **garbage, **seqitems, **selfitems;
2550 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 /* protect against a[::-1] = a */
2553 if (self == (PyListObject*)value) {
2554 seq = list_slice((PyListObject*)value, 0,
2555 PyList_GET_SIZE(value));
2556 }
2557 else {
2558 seq = PySequence_Fast(value,
2559 "must assign iterable "
2560 "to extended slice");
2561 }
2562 if (!seq)
2563 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2566 PyErr_Format(PyExc_ValueError,
2567 "attempt to assign sequence of "
2568 "size %zd to extended slice of "
2569 "size %zd",
2570 PySequence_Fast_GET_SIZE(seq),
2571 slicelength);
2572 Py_DECREF(seq);
2573 return -1;
2574 }
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 if (!slicelength) {
2577 Py_DECREF(seq);
2578 return 0;
2579 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 garbage = (PyObject**)
2582 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2583 if (!garbage) {
2584 Py_DECREF(seq);
2585 PyErr_NoMemory();
2586 return -1;
2587 }
Tim Peters3b01a122002-07-19 02:35:45 +00002588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 selfitems = self->ob_item;
2590 seqitems = PySequence_Fast_ITEMS(seq);
2591 for (cur = start, i = 0; i < slicelength;
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002592 cur += (size_t)step, i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 garbage[i] = selfitems[cur];
2594 ins = seqitems[i];
2595 Py_INCREF(ins);
2596 selfitems[cur] = ins;
2597 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 for (i = 0; i < slicelength; i++) {
2600 Py_DECREF(garbage[i]);
2601 }
Tim Peters3b01a122002-07-19 02:35:45 +00002602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 PyMem_FREE(garbage);
2604 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 return 0;
2607 }
2608 }
2609 else {
2610 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04002611 "list indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 item->ob_type->tp_name);
2613 return -1;
2614 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002615}
2616
2617static PyMappingMethods list_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 (lenfunc)list_length,
2619 (binaryfunc)list_subscript,
2620 (objobjargproc)list_ass_subscript
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002621};
2622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002623PyTypeObject PyList_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2625 "list",
2626 sizeof(PyListObject),
2627 0,
2628 (destructor)list_dealloc, /* tp_dealloc */
2629 0, /* tp_print */
2630 0, /* tp_getattr */
2631 0, /* tp_setattr */
2632 0, /* tp_reserved */
2633 (reprfunc)list_repr, /* tp_repr */
2634 0, /* tp_as_number */
2635 &list_as_sequence, /* tp_as_sequence */
2636 &list_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002637 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 0, /* tp_call */
2639 0, /* tp_str */
2640 PyObject_GenericGetAttr, /* tp_getattro */
2641 0, /* tp_setattro */
2642 0, /* tp_as_buffer */
2643 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2644 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
2645 list_doc, /* tp_doc */
2646 (traverseproc)list_traverse, /* tp_traverse */
2647 (inquiry)list_clear, /* tp_clear */
2648 list_richcompare, /* tp_richcompare */
2649 0, /* tp_weaklistoffset */
2650 list_iter, /* tp_iter */
2651 0, /* tp_iternext */
2652 list_methods, /* tp_methods */
2653 0, /* tp_members */
2654 0, /* tp_getset */
2655 0, /* tp_base */
2656 0, /* tp_dict */
2657 0, /* tp_descr_get */
2658 0, /* tp_descr_set */
2659 0, /* tp_dictoffset */
2660 (initproc)list_init, /* tp_init */
2661 PyType_GenericAlloc, /* tp_alloc */
2662 PyType_GenericNew, /* tp_new */
2663 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002664};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002665
2666
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002667/*********************** List Iterator **************************/
2668
2669typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 PyObject_HEAD
Victor Stinner7660b882013-06-24 23:59:24 +02002671 Py_ssize_t it_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002673} listiterobject;
2674
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002675static PyObject *list_iter(PyObject *);
2676static void listiter_dealloc(listiterobject *);
2677static int listiter_traverse(listiterobject *, visitproc, void *);
2678static PyObject *listiter_next(listiterobject *);
2679static PyObject *listiter_len(listiterobject *);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002680static PyObject *listiter_reduce_general(void *_it, int forward);
2681static PyObject *listiter_reduce(listiterobject *);
2682static PyObject *listiter_setstate(listiterobject *, PyObject *state);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002683
Armin Rigof5b3e362006-02-11 21:32:43 +00002684PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002685PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2686PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002687
2688static PyMethodDef listiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002690 {"__reduce__", (PyCFunction)listiter_reduce, METH_NOARGS, reduce_doc},
2691 {"__setstate__", (PyCFunction)listiter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002693};
2694
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002695PyTypeObject PyListIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2697 "list_iterator", /* tp_name */
2698 sizeof(listiterobject), /* tp_basicsize */
2699 0, /* tp_itemsize */
2700 /* methods */
2701 (destructor)listiter_dealloc, /* tp_dealloc */
2702 0, /* tp_print */
2703 0, /* tp_getattr */
2704 0, /* tp_setattr */
2705 0, /* tp_reserved */
2706 0, /* tp_repr */
2707 0, /* tp_as_number */
2708 0, /* tp_as_sequence */
2709 0, /* tp_as_mapping */
2710 0, /* tp_hash */
2711 0, /* tp_call */
2712 0, /* tp_str */
2713 PyObject_GenericGetAttr, /* tp_getattro */
2714 0, /* tp_setattro */
2715 0, /* tp_as_buffer */
2716 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2717 0, /* tp_doc */
2718 (traverseproc)listiter_traverse, /* tp_traverse */
2719 0, /* tp_clear */
2720 0, /* tp_richcompare */
2721 0, /* tp_weaklistoffset */
2722 PyObject_SelfIter, /* tp_iter */
2723 (iternextfunc)listiter_next, /* tp_iternext */
2724 listiter_methods, /* tp_methods */
2725 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002726};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002727
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002728
2729static PyObject *
2730list_iter(PyObject *seq)
2731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 listiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 if (!PyList_Check(seq)) {
2735 PyErr_BadInternalCall();
2736 return NULL;
2737 }
2738 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2739 if (it == NULL)
2740 return NULL;
2741 it->it_index = 0;
2742 Py_INCREF(seq);
2743 it->it_seq = (PyListObject *)seq;
2744 _PyObject_GC_TRACK(it);
2745 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002746}
2747
2748static void
2749listiter_dealloc(listiterobject *it)
2750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 _PyObject_GC_UNTRACK(it);
2752 Py_XDECREF(it->it_seq);
2753 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002754}
2755
2756static int
2757listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 Py_VISIT(it->it_seq);
2760 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002761}
2762
2763static PyObject *
2764listiter_next(listiterobject *it)
2765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 PyListObject *seq;
2767 PyObject *item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 assert(it != NULL);
2770 seq = it->it_seq;
2771 if (seq == NULL)
2772 return NULL;
2773 assert(PyList_Check(seq));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 if (it->it_index < PyList_GET_SIZE(seq)) {
2776 item = PyList_GET_ITEM(seq, it->it_index);
2777 ++it->it_index;
2778 Py_INCREF(item);
2779 return item;
2780 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 Py_DECREF(seq);
2783 it->it_seq = NULL;
2784 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002785}
2786
2787static PyObject *
2788listiter_len(listiterobject *it)
2789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 Py_ssize_t len;
2791 if (it->it_seq) {
2792 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2793 if (len >= 0)
2794 return PyLong_FromSsize_t(len);
2795 }
2796 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002797}
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002798
2799static PyObject *
2800listiter_reduce(listiterobject *it)
2801{
2802 return listiter_reduce_general(it, 1);
2803}
2804
2805static PyObject *
2806listiter_setstate(listiterobject *it, PyObject *state)
2807{
Victor Stinner7660b882013-06-24 23:59:24 +02002808 Py_ssize_t index = PyLong_AsSsize_t(state);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002809 if (index == -1 && PyErr_Occurred())
2810 return NULL;
2811 if (it->it_seq != NULL) {
2812 if (index < 0)
2813 index = 0;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002814 else if (index > PyList_GET_SIZE(it->it_seq))
2815 index = PyList_GET_SIZE(it->it_seq); /* iterator exhausted */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002816 it->it_index = index;
2817 }
2818 Py_RETURN_NONE;
2819}
2820
Raymond Hettinger1021c442003-11-07 15:38:09 +00002821/*********************** List Reverse Iterator **************************/
2822
2823typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 PyObject_HEAD
2825 Py_ssize_t it_index;
2826 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002827} listreviterobject;
2828
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002829static PyObject *list_reversed(PyListObject *, PyObject *);
2830static void listreviter_dealloc(listreviterobject *);
2831static int listreviter_traverse(listreviterobject *, visitproc, void *);
2832static PyObject *listreviter_next(listreviterobject *);
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002833static PyObject *listreviter_len(listreviterobject *);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002834static PyObject *listreviter_reduce(listreviterobject *);
2835static PyObject *listreviter_setstate(listreviterobject *, PyObject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002836
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002837static PyMethodDef listreviter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002839 {"__reduce__", (PyCFunction)listreviter_reduce, METH_NOARGS, reduce_doc},
2840 {"__setstate__", (PyCFunction)listreviter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 {NULL, NULL} /* sentinel */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002842};
2843
Raymond Hettinger1021c442003-11-07 15:38:09 +00002844PyTypeObject PyListRevIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2846 "list_reverseiterator", /* tp_name */
2847 sizeof(listreviterobject), /* tp_basicsize */
2848 0, /* tp_itemsize */
2849 /* methods */
2850 (destructor)listreviter_dealloc, /* tp_dealloc */
2851 0, /* tp_print */
2852 0, /* tp_getattr */
2853 0, /* tp_setattr */
2854 0, /* tp_reserved */
2855 0, /* tp_repr */
2856 0, /* tp_as_number */
2857 0, /* tp_as_sequence */
2858 0, /* tp_as_mapping */
2859 0, /* tp_hash */
2860 0, /* tp_call */
2861 0, /* tp_str */
2862 PyObject_GenericGetAttr, /* tp_getattro */
2863 0, /* tp_setattro */
2864 0, /* tp_as_buffer */
2865 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2866 0, /* tp_doc */
2867 (traverseproc)listreviter_traverse, /* tp_traverse */
2868 0, /* tp_clear */
2869 0, /* tp_richcompare */
2870 0, /* tp_weaklistoffset */
2871 PyObject_SelfIter, /* tp_iter */
2872 (iternextfunc)listreviter_next, /* tp_iternext */
2873 listreviter_methods, /* tp_methods */
2874 0,
Raymond Hettinger1021c442003-11-07 15:38:09 +00002875};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002876
2877static PyObject *
2878list_reversed(PyListObject *seq, PyObject *unused)
2879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 listreviterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2883 if (it == NULL)
2884 return NULL;
2885 assert(PyList_Check(seq));
2886 it->it_index = PyList_GET_SIZE(seq) - 1;
2887 Py_INCREF(seq);
2888 it->it_seq = seq;
2889 PyObject_GC_Track(it);
2890 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002891}
2892
2893static void
2894listreviter_dealloc(listreviterobject *it)
2895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 PyObject_GC_UnTrack(it);
2897 Py_XDECREF(it->it_seq);
2898 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002899}
2900
2901static int
2902listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 Py_VISIT(it->it_seq);
2905 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002906}
2907
2908static PyObject *
2909listreviter_next(listreviterobject *it)
2910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 PyObject *item;
2912 Py_ssize_t index = it->it_index;
2913 PyListObject *seq = it->it_seq;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2916 item = PyList_GET_ITEM(seq, index);
2917 it->it_index--;
2918 Py_INCREF(item);
2919 return item;
2920 }
2921 it->it_index = -1;
2922 if (seq != NULL) {
2923 it->it_seq = NULL;
2924 Py_DECREF(seq);
2925 }
2926 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002927}
2928
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002929static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002930listreviter_len(listreviterobject *it)
2931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 Py_ssize_t len = it->it_index + 1;
2933 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2934 len = 0;
2935 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002936}
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002937
2938static PyObject *
2939listreviter_reduce(listreviterobject *it)
2940{
2941 return listiter_reduce_general(it, 0);
2942}
2943
2944static PyObject *
2945listreviter_setstate(listreviterobject *it, PyObject *state)
2946{
2947 Py_ssize_t index = PyLong_AsSsize_t(state);
2948 if (index == -1 && PyErr_Occurred())
2949 return NULL;
2950 if (it->it_seq != NULL) {
2951 if (index < -1)
2952 index = -1;
2953 else if (index > PyList_GET_SIZE(it->it_seq) - 1)
2954 index = PyList_GET_SIZE(it->it_seq) - 1;
2955 it->it_index = index;
2956 }
2957 Py_RETURN_NONE;
2958}
2959
2960/* common pickling support */
2961
2962static PyObject *
2963listiter_reduce_general(void *_it, int forward)
2964{
2965 PyObject *list;
2966
2967 /* the objects are not the same, index is of different types! */
2968 if (forward) {
2969 listiterobject *it = (listiterobject *)_it;
2970 if (it->it_seq)
Victor Stinner7660b882013-06-24 23:59:24 +02002971 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002972 it->it_seq, it->it_index);
2973 } else {
2974 listreviterobject *it = (listreviterobject *)_it;
2975 if (it->it_seq)
Antoine Pitroua7013882012-04-05 00:04:20 +02002976 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("reversed"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002977 it->it_seq, it->it_index);
2978 }
2979 /* empty iterator, create an empty list */
2980 list = PyList_New(0);
2981 if (list == NULL)
2982 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02002983 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002984}