blob: eee7c68e9e4562c8da0c63efc80b67fc70ef261f [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;
Benjamin Petersonb808d592015-02-25 10:12:26 -05001835 if ((n > 0 && p[n-1].len <= p[n].len + p[n+1].len) ||
1836 (n > 1 && p[n-2].len <= p[n-1].len + p[n].len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 if (p[n-1].len < p[n+1].len)
1838 --n;
1839 if (merge_at(ms, n) < 0)
1840 return -1;
1841 }
1842 else if (p[n].len <= p[n+1].len) {
1843 if (merge_at(ms, n) < 0)
1844 return -1;
1845 }
1846 else
1847 break;
1848 }
1849 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001850}
1851
1852/* Regardless of invariants, merge all runs on the stack until only one
1853 * remains. This is used at the end of the mergesort.
1854 *
1855 * Returns 0 on success, -1 on error.
1856 */
1857static int
1858merge_force_collapse(MergeState *ms)
1859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 assert(ms);
1863 while (ms->n > 1) {
1864 Py_ssize_t n = ms->n - 2;
1865 if (n > 0 && p[n-1].len < p[n+1].len)
1866 --n;
1867 if (merge_at(ms, n) < 0)
1868 return -1;
1869 }
1870 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001871}
1872
1873/* Compute a good value for the minimum run length; natural runs shorter
1874 * than this are boosted artificially via binary insertion.
1875 *
1876 * If n < 64, return n (it's too small to bother with fancy stuff).
1877 * Else if n is an exact power of 2, return 32.
1878 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1879 * strictly less than, an exact power of 2.
1880 *
1881 * See listsort.txt for more info.
1882 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001883static Py_ssize_t
1884merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 assert(n >= 0);
1889 while (n >= 64) {
1890 r |= n & 1;
1891 n >>= 1;
1892 }
1893 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001894}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001895
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001896static void
Daniel Stutzbach98338222010-12-02 21:55:33 +00001897reverse_sortslice(sortslice *s, Py_ssize_t n)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001898{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001899 reverse_slice(s->keys, &s->keys[n]);
1900 if (s->values != NULL)
1901 reverse_slice(s->values, &s->values[n]);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001902}
1903
Tim Petersa64dc242002-08-01 02:13:36 +00001904/* An adaptive, stable, natural mergesort. See listsort.txt.
1905 * Returns Py_None on success, NULL on error. Even in case of error, the
1906 * list will be some permutation of its input state (nothing is lost or
1907 * duplicated).
1908 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001909static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001910listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 MergeState ms;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 Py_ssize_t nremaining;
1914 Py_ssize_t minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001915 sortslice lo;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 Py_ssize_t saved_ob_size, saved_allocated;
1917 PyObject **saved_ob_item;
1918 PyObject **final_ob_item;
1919 PyObject *result = NULL; /* guilty until proved innocent */
1920 int reverse = 0;
1921 PyObject *keyfunc = NULL;
1922 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 static char *kwlist[] = {"key", "reverse", 0};
Daniel Stutzbach98338222010-12-02 21:55:33 +00001924 PyObject **keys;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 assert(self != NULL);
1927 assert (PyList_Check(self));
1928 if (args != NULL) {
1929 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1930 kwlist, &keyfunc, &reverse))
1931 return NULL;
1932 if (Py_SIZE(args) > 0) {
1933 PyErr_SetString(PyExc_TypeError,
1934 "must use keyword argument for key function");
1935 return NULL;
1936 }
1937 }
1938 if (keyfunc == Py_None)
1939 keyfunc = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 /* The list is temporarily made empty, so that mutations performed
1942 * by comparison functions can't affect the slice of memory we're
1943 * sorting (allowing mutations during sorting is a core-dump
1944 * factory, since ob_item may change).
1945 */
1946 saved_ob_size = Py_SIZE(self);
1947 saved_ob_item = self->ob_item;
1948 saved_allocated = self->allocated;
1949 Py_SIZE(self) = 0;
1950 self->ob_item = NULL;
1951 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00001952
Daniel Stutzbach98338222010-12-02 21:55:33 +00001953 if (keyfunc == NULL) {
1954 keys = NULL;
1955 lo.keys = saved_ob_item;
1956 lo.values = NULL;
1957 }
1958 else {
1959 if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
1960 /* Leverage stack space we allocated but won't otherwise use */
1961 keys = &ms.temparray[saved_ob_size+1];
1962 else {
1963 keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size);
Benjamin Peterson0823ffb2015-04-23 17:04:36 -04001964 if (keys == NULL) {
1965 PyErr_NoMemory();
1966 goto keyfunc_fail;
1967 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001969
1970 for (i = 0; i < saved_ob_size ; i++) {
1971 keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i],
1972 NULL);
1973 if (keys[i] == NULL) {
1974 for (i=i-1 ; i>=0 ; i--)
1975 Py_DECREF(keys[i]);
Benjamin Peterson4a42cd42014-03-15 12:21:28 -05001976 if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
Daniel Stutzbach8eda5f72011-03-02 23:37:50 +00001977 PyMem_FREE(keys);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001978 goto keyfunc_fail;
1979 }
1980 }
1981
1982 lo.keys = keys;
1983 lo.values = saved_ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001985
Daniel Stutzbach98338222010-12-02 21:55:33 +00001986 merge_init(&ms, saved_ob_size, keys != NULL);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 nremaining = saved_ob_size;
1989 if (nremaining < 2)
1990 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001991
Benjamin Peterson05380642010-08-23 19:35:39 +00001992 /* Reverse sort stability achieved by initially reversing the list,
1993 applying a stable forward sort, then reversing the final result. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001994 if (reverse) {
1995 if (keys != NULL)
1996 reverse_slice(&keys[0], &keys[saved_ob_size]);
1997 reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
1998 }
Benjamin Peterson05380642010-08-23 19:35:39 +00001999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 /* March over the array once, left to right, finding natural runs,
2001 * and extending short natural runs to minrun elements.
2002 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 minrun = merge_compute_minrun(nremaining);
2004 do {
2005 int descending;
2006 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 /* Identify next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002009 n = count_run(lo.keys, lo.keys + nremaining, &descending);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 if (n < 0)
2011 goto fail;
2012 if (descending)
Daniel Stutzbach98338222010-12-02 21:55:33 +00002013 reverse_sortslice(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 /* If short, extend to min(minrun, nremaining). */
2015 if (n < minrun) {
2016 const Py_ssize_t force = nremaining <= minrun ?
2017 nremaining : minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00002018 if (binarysort(lo, lo.keys + force, lo.keys + n) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 goto fail;
2020 n = force;
2021 }
2022 /* Push run onto pending-runs stack, and maybe merge. */
2023 assert(ms.n < MAX_MERGE_PENDING);
2024 ms.pending[ms.n].base = lo;
2025 ms.pending[ms.n].len = n;
2026 ++ms.n;
2027 if (merge_collapse(&ms) < 0)
2028 goto fail;
2029 /* Advance to find next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002030 sortslice_advance(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 nremaining -= n;
2032 } while (nremaining);
Tim Peters330f9e92002-07-19 07:05:44 +00002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 if (merge_force_collapse(&ms) < 0)
2035 goto fail;
2036 assert(ms.n == 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002037 assert(keys == NULL
2038 ? ms.pending[0].base.keys == saved_ob_item
2039 : ms.pending[0].base.keys == &keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 assert(ms.pending[0].len == saved_ob_size);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002041 lo = ms.pending[0].base;
Tim Petersa64dc242002-08-01 02:13:36 +00002042
2043succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002045fail:
Daniel Stutzbach98338222010-12-02 21:55:33 +00002046 if (keys != NULL) {
2047 for (i = 0; i < saved_ob_size; i++)
2048 Py_DECREF(keys[i]);
Benjamin Petersonef87f8c2014-03-14 21:54:31 -05002049 if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
Daniel Stutzbach98338222010-12-02 21:55:33 +00002050 PyMem_FREE(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 if (self->allocated != -1 && result != NULL) {
2054 /* The user mucked with the list during the sort,
2055 * and we don't already have another error to report.
2056 */
2057 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2058 result = NULL;
2059 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 if (reverse && saved_ob_size > 1)
2062 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 merge_freemem(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002065
Daniel Stutzbach98338222010-12-02 21:55:33 +00002066keyfunc_fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 final_ob_item = self->ob_item;
2068 i = Py_SIZE(self);
2069 Py_SIZE(self) = saved_ob_size;
2070 self->ob_item = saved_ob_item;
2071 self->allocated = saved_allocated;
2072 if (final_ob_item != NULL) {
2073 /* we cannot use list_clear() for this because it does not
2074 guarantee that the list is really empty when it returns */
2075 while (--i >= 0) {
2076 Py_XDECREF(final_ob_item[i]);
2077 }
2078 PyMem_FREE(final_ob_item);
2079 }
2080 Py_XINCREF(result);
2081 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002082}
Tim Peters330f9e92002-07-19 07:05:44 +00002083#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002084#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002085
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002086int
Fred Drakea2f55112000-07-09 15:16:51 +00002087PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 if (v == NULL || !PyList_Check(v)) {
2090 PyErr_BadInternalCall();
2091 return -1;
2092 }
2093 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2094 if (v == NULL)
2095 return -1;
2096 Py_DECREF(v);
2097 return 0;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002098}
2099
Guido van Rossumb86c5492001-02-12 22:06:02 +00002100static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002101listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 if (Py_SIZE(self) > 1)
2104 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2105 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002106}
2107
Guido van Rossum84c76f51990-10-30 13:32:20 +00002108int
Fred Drakea2f55112000-07-09 15:16:51 +00002109PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 PyListObject *self = (PyListObject *)v;
Tim Peters6063e262002-08-08 01:06:39 +00002112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 if (v == NULL || !PyList_Check(v)) {
2114 PyErr_BadInternalCall();
2115 return -1;
2116 }
2117 if (Py_SIZE(self) > 1)
2118 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2119 return 0;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002120}
2121
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002122PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002123PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 PyObject *w;
2126 PyObject **p, **q;
2127 Py_ssize_t n;
2128 if (v == NULL || !PyList_Check(v)) {
2129 PyErr_BadInternalCall();
2130 return NULL;
2131 }
2132 n = Py_SIZE(v);
2133 w = PyTuple_New(n);
2134 if (w == NULL)
2135 return NULL;
2136 p = ((PyTupleObject *)w)->ob_item;
2137 q = ((PyListObject *)v)->ob_item;
2138 while (--n >= 0) {
2139 Py_INCREF(*q);
2140 *p = *q;
2141 p++;
2142 q++;
2143 }
2144 return w;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002145}
2146
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002147static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002148listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Amaury Forgeot d'Arc864741b2011-11-06 15:10:48 +01002151 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002152
Petri Lehtinenebfaabd2011-11-06 21:02:39 +02002153 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2154 _PyEval_SliceIndex, &start,
2155 _PyEval_SliceIndex, &stop))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 return NULL;
2157 if (start < 0) {
2158 start += Py_SIZE(self);
2159 if (start < 0)
2160 start = 0;
2161 }
2162 if (stop < 0) {
2163 stop += Py_SIZE(self);
2164 if (stop < 0)
2165 stop = 0;
2166 }
2167 for (i = start; i < stop && i < Py_SIZE(self); i++) {
2168 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2169 if (cmp > 0)
2170 return PyLong_FromSsize_t(i);
2171 else if (cmp < 0)
2172 return NULL;
2173 }
Amaury Forgeot d'Arc864741b2011-11-06 15:10:48 +01002174 PyErr_Format(PyExc_ValueError, "%R is not in list", v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002176}
2177
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002179listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 Py_ssize_t count = 0;
2182 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 for (i = 0; i < Py_SIZE(self); i++) {
2185 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2186 if (cmp > 0)
2187 count++;
2188 else if (cmp < 0)
2189 return NULL;
2190 }
2191 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002192}
2193
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002194static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002195listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 for (i = 0; i < Py_SIZE(self); i++) {
2200 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2201 if (cmp > 0) {
2202 if (list_ass_slice(self, i, i+1,
2203 (PyObject *)NULL) == 0)
2204 Py_RETURN_NONE;
2205 return NULL;
2206 }
2207 else if (cmp < 0)
2208 return NULL;
2209 }
2210 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2211 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002212}
2213
Jeremy Hylton8caad492000-06-23 14:18:11 +00002214static int
2215list_traverse(PyListObject *o, visitproc visit, void *arg)
2216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 for (i = Py_SIZE(o); --i >= 0; )
2220 Py_VISIT(o->ob_item[i]);
2221 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002222}
2223
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002224static PyObject *
2225list_richcompare(PyObject *v, PyObject *w, int op)
2226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 PyListObject *vl, *wl;
2228 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002229
Brian Curtindfc80e32011-08-10 20:28:54 -05002230 if (!PyList_Check(v) || !PyList_Check(w))
2231 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 vl = (PyListObject *)v;
2234 wl = (PyListObject *)w;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2237 /* Shortcut: if the lengths differ, the lists differ */
2238 PyObject *res;
2239 if (op == Py_EQ)
2240 res = Py_False;
2241 else
2242 res = Py_True;
2243 Py_INCREF(res);
2244 return res;
2245 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 /* Search for the first index where items are different */
2248 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2249 int k = PyObject_RichCompareBool(vl->ob_item[i],
2250 wl->ob_item[i], Py_EQ);
2251 if (k < 0)
2252 return NULL;
2253 if (!k)
2254 break;
2255 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2258 /* No more items to compare -- compare sizes */
2259 Py_ssize_t vs = Py_SIZE(vl);
2260 Py_ssize_t ws = Py_SIZE(wl);
2261 int cmp;
2262 PyObject *res;
2263 switch (op) {
2264 case Py_LT: cmp = vs < ws; break;
2265 case Py_LE: cmp = vs <= ws; break;
2266 case Py_EQ: cmp = vs == ws; break;
2267 case Py_NE: cmp = vs != ws; break;
2268 case Py_GT: cmp = vs > ws; break;
2269 case Py_GE: cmp = vs >= ws; break;
2270 default: return NULL; /* cannot happen */
2271 }
2272 if (cmp)
2273 res = Py_True;
2274 else
2275 res = Py_False;
2276 Py_INCREF(res);
2277 return res;
2278 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 /* We have an item that differs -- shortcuts for EQ/NE */
2281 if (op == Py_EQ) {
2282 Py_INCREF(Py_False);
2283 return Py_False;
2284 }
2285 if (op == Py_NE) {
2286 Py_INCREF(Py_True);
2287 return Py_True;
2288 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 /* Compare the final item again using the proper operator */
2291 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002292}
2293
Tim Peters6d6c1a32001-08-02 04:15:00 +00002294static int
2295list_init(PyListObject *self, PyObject *args, PyObject *kw)
2296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 PyObject *arg = NULL;
2298 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2301 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 /* Verify list invariants established by PyType_GenericAlloc() */
2304 assert(0 <= Py_SIZE(self));
2305 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2306 assert(self->ob_item != NULL ||
2307 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 /* Empty previous contents */
2310 if (self->ob_item != NULL) {
2311 (void)list_clear(self);
2312 }
2313 if (arg != NULL) {
2314 PyObject *rv = listextend(self, arg);
2315 if (rv == NULL)
2316 return -1;
2317 Py_DECREF(rv);
2318 }
2319 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002320}
2321
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002322static PyObject *
2323list_sizeof(PyListObject *self)
2324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002326
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002327 res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * sizeof(void*);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002329}
2330
Raymond Hettinger1021c442003-11-07 15:38:09 +00002331static PyObject *list_iter(PyObject *seq);
2332static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2333
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002334PyDoc_STRVAR(getitem_doc,
2335"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002336PyDoc_STRVAR(reversed_doc,
2337"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002338PyDoc_STRVAR(sizeof_doc,
2339"L.__sizeof__() -- size of L in memory, in bytes");
Eli Benderskycbbaa962011-02-25 05:47:53 +00002340PyDoc_STRVAR(clear_doc,
2341"L.clear() -> None -- remove all items from L");
2342PyDoc_STRVAR(copy_doc,
2343"L.copy() -> list -- a shallow copy of L");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002344PyDoc_STRVAR(append_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002345"L.append(object) -> None -- append object to end");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346PyDoc_STRVAR(extend_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002347"L.extend(iterable) -> None -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002348PyDoc_STRVAR(insert_doc,
2349"L.insert(index, object) -- insert object before index");
2350PyDoc_STRVAR(pop_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002351"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2352"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002353PyDoc_STRVAR(remove_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002354"L.remove(value) -> None -- remove first occurrence of value.\n"
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002355"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002356PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002357"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2358"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002359PyDoc_STRVAR(count_doc,
2360"L.count(value) -> integer -- return number of occurrences of value");
2361PyDoc_STRVAR(reverse_doc,
2362"L.reverse() -- reverse *IN PLACE*");
2363PyDoc_STRVAR(sort_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002364"L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002365
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002366static PyObject *list_subscript(PyListObject*, PyObject*);
2367
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002368static PyMethodDef list_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2370 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2371 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002372 {"clear", (PyCFunction)listclear, METH_NOARGS, clear_doc},
2373 {"copy", (PyCFunction)listcopy, METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 {"append", (PyCFunction)listappend, METH_O, append_doc},
2375 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002376 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
2378 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2379 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
2380 {"count", (PyCFunction)listcount, METH_O, count_doc},
2381 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2382 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
2383 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002384};
2385
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002386static PySequenceMethods list_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 (lenfunc)list_length, /* sq_length */
2388 (binaryfunc)list_concat, /* sq_concat */
2389 (ssizeargfunc)list_repeat, /* sq_repeat */
2390 (ssizeargfunc)list_item, /* sq_item */
2391 0, /* sq_slice */
2392 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2393 0, /* sq_ass_slice */
2394 (objobjproc)list_contains, /* sq_contains */
2395 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2396 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002397};
2398
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002399PyDoc_STRVAR(list_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002400"list() -> new empty list\n"
2401"list(iterable) -> new list initialized from iterable's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002402
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002403static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002404list_subscript(PyListObject* self, PyObject* item)
2405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 if (PyIndex_Check(item)) {
2407 Py_ssize_t i;
2408 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2409 if (i == -1 && PyErr_Occurred())
2410 return NULL;
2411 if (i < 0)
2412 i += PyList_GET_SIZE(self);
2413 return list_item(self, i);
2414 }
2415 else if (PySlice_Check(item)) {
2416 Py_ssize_t start, stop, step, slicelength, cur, i;
2417 PyObject* result;
2418 PyObject* it;
2419 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002420
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002421 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 &start, &stop, &step, &slicelength) < 0) {
2423 return NULL;
2424 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 if (slicelength <= 0) {
2427 return PyList_New(0);
2428 }
2429 else if (step == 1) {
2430 return list_slice(self, start, stop);
2431 }
2432 else {
2433 result = PyList_New(slicelength);
2434 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 src = self->ob_item;
2437 dest = ((PyListObject *)result)->ob_item;
2438 for (cur = start, i = 0; i < slicelength;
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002439 cur += (size_t)step, i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 it = src[cur];
2441 Py_INCREF(it);
2442 dest[i] = it;
2443 }
Tim Peters3b01a122002-07-19 02:35:45 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 return result;
2446 }
2447 }
2448 else {
2449 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04002450 "list indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 item->ob_type->tp_name);
2452 return NULL;
2453 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002454}
2455
Tim Peters3b01a122002-07-19 02:35:45 +00002456static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002457list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 if (PyIndex_Check(item)) {
2460 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2461 if (i == -1 && PyErr_Occurred())
2462 return -1;
2463 if (i < 0)
2464 i += PyList_GET_SIZE(self);
2465 return list_ass_item(self, i, value);
2466 }
2467 else if (PySlice_Check(item)) {
2468 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002469
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002470 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 &start, &stop, &step, &slicelength) < 0) {
2472 return -1;
2473 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 if (step == 1)
2476 return list_ass_slice(self, start, stop, value);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 /* Make sure s[5:2] = [..] inserts at the right place:
2479 before 5, not before 2. */
2480 if ((step < 0 && start < stop) ||
2481 (step > 0 && start > stop))
2482 stop = start;
Thomas Woutersed03b412007-08-28 21:37:11 +00002483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 if (value == NULL) {
2485 /* delete slice */
2486 PyObject **garbage;
2487 size_t cur;
2488 Py_ssize_t i;
Victor Stinner35f28032013-11-21 12:16:35 +01002489 int res;
Tim Peters3b01a122002-07-19 02:35:45 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 if (slicelength <= 0)
2492 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 if (step < 0) {
2495 stop = start + 1;
2496 start = stop + step*(slicelength - 1) - 1;
2497 step = -step;
2498 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 assert((size_t)slicelength <=
2501 PY_SIZE_MAX / sizeof(PyObject*));
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 garbage = (PyObject**)
2504 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2505 if (!garbage) {
2506 PyErr_NoMemory();
2507 return -1;
2508 }
Tim Peters3b01a122002-07-19 02:35:45 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 /* drawing pictures might help understand these for
2511 loops. Basically, we memmove the parts of the
2512 list that are *not* part of the slice: step-1
2513 items for each item that is part of the slice,
2514 and then tail end of the list that was not
2515 covered by the slice */
2516 for (cur = start, i = 0;
2517 cur < (size_t)stop;
2518 cur += step, i++) {
2519 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 garbage[i] = PyList_GET_ITEM(self, cur);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 if (cur + step >= (size_t)Py_SIZE(self)) {
2524 lim = Py_SIZE(self) - cur - 1;
2525 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00002526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 memmove(self->ob_item + cur - i,
2528 self->ob_item + cur + 1,
2529 lim * sizeof(PyObject *));
2530 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002531 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 if (cur < (size_t)Py_SIZE(self)) {
2533 memmove(self->ob_item + cur - slicelength,
2534 self->ob_item + cur,
2535 (Py_SIZE(self) - cur) *
2536 sizeof(PyObject *));
2537 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 Py_SIZE(self) -= slicelength;
Victor Stinner35f28032013-11-21 12:16:35 +01002540 res = list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 for (i = 0; i < slicelength; i++) {
2543 Py_DECREF(garbage[i]);
2544 }
2545 PyMem_FREE(garbage);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002546
Victor Stinner35f28032013-11-21 12:16:35 +01002547 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 }
2549 else {
2550 /* assign slice */
2551 PyObject *ins, *seq;
2552 PyObject **garbage, **seqitems, **selfitems;
2553 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 /* protect against a[::-1] = a */
2556 if (self == (PyListObject*)value) {
2557 seq = list_slice((PyListObject*)value, 0,
2558 PyList_GET_SIZE(value));
2559 }
2560 else {
2561 seq = PySequence_Fast(value,
2562 "must assign iterable "
2563 "to extended slice");
2564 }
2565 if (!seq)
2566 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2569 PyErr_Format(PyExc_ValueError,
2570 "attempt to assign sequence of "
2571 "size %zd to extended slice of "
2572 "size %zd",
2573 PySequence_Fast_GET_SIZE(seq),
2574 slicelength);
2575 Py_DECREF(seq);
2576 return -1;
2577 }
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 if (!slicelength) {
2580 Py_DECREF(seq);
2581 return 0;
2582 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 garbage = (PyObject**)
2585 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2586 if (!garbage) {
2587 Py_DECREF(seq);
2588 PyErr_NoMemory();
2589 return -1;
2590 }
Tim Peters3b01a122002-07-19 02:35:45 +00002591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 selfitems = self->ob_item;
2593 seqitems = PySequence_Fast_ITEMS(seq);
2594 for (cur = start, i = 0; i < slicelength;
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002595 cur += (size_t)step, i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 garbage[i] = selfitems[cur];
2597 ins = seqitems[i];
2598 Py_INCREF(ins);
2599 selfitems[cur] = ins;
2600 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 for (i = 0; i < slicelength; i++) {
2603 Py_DECREF(garbage[i]);
2604 }
Tim Peters3b01a122002-07-19 02:35:45 +00002605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 PyMem_FREE(garbage);
2607 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 return 0;
2610 }
2611 }
2612 else {
2613 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04002614 "list indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 item->ob_type->tp_name);
2616 return -1;
2617 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002618}
2619
2620static PyMappingMethods list_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 (lenfunc)list_length,
2622 (binaryfunc)list_subscript,
2623 (objobjargproc)list_ass_subscript
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002624};
2625
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002626PyTypeObject PyList_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2628 "list",
2629 sizeof(PyListObject),
2630 0,
2631 (destructor)list_dealloc, /* tp_dealloc */
2632 0, /* tp_print */
2633 0, /* tp_getattr */
2634 0, /* tp_setattr */
2635 0, /* tp_reserved */
2636 (reprfunc)list_repr, /* tp_repr */
2637 0, /* tp_as_number */
2638 &list_as_sequence, /* tp_as_sequence */
2639 &list_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002640 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 0, /* tp_call */
2642 0, /* tp_str */
2643 PyObject_GenericGetAttr, /* tp_getattro */
2644 0, /* tp_setattro */
2645 0, /* tp_as_buffer */
2646 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2647 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
2648 list_doc, /* tp_doc */
2649 (traverseproc)list_traverse, /* tp_traverse */
2650 (inquiry)list_clear, /* tp_clear */
2651 list_richcompare, /* tp_richcompare */
2652 0, /* tp_weaklistoffset */
2653 list_iter, /* tp_iter */
2654 0, /* tp_iternext */
2655 list_methods, /* tp_methods */
2656 0, /* tp_members */
2657 0, /* tp_getset */
2658 0, /* tp_base */
2659 0, /* tp_dict */
2660 0, /* tp_descr_get */
2661 0, /* tp_descr_set */
2662 0, /* tp_dictoffset */
2663 (initproc)list_init, /* tp_init */
2664 PyType_GenericAlloc, /* tp_alloc */
2665 PyType_GenericNew, /* tp_new */
2666 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002667};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002668
2669
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002670/*********************** List Iterator **************************/
2671
2672typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 PyObject_HEAD
Victor Stinner7660b882013-06-24 23:59:24 +02002674 Py_ssize_t it_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002676} listiterobject;
2677
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002678static PyObject *list_iter(PyObject *);
2679static void listiter_dealloc(listiterobject *);
2680static int listiter_traverse(listiterobject *, visitproc, void *);
2681static PyObject *listiter_next(listiterobject *);
2682static PyObject *listiter_len(listiterobject *);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002683static PyObject *listiter_reduce_general(void *_it, int forward);
2684static PyObject *listiter_reduce(listiterobject *);
2685static PyObject *listiter_setstate(listiterobject *, PyObject *state);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002686
Armin Rigof5b3e362006-02-11 21:32:43 +00002687PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002688PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2689PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002690
2691static PyMethodDef listiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002693 {"__reduce__", (PyCFunction)listiter_reduce, METH_NOARGS, reduce_doc},
2694 {"__setstate__", (PyCFunction)listiter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002696};
2697
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002698PyTypeObject PyListIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2700 "list_iterator", /* tp_name */
2701 sizeof(listiterobject), /* tp_basicsize */
2702 0, /* tp_itemsize */
2703 /* methods */
2704 (destructor)listiter_dealloc, /* tp_dealloc */
2705 0, /* tp_print */
2706 0, /* tp_getattr */
2707 0, /* tp_setattr */
2708 0, /* tp_reserved */
2709 0, /* tp_repr */
2710 0, /* tp_as_number */
2711 0, /* tp_as_sequence */
2712 0, /* tp_as_mapping */
2713 0, /* tp_hash */
2714 0, /* tp_call */
2715 0, /* tp_str */
2716 PyObject_GenericGetAttr, /* tp_getattro */
2717 0, /* tp_setattro */
2718 0, /* tp_as_buffer */
2719 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2720 0, /* tp_doc */
2721 (traverseproc)listiter_traverse, /* tp_traverse */
2722 0, /* tp_clear */
2723 0, /* tp_richcompare */
2724 0, /* tp_weaklistoffset */
2725 PyObject_SelfIter, /* tp_iter */
2726 (iternextfunc)listiter_next, /* tp_iternext */
2727 listiter_methods, /* tp_methods */
2728 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002729};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002730
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002731
2732static PyObject *
2733list_iter(PyObject *seq)
2734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 listiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 if (!PyList_Check(seq)) {
2738 PyErr_BadInternalCall();
2739 return NULL;
2740 }
2741 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2742 if (it == NULL)
2743 return NULL;
2744 it->it_index = 0;
2745 Py_INCREF(seq);
2746 it->it_seq = (PyListObject *)seq;
2747 _PyObject_GC_TRACK(it);
2748 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002749}
2750
2751static void
2752listiter_dealloc(listiterobject *it)
2753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 _PyObject_GC_UNTRACK(it);
2755 Py_XDECREF(it->it_seq);
2756 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002757}
2758
2759static int
2760listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 Py_VISIT(it->it_seq);
2763 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002764}
2765
2766static PyObject *
2767listiter_next(listiterobject *it)
2768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 PyListObject *seq;
2770 PyObject *item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 assert(it != NULL);
2773 seq = it->it_seq;
2774 if (seq == NULL)
2775 return NULL;
2776 assert(PyList_Check(seq));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 if (it->it_index < PyList_GET_SIZE(seq)) {
2779 item = PyList_GET_ITEM(seq, it->it_index);
2780 ++it->it_index;
2781 Py_INCREF(item);
2782 return item;
2783 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 Py_DECREF(seq);
2786 it->it_seq = NULL;
2787 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002788}
2789
2790static PyObject *
2791listiter_len(listiterobject *it)
2792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 Py_ssize_t len;
2794 if (it->it_seq) {
2795 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2796 if (len >= 0)
2797 return PyLong_FromSsize_t(len);
2798 }
2799 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002800}
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002801
2802static PyObject *
2803listiter_reduce(listiterobject *it)
2804{
2805 return listiter_reduce_general(it, 1);
2806}
2807
2808static PyObject *
2809listiter_setstate(listiterobject *it, PyObject *state)
2810{
Victor Stinner7660b882013-06-24 23:59:24 +02002811 Py_ssize_t index = PyLong_AsSsize_t(state);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002812 if (index == -1 && PyErr_Occurred())
2813 return NULL;
2814 if (it->it_seq != NULL) {
2815 if (index < 0)
2816 index = 0;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002817 else if (index > PyList_GET_SIZE(it->it_seq))
2818 index = PyList_GET_SIZE(it->it_seq); /* iterator exhausted */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002819 it->it_index = index;
2820 }
2821 Py_RETURN_NONE;
2822}
2823
Raymond Hettinger1021c442003-11-07 15:38:09 +00002824/*********************** List Reverse Iterator **************************/
2825
2826typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 PyObject_HEAD
2828 Py_ssize_t it_index;
2829 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002830} listreviterobject;
2831
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002832static PyObject *list_reversed(PyListObject *, PyObject *);
2833static void listreviter_dealloc(listreviterobject *);
2834static int listreviter_traverse(listreviterobject *, visitproc, void *);
2835static PyObject *listreviter_next(listreviterobject *);
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002836static PyObject *listreviter_len(listreviterobject *);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002837static PyObject *listreviter_reduce(listreviterobject *);
2838static PyObject *listreviter_setstate(listreviterobject *, PyObject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002839
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002840static PyMethodDef listreviter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002842 {"__reduce__", (PyCFunction)listreviter_reduce, METH_NOARGS, reduce_doc},
2843 {"__setstate__", (PyCFunction)listreviter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 {NULL, NULL} /* sentinel */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002845};
2846
Raymond Hettinger1021c442003-11-07 15:38:09 +00002847PyTypeObject PyListRevIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2849 "list_reverseiterator", /* tp_name */
2850 sizeof(listreviterobject), /* tp_basicsize */
2851 0, /* tp_itemsize */
2852 /* methods */
2853 (destructor)listreviter_dealloc, /* tp_dealloc */
2854 0, /* tp_print */
2855 0, /* tp_getattr */
2856 0, /* tp_setattr */
2857 0, /* tp_reserved */
2858 0, /* tp_repr */
2859 0, /* tp_as_number */
2860 0, /* tp_as_sequence */
2861 0, /* tp_as_mapping */
2862 0, /* tp_hash */
2863 0, /* tp_call */
2864 0, /* tp_str */
2865 PyObject_GenericGetAttr, /* tp_getattro */
2866 0, /* tp_setattro */
2867 0, /* tp_as_buffer */
2868 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2869 0, /* tp_doc */
2870 (traverseproc)listreviter_traverse, /* tp_traverse */
2871 0, /* tp_clear */
2872 0, /* tp_richcompare */
2873 0, /* tp_weaklistoffset */
2874 PyObject_SelfIter, /* tp_iter */
2875 (iternextfunc)listreviter_next, /* tp_iternext */
2876 listreviter_methods, /* tp_methods */
2877 0,
Raymond Hettinger1021c442003-11-07 15:38:09 +00002878};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002879
2880static PyObject *
2881list_reversed(PyListObject *seq, PyObject *unused)
2882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 listreviterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2886 if (it == NULL)
2887 return NULL;
2888 assert(PyList_Check(seq));
2889 it->it_index = PyList_GET_SIZE(seq) - 1;
2890 Py_INCREF(seq);
2891 it->it_seq = seq;
2892 PyObject_GC_Track(it);
2893 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002894}
2895
2896static void
2897listreviter_dealloc(listreviterobject *it)
2898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 PyObject_GC_UnTrack(it);
2900 Py_XDECREF(it->it_seq);
2901 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002902}
2903
2904static int
2905listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 Py_VISIT(it->it_seq);
2908 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002909}
2910
2911static PyObject *
2912listreviter_next(listreviterobject *it)
2913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 PyObject *item;
2915 Py_ssize_t index = it->it_index;
2916 PyListObject *seq = it->it_seq;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2919 item = PyList_GET_ITEM(seq, index);
2920 it->it_index--;
2921 Py_INCREF(item);
2922 return item;
2923 }
2924 it->it_index = -1;
2925 if (seq != NULL) {
2926 it->it_seq = NULL;
2927 Py_DECREF(seq);
2928 }
2929 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002930}
2931
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002932static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002933listreviter_len(listreviterobject *it)
2934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 Py_ssize_t len = it->it_index + 1;
2936 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2937 len = 0;
2938 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002939}
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002940
2941static PyObject *
2942listreviter_reduce(listreviterobject *it)
2943{
2944 return listiter_reduce_general(it, 0);
2945}
2946
2947static PyObject *
2948listreviter_setstate(listreviterobject *it, PyObject *state)
2949{
2950 Py_ssize_t index = PyLong_AsSsize_t(state);
2951 if (index == -1 && PyErr_Occurred())
2952 return NULL;
2953 if (it->it_seq != NULL) {
2954 if (index < -1)
2955 index = -1;
2956 else if (index > PyList_GET_SIZE(it->it_seq) - 1)
2957 index = PyList_GET_SIZE(it->it_seq) - 1;
2958 it->it_index = index;
2959 }
2960 Py_RETURN_NONE;
2961}
2962
2963/* common pickling support */
2964
2965static PyObject *
2966listiter_reduce_general(void *_it, int forward)
2967{
2968 PyObject *list;
2969
2970 /* the objects are not the same, index is of different types! */
2971 if (forward) {
2972 listiterobject *it = (listiterobject *)_it;
2973 if (it->it_seq)
Victor Stinner7660b882013-06-24 23:59:24 +02002974 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002975 it->it_seq, it->it_index);
2976 } else {
2977 listreviterobject *it = (listreviterobject *)_it;
2978 if (it->it_seq)
Antoine Pitroua7013882012-04-05 00:04:20 +02002979 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("reversed"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002980 it->it_seq, it->it_index);
2981 }
2982 /* empty iterator, create an empty list */
2983 list = PyList_New(0);
2984 if (list == NULL)
2985 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02002986 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002987}