blob: 05dddfc6d7ccb3f40b4c7ce82466b42ef284631c [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 */
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -070052 if (new_allocated > SIZE_MAX - newsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 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;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -070062 if (new_allocated <= (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{
Serhiy Storchaka7e160ce2016-07-03 21:03:53 +030085 PyObject *xoptions, *value;
86 _Py_IDENTIFIER(showalloccount);
87
88 xoptions = PySys_GetXOptions();
89 if (xoptions == NULL)
90 return;
91 value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
92 if (value != Py_True)
93 return;
94
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
96 count_alloc);
97 fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
98 "d\n", count_reuse);
99 fprintf(stderr, "%.2f%% reuse rate\n\n",
100 (100.0*count_reuse/(count_alloc+count_reuse)));
Christian Heimes77c02eb2008-02-09 02:18:51 +0000101}
102#endif
103
Raymond Hettinger0468e412004-05-05 05:37:53 +0000104/* Empty list reuse scheme to save calls to malloc and free */
Christian Heimes2202f872008-02-06 14:31:34 +0000105#ifndef PyList_MAXFREELIST
106#define PyList_MAXFREELIST 80
107#endif
108static PyListObject *free_list[PyList_MAXFREELIST];
109static int numfree = 0;
Raymond Hettinger0468e412004-05-05 05:37:53 +0000110
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100111int
112PyList_ClearFreeList(void)
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 PyListObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100115 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 while (numfree) {
117 op = free_list[--numfree];
118 assert(PyList_CheckExact(op));
119 PyObject_GC_Del(op);
120 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100121 return ret;
122}
123
124void
125PyList_Fini(void)
126{
127 PyList_ClearFreeList();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000128}
129
David Malcolm49526f42012-06-22 14:55:41 -0400130/* Print summary info about the state of the optimized allocator */
131void
132_PyList_DebugMallocStats(FILE *out)
133{
134 _PyDebugAllocatorStats(out,
135 "free PyListObject",
136 numfree, sizeof(PyListObject));
137}
138
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000140PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 PyListObject *op;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000143#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 static int initialized = 0;
145 if (!initialized) {
146 Py_AtExit(show_alloc);
147 initialized = 1;
148 }
Christian Heimes77c02eb2008-02-09 02:18:51 +0000149#endif
Tim Peters3986d4e2004-07-29 02:28:42 +0000150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 if (size < 0) {
152 PyErr_BadInternalCall();
153 return NULL;
154 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 if (numfree) {
156 numfree--;
157 op = free_list[numfree];
158 _Py_NewReference((PyObject *)op);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000159#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 count_reuse++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 } else {
163 op = PyObject_GC_New(PyListObject, &PyList_Type);
164 if (op == NULL)
165 return NULL;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000166#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 count_alloc++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 }
170 if (size <= 0)
171 op->ob_item = NULL;
172 else {
Mark Dickinson5d132382016-08-21 08:55:15 +0100173 op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 if (op->ob_item == NULL) {
175 Py_DECREF(op);
176 return PyErr_NoMemory();
177 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 }
179 Py_SIZE(op) = size;
180 op->allocated = size;
181 _PyObject_GC_TRACK(op);
182 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183}
184
Martin v. Löwis18e16552006-02-15 17:27:45 +0000185Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000186PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 if (!PyList_Check(op)) {
189 PyErr_BadInternalCall();
190 return -1;
191 }
192 else
193 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194}
195
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000196static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000197
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000199PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 if (!PyList_Check(op)) {
202 PyErr_BadInternalCall();
203 return NULL;
204 }
205 if (i < 0 || i >= Py_SIZE(op)) {
206 if (indexerr == NULL) {
207 indexerr = PyUnicode_FromString(
208 "list index out of range");
209 if (indexerr == NULL)
210 return NULL;
211 }
212 PyErr_SetObject(PyExc_IndexError, indexerr);
213 return NULL;
214 }
215 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216}
217
218int
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200219PyList_SetItem(PyObject *op, Py_ssize_t i,
220 PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200222 PyObject **p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (!PyList_Check(op)) {
224 Py_XDECREF(newitem);
225 PyErr_BadInternalCall();
226 return -1;
227 }
228 if (i < 0 || i >= Py_SIZE(op)) {
229 Py_XDECREF(newitem);
230 PyErr_SetString(PyExc_IndexError,
231 "list assignment index out of range");
232 return -1;
233 }
234 p = ((PyListObject *)op) -> ob_item + i;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300235 Py_XSETREF(*p, newitem);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 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
Raymond Hettinger0dceb912016-01-25 10:33:30 -0800254 if (list_resize(self, n+1) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 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
Raymond Hettinger0dceb912016-01-25 10:33:30 -0800294 if (list_resize(self, n+1) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 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)
Martin Panterb93d8632016-07-25 02:39:20 +0000484 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 return PyErr_NoMemory();
Martin Panterb93d8632016-07-25 02:39:20 +0000486 size = Py_SIZE(a) + Py_SIZE(b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 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 *);
Benjamin Peterson5a7d9232016-09-06 17:58:25 -0700637 /* If norig == 0, item might be NULL, in which case we may not memcpy from it. */
638 if (s) {
639 if (s > sizeof(recycle_on_stack)) {
640 recycle = (PyObject **)PyMem_MALLOC(s);
641 if (recycle == NULL) {
642 PyErr_NoMemory();
643 goto Error;
644 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 }
Benjamin Peterson5a7d9232016-09-06 17:58:25 -0700646 memcpy(recycle, &item[ilow], s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 }
Tim Peters8d9eb102004-07-31 02:24:20 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (d < 0) { /* Delete -d items */
Victor Stinner2c40f642013-07-19 23:06:21 +0200650 Py_ssize_t tail;
651 tail = (Py_SIZE(a) - ihigh) * sizeof(PyObject *);
652 memmove(&item[ihigh+d], &item[ihigh], tail);
653 if (list_resize(a, Py_SIZE(a) + d) < 0) {
654 memmove(&item[ihigh], &item[ihigh+d], tail);
655 memcpy(&item[ilow], recycle, s);
656 goto Error;
657 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 item = a->ob_item;
659 }
660 else if (d > 0) { /* Insert d items */
661 k = Py_SIZE(a);
662 if (list_resize(a, k+d) < 0)
663 goto Error;
664 item = a->ob_item;
665 memmove(&item[ihigh+d], &item[ihigh],
666 (k - ihigh)*sizeof(PyObject *));
667 }
668 for (k = 0; k < n; k++, ilow++) {
669 PyObject *w = vitem[k];
670 Py_XINCREF(w);
671 item[ilow] = w;
672 }
673 for (k = norig - 1; k >= 0; --k)
674 Py_XDECREF(recycle[k]);
675 result = 0;
Tim Peters8d9eb102004-07-31 02:24:20 +0000676 Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (recycle != recycle_on_stack)
678 PyMem_FREE(recycle);
679 Py_XDECREF(v_as_SF);
680 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000681#undef b
682}
683
Guido van Rossum234f9421993-06-17 12:35:49 +0000684int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000685PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 if (!PyList_Check(a)) {
688 PyErr_BadInternalCall();
689 return -1;
690 }
691 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000692}
693
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000694static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000695list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 PyObject **items;
698 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000699
700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 size = PyList_GET_SIZE(self);
702 if (size == 0 || n == 1) {
703 Py_INCREF(self);
704 return (PyObject *)self;
705 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 if (n < 1) {
708 (void)list_clear(self);
709 Py_INCREF(self);
710 return (PyObject *)self;
711 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 if (size > PY_SSIZE_T_MAX / n) {
714 return PyErr_NoMemory();
715 }
Christian Heimesaf98da12008-01-27 15:18:18 +0000716
Raymond Hettinger0dceb912016-01-25 10:33:30 -0800717 if (list_resize(self, size*n) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 return NULL;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 p = size;
721 items = self->ob_item;
722 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
723 for (j = 0; j < size; j++) {
724 PyObject *o = items[j];
725 Py_INCREF(o);
726 items[p++] = o;
727 }
728 }
729 Py_INCREF(self);
730 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000731}
732
Guido van Rossum4a450d01991-04-03 19:05:18 +0000733static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000734list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 if (i < 0 || i >= Py_SIZE(a)) {
737 PyErr_SetString(PyExc_IndexError,
738 "list assignment index out of range");
739 return -1;
740 }
741 if (v == NULL)
742 return list_ass_slice(a, i, i+1, v);
743 Py_INCREF(v);
Serhiy Storchakaf01e4082016-04-10 18:12:01 +0300744 Py_SETREF(a->ob_item[i], v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 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);
Martin Panter94b39ce2017-01-14 06:30:37 +0000807 /* It should not be possible to allocate a list large enough to cause
808 an overflow on any relevant platform */
809 assert(m < PY_SSIZE_T_MAX - n);
Raymond Hettinger0dceb912016-01-25 10:33:30 -0800810 if (list_resize(self, m + n) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 Py_DECREF(b);
812 return NULL;
813 }
814 /* note that we may still have self == b here for the
815 * situation a.extend(a), but the following code works
816 * in that case too. Just make sure to resize self
817 * before calling PySequence_Fast_ITEMS.
818 */
819 /* populate the end of self with b's items */
820 src = PySequence_Fast_ITEMS(b);
821 dest = self->ob_item + m;
822 for (i = 0; i < n; i++) {
823 PyObject *o = src[i];
824 Py_INCREF(o);
825 dest[i] = o;
826 }
827 Py_DECREF(b);
828 Py_RETURN_NONE;
829 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 it = PyObject_GetIter(b);
832 if (it == NULL)
833 return NULL;
834 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 /* Guess a result list size. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200837 n = PyObject_LengthHint(b, 8);
Raymond Hettinger0dceb912016-01-25 10:33:30 -0800838 if (n < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 Py_DECREF(it);
840 return NULL;
841 }
842 m = Py_SIZE(self);
Martin Panterb93d8632016-07-25 02:39:20 +0000843 if (m > PY_SSIZE_T_MAX - n) {
844 /* m + n overflowed; on the chance that n lied, and there really
845 * is enough room, ignore it. If n was telling the truth, we'll
846 * eventually run out of memory during the loop.
847 */
848 }
849 else {
850 mn = m + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 /* Make room. */
Raymond Hettinger0dceb912016-01-25 10:33:30 -0800852 if (list_resize(self, mn) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 goto error;
854 /* Make the list sane again. */
855 Py_SIZE(self) = m;
856 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 /* Run iterator to exhaustion. */
859 for (;;) {
860 PyObject *item = iternext(it);
861 if (item == NULL) {
862 if (PyErr_Occurred()) {
863 if (PyErr_ExceptionMatches(PyExc_StopIteration))
864 PyErr_Clear();
865 else
866 goto error;
867 }
868 break;
869 }
870 if (Py_SIZE(self) < self->allocated) {
871 /* steals ref */
872 PyList_SET_ITEM(self, Py_SIZE(self), item);
873 ++Py_SIZE(self);
874 }
875 else {
876 int status = app1(self, item);
877 Py_DECREF(item); /* append creates a new ref */
878 if (status < 0)
879 goto error;
880 }
881 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 /* Cut back result list if initial guess was too large. */
Victor Stinner32fd6ea2013-07-16 21:45:58 +0200884 if (Py_SIZE(self) < self->allocated) {
885 if (list_resize(self, Py_SIZE(self)) < 0)
886 goto error;
887 }
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 Py_DECREF(it);
890 Py_RETURN_NONE;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000891
892 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 Py_DECREF(it);
894 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000895}
896
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000897PyObject *
898_PyList_Extend(PyListObject *self, PyObject *b)
899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 return listextend(self, b);
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000901}
902
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000903static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000904list_inplace_concat(PyListObject *self, PyObject *other)
905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 PyObject *result;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 result = listextend(self, other);
909 if (result == NULL)
910 return result;
911 Py_DECREF(result);
912 Py_INCREF(self);
913 return (PyObject *)self;
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000914}
915
916static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000917listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 Py_ssize_t i = -1;
920 PyObject *v;
921 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 if (!PyArg_ParseTuple(args, "|n:pop", &i))
924 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 if (Py_SIZE(self) == 0) {
927 /* Special-case most common failure cause */
928 PyErr_SetString(PyExc_IndexError, "pop from empty list");
929 return NULL;
930 }
931 if (i < 0)
932 i += Py_SIZE(self);
933 if (i < 0 || i >= Py_SIZE(self)) {
934 PyErr_SetString(PyExc_IndexError, "pop index out of range");
935 return NULL;
936 }
937 v = self->ob_item[i];
938 if (i == Py_SIZE(self) - 1) {
939 status = list_resize(self, Py_SIZE(self) - 1);
Victor Stinnerb27cd3e2013-07-08 22:20:44 +0200940 if (status >= 0)
941 return v; /* and v now owns the reference the list had */
942 else
943 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 }
945 Py_INCREF(v);
946 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
Victor Stinner095d99f2013-07-17 21:58:01 +0200947 if (status < 0) {
948 Py_DECREF(v);
949 return NULL;
950 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000952}
953
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000954/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
955static void
956reverse_slice(PyObject **lo, PyObject **hi)
957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 assert(lo && hi);
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 --hi;
961 while (lo < hi) {
962 PyObject *t = *lo;
963 *lo = *hi;
964 *hi = t;
965 ++lo;
966 --hi;
967 }
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000968}
969
Tim Petersa64dc242002-08-01 02:13:36 +0000970/* Lots of code for an adaptive, stable, natural mergesort. There are many
971 * pieces to this algorithm; read listsort.txt for overviews and details.
972 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000973
Daniel Stutzbach98338222010-12-02 21:55:33 +0000974/* A sortslice contains a pointer to an array of keys and a pointer to
975 * an array of corresponding values. In other words, keys[i]
976 * corresponds with values[i]. If values == NULL, then the keys are
977 * also the values.
978 *
979 * Several convenience routines are provided here, so that keys and
980 * values are always moved in sync.
981 */
982
983typedef struct {
984 PyObject **keys;
985 PyObject **values;
986} sortslice;
987
988Py_LOCAL_INLINE(void)
989sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
990{
991 s1->keys[i] = s2->keys[j];
992 if (s1->values != NULL)
993 s1->values[i] = s2->values[j];
994}
995
996Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +0000997sortslice_copy_incr(sortslice *dst, sortslice *src)
998{
Daniel Stutzbach98338222010-12-02 21:55:33 +0000999 *dst->keys++ = *src->keys++;
1000 if (dst->values != NULL)
1001 *dst->values++ = *src->values++;
1002}
1003
1004Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001005sortslice_copy_decr(sortslice *dst, sortslice *src)
1006{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001007 *dst->keys-- = *src->keys--;
1008 if (dst->values != NULL)
1009 *dst->values-- = *src->values--;
1010}
1011
1012
1013Py_LOCAL_INLINE(void)
1014sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001015 Py_ssize_t n)
1016{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001017 memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1018 if (s1->values != NULL)
1019 memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1020}
1021
1022Py_LOCAL_INLINE(void)
1023sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001024 Py_ssize_t n)
1025{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001026 memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1027 if (s1->values != NULL)
1028 memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1029}
1030
1031Py_LOCAL_INLINE(void)
Benjamin Peterson9efdcca2010-12-03 01:44:10 +00001032sortslice_advance(sortslice *slice, Py_ssize_t n)
1033{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001034 slice->keys += n;
1035 if (slice->values != NULL)
1036 slice->values += n;
1037}
1038
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001039/* Comparison function: PyObject_RichCompareBool with Py_LT.
Tim Petersa64dc242002-08-01 02:13:36 +00001040 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1041 */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001042
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001043#define ISLT(X, Y) (PyObject_RichCompareBool(X, Y, Py_LT))
Tim Peters66860f62002-08-04 17:47:26 +00001044
1045/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +00001046 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
1047 started. It makes more sense in context <wink>. X and Y are PyObject*s.
1048*/
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001049#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001051
1052/* binarysort is the best method for sorting small arrays: it does
1053 few compares, but can do data movement quadratic in the number of
1054 elements.
Guido van Rossum42812581998-06-17 14:15:44 +00001055 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +00001056 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001057 On entry, must have lo <= start <= hi, and that [lo, start) is already
1058 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +00001059 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001060 Even in case of error, the output slice will be some permutation of
1061 the input (nothing is lost or duplicated).
1062*/
Guido van Rossum3f236de1996-12-10 23:55:39 +00001063static int
Daniel Stutzbach98338222010-12-02 21:55:33 +00001064binarysort(sortslice lo, PyObject **hi, PyObject **start)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001065{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001066 Py_ssize_t k;
1067 PyObject **l, **p, **r;
1068 PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001069
Daniel Stutzbach98338222010-12-02 21:55:33 +00001070 assert(lo.keys <= start && start <= hi);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 /* assert [lo, start) is sorted */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001072 if (lo.keys == start)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 ++start;
1074 for (; start < hi; ++start) {
1075 /* set l to where *start belongs */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001076 l = lo.keys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 r = start;
1078 pivot = *r;
1079 /* Invariants:
1080 * pivot >= all in [lo, l).
1081 * pivot < all in [r, start).
1082 * The second is vacuously true at the start.
1083 */
1084 assert(l < r);
1085 do {
1086 p = l + ((r - l) >> 1);
1087 IFLT(pivot, *p)
1088 r = p;
1089 else
1090 l = p+1;
1091 } while (l < r);
1092 assert(l == r);
1093 /* The invariants still hold, so pivot >= all in [lo, l) and
1094 pivot < all in [l, start), so pivot belongs at l. Note
1095 that if there are elements equal to pivot, l points to the
1096 first slot after them -- that's why this sort is stable.
1097 Slide over to make room.
1098 Caution: using memmove is much slower under MSVC 5;
1099 we're not usually moving many slots. */
1100 for (p = start; p > l; --p)
1101 *p = *(p-1);
1102 *l = pivot;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001103 if (lo.values != NULL) {
1104 Py_ssize_t offset = lo.values - lo.keys;
1105 p = start + offset;
1106 pivot = *p;
1107 l += offset;
1108 for (p = start + offset; p > l; --p)
1109 *p = *(p-1);
1110 *l = pivot;
1111 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 }
1113 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001114
1115 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001117}
1118
Tim Petersa64dc242002-08-01 02:13:36 +00001119/*
1120Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1121is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001122
Tim Petersa64dc242002-08-01 02:13:36 +00001123 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001124
Tim Petersa64dc242002-08-01 02:13:36 +00001125or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001126
Tim Petersa64dc242002-08-01 02:13:36 +00001127 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001128
Tim Petersa64dc242002-08-01 02:13:36 +00001129Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1130For its intended use in a stable mergesort, the strictness of the defn of
1131"descending" is needed so that the caller can safely reverse a descending
1132sequence without violating stability (strict > ensures there are no equal
1133elements to get out of order).
1134
1135Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001136*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001137static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001138count_run(PyObject **lo, PyObject **hi, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 Py_ssize_t k;
1141 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 assert(lo < hi);
1144 *descending = 0;
1145 ++lo;
1146 if (lo == hi)
1147 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 n = 2;
1150 IFLT(*lo, *(lo-1)) {
1151 *descending = 1;
1152 for (lo = lo+1; lo < hi; ++lo, ++n) {
1153 IFLT(*lo, *(lo-1))
1154 ;
1155 else
1156 break;
1157 }
1158 }
1159 else {
1160 for (lo = lo+1; lo < hi; ++lo, ++n) {
1161 IFLT(*lo, *(lo-1))
1162 break;
1163 }
1164 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 return n;
Tim Petersa64dc242002-08-01 02:13:36 +00001167fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001169}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001170
Tim Petersa64dc242002-08-01 02:13:36 +00001171/*
1172Locate the proper position of key in a sorted vector; if the vector contains
1173an element equal to key, return the position immediately to the left of
1174the leftmost equal element. [gallop_right() does the same except returns
1175the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001176
Tim Petersa64dc242002-08-01 02:13:36 +00001177"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001178
Tim Petersa64dc242002-08-01 02:13:36 +00001179"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1180hint is to the final result, the faster this runs.
1181
1182The return value is the int k in 0..n such that
1183
1184 a[k-1] < key <= a[k]
1185
1186pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1187key belongs at index k; or, IOW, the first k elements of a should precede
1188key, and the last n-k should follow key.
1189
1190Returns -1 on error. See listsort.txt for info on the method.
1191*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001192static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001193gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 Py_ssize_t ofs;
1196 Py_ssize_t lastofs;
1197 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 a += hint;
1202 lastofs = 0;
1203 ofs = 1;
1204 IFLT(*a, key) {
1205 /* a[hint] < key -- gallop right, until
1206 * a[hint + lastofs] < key <= a[hint + ofs]
1207 */
1208 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1209 while (ofs < maxofs) {
1210 IFLT(a[ofs], key) {
1211 lastofs = ofs;
1212 ofs = (ofs << 1) + 1;
1213 if (ofs <= 0) /* int overflow */
1214 ofs = maxofs;
1215 }
1216 else /* key <= a[hint + ofs] */
1217 break;
1218 }
1219 if (ofs > maxofs)
1220 ofs = maxofs;
1221 /* Translate back to offsets relative to &a[0]. */
1222 lastofs += hint;
1223 ofs += hint;
1224 }
1225 else {
1226 /* key <= a[hint] -- gallop left, until
1227 * a[hint - ofs] < key <= a[hint - lastofs]
1228 */
1229 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1230 while (ofs < maxofs) {
1231 IFLT(*(a-ofs), key)
1232 break;
1233 /* key <= a[hint - ofs] */
1234 lastofs = ofs;
1235 ofs = (ofs << 1) + 1;
1236 if (ofs <= 0) /* int overflow */
1237 ofs = maxofs;
1238 }
1239 if (ofs > maxofs)
1240 ofs = maxofs;
1241 /* Translate back to positive offsets relative to &a[0]. */
1242 k = lastofs;
1243 lastofs = hint - ofs;
1244 ofs = hint - k;
1245 }
1246 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1249 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1250 * right of lastofs but no farther right than ofs. Do a binary
1251 * search, with invariant a[lastofs-1] < key <= a[ofs].
1252 */
1253 ++lastofs;
1254 while (lastofs < ofs) {
1255 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 IFLT(a[m], key)
1258 lastofs = m+1; /* a[m] < key */
1259 else
1260 ofs = m; /* key <= a[m] */
1261 }
1262 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1263 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001264
1265fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001267}
1268
1269/*
1270Exactly like gallop_left(), except that if key already exists in a[0:n],
1271finds the position immediately to the right of the rightmost equal value.
1272
1273The return value is the int k in 0..n such that
1274
1275 a[k-1] <= key < a[k]
1276
1277or -1 if error.
1278
1279The code duplication is massive, but this is enough different given that
1280we're sticking to "<" comparisons that it's much harder to follow if
1281written as one routine with yet another "left or right?" flag.
1282*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001283static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001284gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 Py_ssize_t ofs;
1287 Py_ssize_t lastofs;
1288 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 assert(key && a && n > 0 && hint >= 0 && hint < n);
Tim Petersa64dc242002-08-01 02:13:36 +00001291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 a += hint;
1293 lastofs = 0;
1294 ofs = 1;
1295 IFLT(key, *a) {
1296 /* key < a[hint] -- gallop left, until
1297 * a[hint - ofs] <= key < a[hint - lastofs]
1298 */
1299 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1300 while (ofs < maxofs) {
1301 IFLT(key, *(a-ofs)) {
1302 lastofs = ofs;
1303 ofs = (ofs << 1) + 1;
1304 if (ofs <= 0) /* int overflow */
1305 ofs = maxofs;
1306 }
1307 else /* a[hint - ofs] <= key */
1308 break;
1309 }
1310 if (ofs > maxofs)
1311 ofs = maxofs;
1312 /* Translate back to positive offsets relative to &a[0]. */
1313 k = lastofs;
1314 lastofs = hint - ofs;
1315 ofs = hint - k;
1316 }
1317 else {
1318 /* a[hint] <= key -- gallop right, until
1319 * a[hint + lastofs] <= key < a[hint + ofs]
1320 */
1321 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1322 while (ofs < maxofs) {
1323 IFLT(key, a[ofs])
1324 break;
1325 /* a[hint + ofs] <= key */
1326 lastofs = ofs;
1327 ofs = (ofs << 1) + 1;
1328 if (ofs <= 0) /* int overflow */
1329 ofs = maxofs;
1330 }
1331 if (ofs > maxofs)
1332 ofs = maxofs;
1333 /* Translate back to offsets relative to &a[0]. */
1334 lastofs += hint;
1335 ofs += hint;
1336 }
1337 a -= hint;
Tim Petersa64dc242002-08-01 02:13:36 +00001338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1340 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1341 * right of lastofs but no farther right than ofs. Do a binary
1342 * search, with invariant a[lastofs-1] <= key < a[ofs].
1343 */
1344 ++lastofs;
1345 while (lastofs < ofs) {
1346 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 IFLT(key, a[m])
1349 ofs = m; /* key < a[m] */
1350 else
1351 lastofs = m+1; /* a[m] <= key */
1352 }
1353 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1354 return ofs;
Tim Petersa64dc242002-08-01 02:13:36 +00001355
1356fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001358}
1359
1360/* The maximum number of entries in a MergeState's pending-runs stack.
1361 * This is enough to sort arrays of size up to about
1362 * 32 * phi ** MAX_MERGE_PENDING
1363 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1364 * with 2**64 elements.
1365 */
1366#define MAX_MERGE_PENDING 85
1367
Tim Peterse05f65a2002-08-10 05:21:15 +00001368/* When we get into galloping mode, we stay there until both runs win less
1369 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001370 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001371#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001372
1373/* Avoid malloc for small temp arrays. */
1374#define MERGESTATE_TEMP_SIZE 256
1375
1376/* One MergeState exists on the stack per invocation of mergesort. It's just
1377 * a convenient way to pass state around among the helper functions.
1378 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001379struct s_slice {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001380 sortslice base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001382};
1383
Tim Petersa64dc242002-08-01 02:13:36 +00001384typedef struct s_MergeState {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 /* This controls when we get *into* galloping mode. It's initialized
1386 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1387 * random data, and lower for highly structured data.
1388 */
1389 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 /* 'a' is temp storage to help with merges. It contains room for
1392 * alloced entries.
1393 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001394 sortslice a; /* may point to temparray below */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 /* A stack of n pending runs yet to be merged. Run #i starts at
1398 * address base[i] and extends for len[i] elements. It's always
1399 * true (so long as the indices are in bounds) that
1400 *
1401 * pending[i].base + pending[i].len == pending[i+1].base
1402 *
1403 * so we could cut the storage for this, but it's a minor amount,
1404 * and keeping all the info explicit simplifies the code.
1405 */
1406 int n;
1407 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 /* 'a' points to this when possible, rather than muck with malloc. */
1410 PyObject *temparray[MERGESTATE_TEMP_SIZE];
Tim Petersa64dc242002-08-01 02:13:36 +00001411} MergeState;
1412
1413/* Conceptually a MergeState's constructor. */
1414static void
Victor Stinner0fcab4a2011-01-04 12:59:15 +00001415merge_init(MergeState *ms, Py_ssize_t list_size, int has_keyfunc)
Tim Petersa64dc242002-08-01 02:13:36 +00001416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001418 if (has_keyfunc) {
1419 /* The temporary space for merging will need at most half the list
1420 * size rounded up. Use the minimum possible space so we can use the
1421 * rest of temparray for other things. In particular, if there is
1422 * enough extra space, listsort() will use it to store the keys.
1423 */
1424 ms->alloced = (list_size + 1) / 2;
1425
1426 /* ms->alloced describes how many keys will be stored at
1427 ms->temparray, but we also need to store the values. Hence,
1428 ms->alloced is capped at half of MERGESTATE_TEMP_SIZE. */
1429 if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
1430 ms->alloced = MERGESTATE_TEMP_SIZE / 2;
1431 ms->a.values = &ms->temparray[ms->alloced];
1432 }
1433 else {
1434 ms->alloced = MERGESTATE_TEMP_SIZE;
1435 ms->a.values = NULL;
1436 }
1437 ms->a.keys = ms->temparray;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 ms->n = 0;
1439 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001440}
1441
1442/* Free all the temp memory owned by the MergeState. This must be called
1443 * when you're done with a MergeState, and may be called before then if
1444 * you want to free the temp memory early.
1445 */
1446static void
1447merge_freemem(MergeState *ms)
1448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 assert(ms != NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001450 if (ms->a.keys != ms->temparray)
1451 PyMem_Free(ms->a.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001452}
1453
1454/* Ensure enough temp memory for 'need' array slots is available.
1455 * Returns 0 on success and -1 if the memory can't be gotten.
1456 */
1457static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001458merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001459{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001460 int multiplier;
1461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 assert(ms != NULL);
1463 if (need <= ms->alloced)
1464 return 0;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001465
1466 multiplier = ms->a.values != NULL ? 2 : 1;
1467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 /* Don't realloc! That can cost cycles to copy the old data, but
1469 * we don't care what's in the block.
1470 */
1471 merge_freemem(ms);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001472 if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*) / multiplier) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 PyErr_NoMemory();
1474 return -1;
1475 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001476 ms->a.keys = (PyObject**)PyMem_Malloc(multiplier * need
1477 * sizeof(PyObject *));
1478 if (ms->a.keys != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 ms->alloced = need;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001480 if (ms->a.values != NULL)
1481 ms->a.values = &ms->a.keys[need];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 return 0;
1483 }
1484 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 return -1;
Tim Petersa64dc242002-08-01 02:13:36 +00001486}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1488 merge_getmem(MS, NEED))
Tim Petersa64dc242002-08-01 02:13:36 +00001489
Daniel Stutzbach98338222010-12-02 21:55:33 +00001490/* Merge the na elements starting at ssa with the nb elements starting at
1491 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1492 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1493 * should have na <= nb. See listsort.txt for more info. Return 0 if
1494 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001495 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001496static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001497merge_lo(MergeState *ms, sortslice ssa, Py_ssize_t na,
1498 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001499{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001501 sortslice dest;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 int result = -1; /* guilty until proved innocent */
1503 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001504
Daniel Stutzbach98338222010-12-02 21:55:33 +00001505 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1506 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 if (MERGE_GETMEM(ms, na) < 0)
1508 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001509 sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
1510 dest = ssa;
1511 ssa = ms->a;
Tim Petersa64dc242002-08-01 02:13:36 +00001512
Daniel Stutzbach98338222010-12-02 21:55:33 +00001513 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 --nb;
1515 if (nb == 0)
1516 goto Succeed;
1517 if (na == 1)
1518 goto CopyB;
Tim Petersa64dc242002-08-01 02:13:36 +00001519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 min_gallop = ms->min_gallop;
1521 for (;;) {
1522 Py_ssize_t acount = 0; /* # of times A won in a row */
1523 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 /* Do the straightforward thing until (if ever) one run
1526 * appears to win consistently.
1527 */
1528 for (;;) {
1529 assert(na > 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001530 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 if (k) {
1532 if (k < 0)
1533 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001534 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 ++bcount;
1536 acount = 0;
1537 --nb;
1538 if (nb == 0)
1539 goto Succeed;
1540 if (bcount >= min_gallop)
1541 break;
1542 }
1543 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001544 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 ++acount;
1546 bcount = 0;
1547 --na;
1548 if (na == 1)
1549 goto CopyB;
1550 if (acount >= min_gallop)
1551 break;
1552 }
1553 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 /* One run is winning so consistently that galloping may
1556 * be a huge win. So try that, and continue galloping until
1557 * (if ever) neither run appears to be winning consistently
1558 * anymore.
1559 */
1560 ++min_gallop;
1561 do {
1562 assert(na > 1 && nb > 0);
1563 min_gallop -= min_gallop > 1;
1564 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001565 k = gallop_right(ssb.keys[0], ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 acount = k;
1567 if (k) {
1568 if (k < 0)
1569 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001570 sortslice_memcpy(&dest, 0, &ssa, 0, k);
1571 sortslice_advance(&dest, k);
1572 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 na -= k;
1574 if (na == 1)
1575 goto CopyB;
1576 /* na==0 is impossible now if the comparison
1577 * function is consistent, but we can't assume
1578 * that it is.
1579 */
1580 if (na == 0)
1581 goto Succeed;
1582 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001583 sortslice_copy_incr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 --nb;
1585 if (nb == 0)
1586 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001587
Daniel Stutzbach98338222010-12-02 21:55:33 +00001588 k = gallop_left(ssa.keys[0], ssb.keys, nb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 bcount = k;
1590 if (k) {
1591 if (k < 0)
1592 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001593 sortslice_memmove(&dest, 0, &ssb, 0, k);
1594 sortslice_advance(&dest, k);
1595 sortslice_advance(&ssb, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 nb -= k;
1597 if (nb == 0)
1598 goto Succeed;
1599 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001600 sortslice_copy_incr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 --na;
1602 if (na == 1)
1603 goto CopyB;
1604 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1605 ++min_gallop; /* penalize it for leaving galloping mode */
1606 ms->min_gallop = min_gallop;
1607 }
Tim Petersa64dc242002-08-01 02:13:36 +00001608Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001610Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 if (na)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001612 sortslice_memcpy(&dest, 0, &ssa, 0, na);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001614CopyB:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 assert(na == 1 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001616 /* The last element of ssa belongs at the end of the merge. */
1617 sortslice_memmove(&dest, 0, &ssb, 0, nb);
1618 sortslice_copy(&dest, nb, &ssa, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001620}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001621
Daniel Stutzbach98338222010-12-02 21:55:33 +00001622/* Merge the na elements starting at pa with the nb elements starting at
1623 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
1624 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1625 * should have na >= nb. See listsort.txt for more info. Return 0 if
1626 * successful, -1 if error.
Tim Petersa64dc242002-08-01 02:13:36 +00001627 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001628static Py_ssize_t
Daniel Stutzbach98338222010-12-02 21:55:33 +00001629merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
1630 sortslice ssb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 Py_ssize_t k;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001633 sortslice dest, basea, baseb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 int result = -1; /* guilty until proved innocent */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001636
Daniel Stutzbach98338222010-12-02 21:55:33 +00001637 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1638 assert(ssa.keys + na == ssb.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 if (MERGE_GETMEM(ms, nb) < 0)
1640 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001641 dest = ssb;
1642 sortslice_advance(&dest, nb-1);
1643 sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
1644 basea = ssa;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 baseb = ms->a;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001646 ssb.keys = ms->a.keys + nb - 1;
1647 if (ssb.values != NULL)
1648 ssb.values = ms->a.values + nb - 1;
1649 sortslice_advance(&ssa, na - 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001650
Daniel Stutzbach98338222010-12-02 21:55:33 +00001651 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 --na;
1653 if (na == 0)
1654 goto Succeed;
1655 if (nb == 1)
1656 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 min_gallop = ms->min_gallop;
1659 for (;;) {
1660 Py_ssize_t acount = 0; /* # of times A won in a row */
1661 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 /* Do the straightforward thing until (if ever) one run
1664 * appears to win consistently.
1665 */
1666 for (;;) {
1667 assert(na > 0 && nb > 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001668 k = ISLT(ssb.keys[0], ssa.keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (k) {
1670 if (k < 0)
1671 goto Fail;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001672 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 ++acount;
1674 bcount = 0;
1675 --na;
1676 if (na == 0)
1677 goto Succeed;
1678 if (acount >= min_gallop)
1679 break;
1680 }
1681 else {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001682 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 ++bcount;
1684 acount = 0;
1685 --nb;
1686 if (nb == 1)
1687 goto CopyA;
1688 if (bcount >= min_gallop)
1689 break;
1690 }
1691 }
Tim Petersa64dc242002-08-01 02:13:36 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 /* One run is winning so consistently that galloping may
1694 * be a huge win. So try that, and continue galloping until
1695 * (if ever) neither run appears to be winning consistently
1696 * anymore.
1697 */
1698 ++min_gallop;
1699 do {
1700 assert(na > 0 && nb > 1);
1701 min_gallop -= min_gallop > 1;
1702 ms->min_gallop = min_gallop;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001703 k = gallop_right(ssb.keys[0], basea.keys, na, na-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (k < 0)
1705 goto Fail;
1706 k = na - k;
1707 acount = k;
1708 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001709 sortslice_advance(&dest, -k);
1710 sortslice_advance(&ssa, -k);
1711 sortslice_memmove(&dest, 1, &ssa, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 na -= k;
1713 if (na == 0)
1714 goto Succeed;
1715 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001716 sortslice_copy_decr(&dest, &ssb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 --nb;
1718 if (nb == 1)
1719 goto CopyA;
Tim Petersa64dc242002-08-01 02:13:36 +00001720
Daniel Stutzbach98338222010-12-02 21:55:33 +00001721 k = gallop_left(ssa.keys[0], baseb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 if (k < 0)
1723 goto Fail;
1724 k = nb - k;
1725 bcount = k;
1726 if (k) {
Daniel Stutzbach98338222010-12-02 21:55:33 +00001727 sortslice_advance(&dest, -k);
1728 sortslice_advance(&ssb, -k);
1729 sortslice_memcpy(&dest, 1, &ssb, 1, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 nb -= k;
1731 if (nb == 1)
1732 goto CopyA;
1733 /* nb==0 is impossible now if the comparison
1734 * function is consistent, but we can't assume
1735 * that it is.
1736 */
1737 if (nb == 0)
1738 goto Succeed;
1739 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001740 sortslice_copy_decr(&dest, &ssa);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 --na;
1742 if (na == 0)
1743 goto Succeed;
1744 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1745 ++min_gallop; /* penalize it for leaving galloping mode */
1746 ms->min_gallop = min_gallop;
1747 }
Tim Petersa64dc242002-08-01 02:13:36 +00001748Succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 result = 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001750Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 if (nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001752 sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 return result;
Tim Petersa64dc242002-08-01 02:13:36 +00001754CopyA:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 assert(nb == 1 && na > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001756 /* The first element of ssb belongs at the front of the merge. */
1757 sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
1758 sortslice_advance(&dest, -na);
1759 sortslice_advance(&ssa, -na);
1760 sortslice_copy(&dest, 0, &ssb, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001762}
1763
1764/* Merge the two runs at stack indices i and i+1.
1765 * Returns 0 on success, -1 on error.
1766 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001767static Py_ssize_t
1768merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001769{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001770 sortslice ssa, ssb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 Py_ssize_t na, nb;
1772 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 assert(ms != NULL);
1775 assert(ms->n >= 2);
1776 assert(i >= 0);
1777 assert(i == ms->n - 2 || i == ms->n - 3);
Tim Petersa64dc242002-08-01 02:13:36 +00001778
Daniel Stutzbach98338222010-12-02 21:55:33 +00001779 ssa = ms->pending[i].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 na = ms->pending[i].len;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001781 ssb = ms->pending[i+1].base;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 nb = ms->pending[i+1].len;
1783 assert(na > 0 && nb > 0);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001784 assert(ssa.keys + na == ssb.keys);
Tim Petersa64dc242002-08-01 02:13:36 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 /* Record the length of the combined runs; if i is the 3rd-last
1787 * run now, also slide over the last run (which isn't involved
1788 * in this merge). The current run i+1 goes away in any case.
1789 */
1790 ms->pending[i].len = na + nb;
1791 if (i == ms->n - 3)
1792 ms->pending[i+1] = ms->pending[i+2];
1793 --ms->n;
Tim Petersa64dc242002-08-01 02:13:36 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 /* Where does b start in a? Elements in a before that can be
1796 * ignored (already in place).
1797 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001798 k = gallop_right(*ssb.keys, ssa.keys, na, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 if (k < 0)
1800 return -1;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001801 sortslice_advance(&ssa, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 na -= k;
1803 if (na == 0)
1804 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 /* Where does a end in b? Elements in b after that can be
1807 * ignored (already in place).
1808 */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001809 nb = gallop_left(ssa.keys[na-1], ssb.keys, nb, nb-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 if (nb <= 0)
1811 return nb;
Tim Petersa64dc242002-08-01 02:13:36 +00001812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 /* Merge what remains of the runs, using a temp array with
1814 * min(na, nb) elements.
1815 */
1816 if (na <= nb)
Daniel Stutzbach98338222010-12-02 21:55:33 +00001817 return merge_lo(ms, ssa, na, ssb, nb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 else
Daniel Stutzbach98338222010-12-02 21:55:33 +00001819 return merge_hi(ms, ssa, na, ssb, nb);
Tim Petersa64dc242002-08-01 02:13:36 +00001820}
1821
1822/* Examine the stack of runs waiting to be merged, merging adjacent runs
1823 * until the stack invariants are re-established:
1824 *
1825 * 1. len[-3] > len[-2] + len[-1]
1826 * 2. len[-2] > len[-1]
1827 *
1828 * See listsort.txt for more info.
1829 *
1830 * Returns 0 on success, -1 on error.
1831 */
1832static int
1833merge_collapse(MergeState *ms)
1834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 assert(ms);
1838 while (ms->n > 1) {
1839 Py_ssize_t n = ms->n - 2;
Benjamin Petersonb808d592015-02-25 10:12:26 -05001840 if ((n > 0 && p[n-1].len <= p[n].len + p[n+1].len) ||
1841 (n > 1 && p[n-2].len <= p[n-1].len + p[n].len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 if (p[n-1].len < p[n+1].len)
1843 --n;
1844 if (merge_at(ms, n) < 0)
1845 return -1;
1846 }
1847 else if (p[n].len <= p[n+1].len) {
1848 if (merge_at(ms, n) < 0)
1849 return -1;
1850 }
1851 else
1852 break;
1853 }
1854 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001855}
1856
1857/* Regardless of invariants, merge all runs on the stack until only one
1858 * remains. This is used at the end of the mergesort.
1859 *
1860 * Returns 0 on success, -1 on error.
1861 */
1862static int
1863merge_force_collapse(MergeState *ms)
1864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 assert(ms);
1868 while (ms->n > 1) {
1869 Py_ssize_t n = ms->n - 2;
1870 if (n > 0 && p[n-1].len < p[n+1].len)
1871 --n;
1872 if (merge_at(ms, n) < 0)
1873 return -1;
1874 }
1875 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001876}
1877
1878/* Compute a good value for the minimum run length; natural runs shorter
1879 * than this are boosted artificially via binary insertion.
1880 *
1881 * If n < 64, return n (it's too small to bother with fancy stuff).
1882 * Else if n is an exact power of 2, return 32.
1883 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1884 * strictly less than, an exact power of 2.
1885 *
1886 * See listsort.txt for more info.
1887 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001888static Py_ssize_t
1889merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 assert(n >= 0);
1894 while (n >= 64) {
1895 r |= n & 1;
1896 n >>= 1;
1897 }
1898 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001899}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001900
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001901static void
Daniel Stutzbach98338222010-12-02 21:55:33 +00001902reverse_sortslice(sortslice *s, Py_ssize_t n)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001903{
Daniel Stutzbach98338222010-12-02 21:55:33 +00001904 reverse_slice(s->keys, &s->keys[n]);
1905 if (s->values != NULL)
1906 reverse_slice(s->values, &s->values[n]);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001907}
1908
Tim Petersa64dc242002-08-01 02:13:36 +00001909/* An adaptive, stable, natural mergesort. See listsort.txt.
1910 * Returns Py_None on success, NULL on error. Even in case of error, the
1911 * list will be some permutation of its input state (nothing is lost or
1912 * duplicated).
1913 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001914static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001915listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 MergeState ms;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 Py_ssize_t nremaining;
1919 Py_ssize_t minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00001920 sortslice lo;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 Py_ssize_t saved_ob_size, saved_allocated;
1922 PyObject **saved_ob_item;
1923 PyObject **final_ob_item;
1924 PyObject *result = NULL; /* guilty until proved innocent */
1925 int reverse = 0;
1926 PyObject *keyfunc = NULL;
1927 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 static char *kwlist[] = {"key", "reverse", 0};
Daniel Stutzbach98338222010-12-02 21:55:33 +00001929 PyObject **keys;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 assert(self != NULL);
1932 assert (PyList_Check(self));
1933 if (args != NULL) {
1934 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1935 kwlist, &keyfunc, &reverse))
1936 return NULL;
1937 if (Py_SIZE(args) > 0) {
1938 PyErr_SetString(PyExc_TypeError,
1939 "must use keyword argument for key function");
1940 return NULL;
1941 }
1942 }
1943 if (keyfunc == Py_None)
1944 keyfunc = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 /* The list is temporarily made empty, so that mutations performed
1947 * by comparison functions can't affect the slice of memory we're
1948 * sorting (allowing mutations during sorting is a core-dump
1949 * factory, since ob_item may change).
1950 */
1951 saved_ob_size = Py_SIZE(self);
1952 saved_ob_item = self->ob_item;
1953 saved_allocated = self->allocated;
1954 Py_SIZE(self) = 0;
1955 self->ob_item = NULL;
1956 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00001957
Daniel Stutzbach98338222010-12-02 21:55:33 +00001958 if (keyfunc == NULL) {
1959 keys = NULL;
1960 lo.keys = saved_ob_item;
1961 lo.values = NULL;
1962 }
1963 else {
1964 if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
1965 /* Leverage stack space we allocated but won't otherwise use */
1966 keys = &ms.temparray[saved_ob_size+1];
1967 else {
1968 keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size);
Benjamin Peterson0823ffb2015-04-23 17:04:36 -04001969 if (keys == NULL) {
1970 PyErr_NoMemory();
1971 goto keyfunc_fail;
1972 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 }
Daniel Stutzbach98338222010-12-02 21:55:33 +00001974
1975 for (i = 0; i < saved_ob_size ; i++) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01001976 keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i],
1977 NULL);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001978 if (keys[i] == NULL) {
1979 for (i=i-1 ; i>=0 ; i--)
1980 Py_DECREF(keys[i]);
Benjamin Peterson4a42cd42014-03-15 12:21:28 -05001981 if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
Daniel Stutzbach8eda5f72011-03-02 23:37:50 +00001982 PyMem_FREE(keys);
Daniel Stutzbach98338222010-12-02 21:55:33 +00001983 goto keyfunc_fail;
1984 }
1985 }
1986
1987 lo.keys = keys;
1988 lo.values = saved_ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001990
Daniel Stutzbach98338222010-12-02 21:55:33 +00001991 merge_init(&ms, saved_ob_size, keys != NULL);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 nremaining = saved_ob_size;
1994 if (nremaining < 2)
1995 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001996
Benjamin Peterson05380642010-08-23 19:35:39 +00001997 /* Reverse sort stability achieved by initially reversing the list,
1998 applying a stable forward sort, then reversing the final result. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00001999 if (reverse) {
2000 if (keys != NULL)
2001 reverse_slice(&keys[0], &keys[saved_ob_size]);
2002 reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
2003 }
Benjamin Peterson05380642010-08-23 19:35:39 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 /* March over the array once, left to right, finding natural runs,
2006 * and extending short natural runs to minrun elements.
2007 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 minrun = merge_compute_minrun(nremaining);
2009 do {
2010 int descending;
2011 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 /* Identify next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002014 n = count_run(lo.keys, lo.keys + nremaining, &descending);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 if (n < 0)
2016 goto fail;
2017 if (descending)
Daniel Stutzbach98338222010-12-02 21:55:33 +00002018 reverse_sortslice(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 /* If short, extend to min(minrun, nremaining). */
2020 if (n < minrun) {
2021 const Py_ssize_t force = nremaining <= minrun ?
2022 nremaining : minrun;
Daniel Stutzbach98338222010-12-02 21:55:33 +00002023 if (binarysort(lo, lo.keys + force, lo.keys + n) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 goto fail;
2025 n = force;
2026 }
2027 /* Push run onto pending-runs stack, and maybe merge. */
2028 assert(ms.n < MAX_MERGE_PENDING);
2029 ms.pending[ms.n].base = lo;
2030 ms.pending[ms.n].len = n;
2031 ++ms.n;
2032 if (merge_collapse(&ms) < 0)
2033 goto fail;
2034 /* Advance to find next run. */
Daniel Stutzbach98338222010-12-02 21:55:33 +00002035 sortslice_advance(&lo, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 nremaining -= n;
2037 } while (nremaining);
Tim Peters330f9e92002-07-19 07:05:44 +00002038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 if (merge_force_collapse(&ms) < 0)
2040 goto fail;
2041 assert(ms.n == 1);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002042 assert(keys == NULL
2043 ? ms.pending[0].base.keys == saved_ob_item
2044 : ms.pending[0].base.keys == &keys[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 assert(ms.pending[0].len == saved_ob_size);
Daniel Stutzbach98338222010-12-02 21:55:33 +00002046 lo = ms.pending[0].base;
Tim Petersa64dc242002-08-01 02:13:36 +00002047
2048succeed:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002050fail:
Daniel Stutzbach98338222010-12-02 21:55:33 +00002051 if (keys != NULL) {
2052 for (i = 0; i < saved_ob_size; i++)
2053 Py_DECREF(keys[i]);
Benjamin Petersonef87f8c2014-03-14 21:54:31 -05002054 if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
Daniel Stutzbach98338222010-12-02 21:55:33 +00002055 PyMem_FREE(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (self->allocated != -1 && result != NULL) {
2059 /* The user mucked with the list during the sort,
2060 * and we don't already have another error to report.
2061 */
2062 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2063 result = NULL;
2064 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 if (reverse && saved_ob_size > 1)
2067 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 merge_freemem(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002070
Daniel Stutzbach98338222010-12-02 21:55:33 +00002071keyfunc_fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 final_ob_item = self->ob_item;
2073 i = Py_SIZE(self);
2074 Py_SIZE(self) = saved_ob_size;
2075 self->ob_item = saved_ob_item;
2076 self->allocated = saved_allocated;
2077 if (final_ob_item != NULL) {
2078 /* we cannot use list_clear() for this because it does not
2079 guarantee that the list is really empty when it returns */
2080 while (--i >= 0) {
2081 Py_XDECREF(final_ob_item[i]);
2082 }
2083 PyMem_FREE(final_ob_item);
2084 }
2085 Py_XINCREF(result);
2086 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002087}
Tim Peters330f9e92002-07-19 07:05:44 +00002088#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002089#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002090
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002091int
Fred Drakea2f55112000-07-09 15:16:51 +00002092PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 if (v == NULL || !PyList_Check(v)) {
2095 PyErr_BadInternalCall();
2096 return -1;
2097 }
2098 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2099 if (v == NULL)
2100 return -1;
2101 Py_DECREF(v);
2102 return 0;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002103}
2104
Guido van Rossumb86c5492001-02-12 22:06:02 +00002105static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002106listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (Py_SIZE(self) > 1)
2109 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2110 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002111}
2112
Guido van Rossum84c76f51990-10-30 13:32:20 +00002113int
Fred Drakea2f55112000-07-09 15:16:51 +00002114PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 PyListObject *self = (PyListObject *)v;
Tim Peters6063e262002-08-08 01:06:39 +00002117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 if (v == NULL || !PyList_Check(v)) {
2119 PyErr_BadInternalCall();
2120 return -1;
2121 }
2122 if (Py_SIZE(self) > 1)
2123 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2124 return 0;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002125}
2126
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002127PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002128PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 PyObject *w;
2131 PyObject **p, **q;
2132 Py_ssize_t n;
2133 if (v == NULL || !PyList_Check(v)) {
2134 PyErr_BadInternalCall();
2135 return NULL;
2136 }
2137 n = Py_SIZE(v);
2138 w = PyTuple_New(n);
2139 if (w == NULL)
2140 return NULL;
2141 p = ((PyTupleObject *)w)->ob_item;
2142 q = ((PyListObject *)v)->ob_item;
2143 while (--n >= 0) {
2144 Py_INCREF(*q);
2145 *p = *q;
2146 p++;
2147 q++;
2148 }
2149 return w;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002150}
2151
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002152static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002153listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Amaury Forgeot d'Arc864741b2011-11-06 15:10:48 +01002156 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002157
Petri Lehtinenebfaabd2011-11-06 21:02:39 +02002158 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2159 _PyEval_SliceIndex, &start,
2160 _PyEval_SliceIndex, &stop))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 return NULL;
2162 if (start < 0) {
2163 start += Py_SIZE(self);
2164 if (start < 0)
2165 start = 0;
2166 }
2167 if (stop < 0) {
2168 stop += Py_SIZE(self);
2169 if (stop < 0)
2170 stop = 0;
2171 }
2172 for (i = start; i < stop && i < Py_SIZE(self); i++) {
2173 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2174 if (cmp > 0)
2175 return PyLong_FromSsize_t(i);
2176 else if (cmp < 0)
2177 return NULL;
2178 }
Amaury Forgeot d'Arc864741b2011-11-06 15:10:48 +01002179 PyErr_Format(PyExc_ValueError, "%R is not in list", v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002181}
2182
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002183static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002184listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 Py_ssize_t count = 0;
2187 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 for (i = 0; i < Py_SIZE(self); i++) {
2190 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2191 if (cmp > 0)
2192 count++;
2193 else if (cmp < 0)
2194 return NULL;
2195 }
2196 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002197}
2198
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002199static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002200listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 for (i = 0; i < Py_SIZE(self); i++) {
2205 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2206 if (cmp > 0) {
2207 if (list_ass_slice(self, i, i+1,
2208 (PyObject *)NULL) == 0)
2209 Py_RETURN_NONE;
2210 return NULL;
2211 }
2212 else if (cmp < 0)
2213 return NULL;
2214 }
2215 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2216 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002217}
2218
Jeremy Hylton8caad492000-06-23 14:18:11 +00002219static int
2220list_traverse(PyListObject *o, visitproc visit, void *arg)
2221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 for (i = Py_SIZE(o); --i >= 0; )
2225 Py_VISIT(o->ob_item[i]);
2226 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002227}
2228
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002229static PyObject *
2230list_richcompare(PyObject *v, PyObject *w, int op)
2231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 PyListObject *vl, *wl;
2233 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002234
Brian Curtindfc80e32011-08-10 20:28:54 -05002235 if (!PyList_Check(v) || !PyList_Check(w))
2236 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 vl = (PyListObject *)v;
2239 wl = (PyListObject *)w;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2242 /* Shortcut: if the lengths differ, the lists differ */
2243 PyObject *res;
2244 if (op == Py_EQ)
2245 res = Py_False;
2246 else
2247 res = Py_True;
2248 Py_INCREF(res);
2249 return res;
2250 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 /* Search for the first index where items are different */
2253 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2254 int k = PyObject_RichCompareBool(vl->ob_item[i],
2255 wl->ob_item[i], Py_EQ);
2256 if (k < 0)
2257 return NULL;
2258 if (!k)
2259 break;
2260 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2263 /* No more items to compare -- compare sizes */
2264 Py_ssize_t vs = Py_SIZE(vl);
2265 Py_ssize_t ws = Py_SIZE(wl);
2266 int cmp;
2267 PyObject *res;
2268 switch (op) {
2269 case Py_LT: cmp = vs < ws; break;
2270 case Py_LE: cmp = vs <= ws; break;
2271 case Py_EQ: cmp = vs == ws; break;
2272 case Py_NE: cmp = vs != ws; break;
2273 case Py_GT: cmp = vs > ws; break;
2274 case Py_GE: cmp = vs >= ws; break;
2275 default: return NULL; /* cannot happen */
2276 }
2277 if (cmp)
2278 res = Py_True;
2279 else
2280 res = Py_False;
2281 Py_INCREF(res);
2282 return res;
2283 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 /* We have an item that differs -- shortcuts for EQ/NE */
2286 if (op == Py_EQ) {
2287 Py_INCREF(Py_False);
2288 return Py_False;
2289 }
2290 if (op == Py_NE) {
2291 Py_INCREF(Py_True);
2292 return Py_True;
2293 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 /* Compare the final item again using the proper operator */
2296 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002297}
2298
Tim Peters6d6c1a32001-08-02 04:15:00 +00002299static int
2300list_init(PyListObject *self, PyObject *args, PyObject *kw)
2301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 PyObject *arg = NULL;
2303 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2306 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 /* Verify list invariants established by PyType_GenericAlloc() */
2309 assert(0 <= Py_SIZE(self));
2310 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2311 assert(self->ob_item != NULL ||
2312 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 /* Empty previous contents */
2315 if (self->ob_item != NULL) {
2316 (void)list_clear(self);
2317 }
2318 if (arg != NULL) {
2319 PyObject *rv = listextend(self, arg);
2320 if (rv == NULL)
2321 return -1;
2322 Py_DECREF(rv);
2323 }
2324 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002325}
2326
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002327static PyObject *
2328list_sizeof(PyListObject *self)
2329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002331
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002332 res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * sizeof(void*);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002334}
2335
Raymond Hettinger1021c442003-11-07 15:38:09 +00002336static PyObject *list_iter(PyObject *seq);
2337static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2338
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002339PyDoc_STRVAR(getitem_doc,
2340"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002341PyDoc_STRVAR(reversed_doc,
2342"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002343PyDoc_STRVAR(sizeof_doc,
2344"L.__sizeof__() -- size of L in memory, in bytes");
Eli Benderskycbbaa962011-02-25 05:47:53 +00002345PyDoc_STRVAR(clear_doc,
2346"L.clear() -> None -- remove all items from L");
2347PyDoc_STRVAR(copy_doc,
2348"L.copy() -> list -- a shallow copy of L");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002349PyDoc_STRVAR(append_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002350"L.append(object) -> None -- append object to end");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002351PyDoc_STRVAR(extend_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002352"L.extend(iterable) -> None -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002353PyDoc_STRVAR(insert_doc,
2354"L.insert(index, object) -- insert object before index");
2355PyDoc_STRVAR(pop_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002356"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2357"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002358PyDoc_STRVAR(remove_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002359"L.remove(value) -> None -- remove first occurrence of value.\n"
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002360"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002361PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002362"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2363"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002364PyDoc_STRVAR(count_doc,
2365"L.count(value) -> integer -- return number of occurrences of value");
2366PyDoc_STRVAR(reverse_doc,
2367"L.reverse() -- reverse *IN PLACE*");
2368PyDoc_STRVAR(sort_doc,
Georg Brandl388349a2011-10-08 18:32:40 +02002369"L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002370
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002371static PyObject *list_subscript(PyListObject*, PyObject*);
2372
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002373static PyMethodDef list_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2375 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2376 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002377 {"clear", (PyCFunction)listclear, METH_NOARGS, clear_doc},
2378 {"copy", (PyCFunction)listcopy, METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 {"append", (PyCFunction)listappend, METH_O, append_doc},
2380 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Eli Benderskycbbaa962011-02-25 05:47:53 +00002381 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
2383 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2384 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
2385 {"count", (PyCFunction)listcount, METH_O, count_doc},
2386 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2387 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
2388 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002389};
2390
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002391static PySequenceMethods list_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 (lenfunc)list_length, /* sq_length */
2393 (binaryfunc)list_concat, /* sq_concat */
2394 (ssizeargfunc)list_repeat, /* sq_repeat */
2395 (ssizeargfunc)list_item, /* sq_item */
2396 0, /* sq_slice */
2397 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2398 0, /* sq_ass_slice */
2399 (objobjproc)list_contains, /* sq_contains */
2400 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2401 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002402};
2403
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002404PyDoc_STRVAR(list_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002405"list() -> new empty list\n"
2406"list(iterable) -> new list initialized from iterable's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002407
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002408static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002409list_subscript(PyListObject* self, PyObject* item)
2410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 if (PyIndex_Check(item)) {
2412 Py_ssize_t i;
2413 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2414 if (i == -1 && PyErr_Occurred())
2415 return NULL;
2416 if (i < 0)
2417 i += PyList_GET_SIZE(self);
2418 return list_item(self, i);
2419 }
2420 else if (PySlice_Check(item)) {
2421 Py_ssize_t start, stop, step, slicelength, cur, i;
2422 PyObject* result;
2423 PyObject* it;
2424 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002425
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002426 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 &start, &stop, &step, &slicelength) < 0) {
2428 return NULL;
2429 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 if (slicelength <= 0) {
2432 return PyList_New(0);
2433 }
2434 else if (step == 1) {
2435 return list_slice(self, start, stop);
2436 }
2437 else {
2438 result = PyList_New(slicelength);
2439 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 src = self->ob_item;
2442 dest = ((PyListObject *)result)->ob_item;
2443 for (cur = start, i = 0; i < slicelength;
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002444 cur += (size_t)step, i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 it = src[cur];
2446 Py_INCREF(it);
2447 dest[i] = it;
2448 }
Tim Peters3b01a122002-07-19 02:35:45 +00002449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 return result;
2451 }
2452 }
2453 else {
2454 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04002455 "list indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 item->ob_type->tp_name);
2457 return NULL;
2458 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002459}
2460
Tim Peters3b01a122002-07-19 02:35:45 +00002461static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002462list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 if (PyIndex_Check(item)) {
2465 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2466 if (i == -1 && PyErr_Occurred())
2467 return -1;
2468 if (i < 0)
2469 i += PyList_GET_SIZE(self);
2470 return list_ass_item(self, i, value);
2471 }
2472 else if (PySlice_Check(item)) {
2473 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002474
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002475 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 &start, &stop, &step, &slicelength) < 0) {
2477 return -1;
2478 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 if (step == 1)
2481 return list_ass_slice(self, start, stop, value);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 /* Make sure s[5:2] = [..] inserts at the right place:
2484 before 5, not before 2. */
2485 if ((step < 0 && start < stop) ||
2486 (step > 0 && start > stop))
2487 stop = start;
Thomas Woutersed03b412007-08-28 21:37:11 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 if (value == NULL) {
2490 /* delete slice */
2491 PyObject **garbage;
2492 size_t cur;
2493 Py_ssize_t i;
Victor Stinner35f28032013-11-21 12:16:35 +01002494 int res;
Tim Peters3b01a122002-07-19 02:35:45 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 if (slicelength <= 0)
2497 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 if (step < 0) {
2500 stop = start + 1;
2501 start = stop + step*(slicelength - 1) - 1;
2502 step = -step;
2503 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 garbage = (PyObject**)
2506 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2507 if (!garbage) {
2508 PyErr_NoMemory();
2509 return -1;
2510 }
Tim Peters3b01a122002-07-19 02:35:45 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 /* drawing pictures might help understand these for
2513 loops. Basically, we memmove the parts of the
2514 list that are *not* part of the slice: step-1
2515 items for each item that is part of the slice,
2516 and then tail end of the list that was not
2517 covered by the slice */
2518 for (cur = start, i = 0;
2519 cur < (size_t)stop;
2520 cur += step, i++) {
2521 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 garbage[i] = PyList_GET_ITEM(self, cur);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 if (cur + step >= (size_t)Py_SIZE(self)) {
2526 lim = Py_SIZE(self) - cur - 1;
2527 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00002528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 memmove(self->ob_item + cur - i,
2530 self->ob_item + cur + 1,
2531 lim * sizeof(PyObject *));
2532 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002533 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 if (cur < (size_t)Py_SIZE(self)) {
2535 memmove(self->ob_item + cur - slicelength,
2536 self->ob_item + cur,
2537 (Py_SIZE(self) - cur) *
2538 sizeof(PyObject *));
2539 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 Py_SIZE(self) -= slicelength;
Victor Stinner35f28032013-11-21 12:16:35 +01002542 res = list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 for (i = 0; i < slicelength; i++) {
2545 Py_DECREF(garbage[i]);
2546 }
2547 PyMem_FREE(garbage);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002548
Victor Stinner35f28032013-11-21 12:16:35 +01002549 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 }
2551 else {
2552 /* assign slice */
2553 PyObject *ins, *seq;
2554 PyObject **garbage, **seqitems, **selfitems;
2555 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 /* protect against a[::-1] = a */
2558 if (self == (PyListObject*)value) {
2559 seq = list_slice((PyListObject*)value, 0,
2560 PyList_GET_SIZE(value));
2561 }
2562 else {
2563 seq = PySequence_Fast(value,
2564 "must assign iterable "
2565 "to extended slice");
2566 }
2567 if (!seq)
2568 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2571 PyErr_Format(PyExc_ValueError,
2572 "attempt to assign sequence of "
2573 "size %zd to extended slice of "
2574 "size %zd",
2575 PySequence_Fast_GET_SIZE(seq),
2576 slicelength);
2577 Py_DECREF(seq);
2578 return -1;
2579 }
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 if (!slicelength) {
2582 Py_DECREF(seq);
2583 return 0;
2584 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 garbage = (PyObject**)
2587 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2588 if (!garbage) {
2589 Py_DECREF(seq);
2590 PyErr_NoMemory();
2591 return -1;
2592 }
Tim Peters3b01a122002-07-19 02:35:45 +00002593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 selfitems = self->ob_item;
2595 seqitems = PySequence_Fast_ITEMS(seq);
2596 for (cur = start, i = 0; i < slicelength;
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002597 cur += (size_t)step, i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 garbage[i] = selfitems[cur];
2599 ins = seqitems[i];
2600 Py_INCREF(ins);
2601 selfitems[cur] = ins;
2602 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 for (i = 0; i < slicelength; i++) {
2605 Py_DECREF(garbage[i]);
2606 }
Tim Peters3b01a122002-07-19 02:35:45 +00002607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 PyMem_FREE(garbage);
2609 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 return 0;
2612 }
2613 }
2614 else {
2615 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04002616 "list indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 item->ob_type->tp_name);
2618 return -1;
2619 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002620}
2621
2622static PyMappingMethods list_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 (lenfunc)list_length,
2624 (binaryfunc)list_subscript,
2625 (objobjargproc)list_ass_subscript
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002626};
2627
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002628PyTypeObject PyList_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2630 "list",
2631 sizeof(PyListObject),
2632 0,
2633 (destructor)list_dealloc, /* tp_dealloc */
2634 0, /* tp_print */
2635 0, /* tp_getattr */
2636 0, /* tp_setattr */
2637 0, /* tp_reserved */
2638 (reprfunc)list_repr, /* tp_repr */
2639 0, /* tp_as_number */
2640 &list_as_sequence, /* tp_as_sequence */
2641 &list_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002642 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 0, /* tp_call */
2644 0, /* tp_str */
2645 PyObject_GenericGetAttr, /* tp_getattro */
2646 0, /* tp_setattro */
2647 0, /* tp_as_buffer */
2648 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2649 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
2650 list_doc, /* tp_doc */
2651 (traverseproc)list_traverse, /* tp_traverse */
2652 (inquiry)list_clear, /* tp_clear */
2653 list_richcompare, /* tp_richcompare */
2654 0, /* tp_weaklistoffset */
2655 list_iter, /* tp_iter */
2656 0, /* tp_iternext */
2657 list_methods, /* tp_methods */
2658 0, /* tp_members */
2659 0, /* tp_getset */
2660 0, /* tp_base */
2661 0, /* tp_dict */
2662 0, /* tp_descr_get */
2663 0, /* tp_descr_set */
2664 0, /* tp_dictoffset */
2665 (initproc)list_init, /* tp_init */
2666 PyType_GenericAlloc, /* tp_alloc */
2667 PyType_GenericNew, /* tp_new */
2668 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002669};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002670
2671
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002672/*********************** List Iterator **************************/
2673
2674typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 PyObject_HEAD
Victor Stinner7660b882013-06-24 23:59:24 +02002676 Py_ssize_t it_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002678} listiterobject;
2679
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002680static PyObject *list_iter(PyObject *);
2681static void listiter_dealloc(listiterobject *);
2682static int listiter_traverse(listiterobject *, visitproc, void *);
2683static PyObject *listiter_next(listiterobject *);
2684static PyObject *listiter_len(listiterobject *);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002685static PyObject *listiter_reduce_general(void *_it, int forward);
2686static PyObject *listiter_reduce(listiterobject *);
2687static PyObject *listiter_setstate(listiterobject *, PyObject *state);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002688
Armin Rigof5b3e362006-02-11 21:32:43 +00002689PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002690PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2691PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002692
2693static PyMethodDef listiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002695 {"__reduce__", (PyCFunction)listiter_reduce, METH_NOARGS, reduce_doc},
2696 {"__setstate__", (PyCFunction)listiter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002698};
2699
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002700PyTypeObject PyListIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2702 "list_iterator", /* tp_name */
2703 sizeof(listiterobject), /* tp_basicsize */
2704 0, /* tp_itemsize */
2705 /* methods */
2706 (destructor)listiter_dealloc, /* tp_dealloc */
2707 0, /* tp_print */
2708 0, /* tp_getattr */
2709 0, /* tp_setattr */
2710 0, /* tp_reserved */
2711 0, /* tp_repr */
2712 0, /* tp_as_number */
2713 0, /* tp_as_sequence */
2714 0, /* tp_as_mapping */
2715 0, /* tp_hash */
2716 0, /* tp_call */
2717 0, /* tp_str */
2718 PyObject_GenericGetAttr, /* tp_getattro */
2719 0, /* tp_setattro */
2720 0, /* tp_as_buffer */
2721 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2722 0, /* tp_doc */
2723 (traverseproc)listiter_traverse, /* tp_traverse */
2724 0, /* tp_clear */
2725 0, /* tp_richcompare */
2726 0, /* tp_weaklistoffset */
2727 PyObject_SelfIter, /* tp_iter */
2728 (iternextfunc)listiter_next, /* tp_iternext */
2729 listiter_methods, /* tp_methods */
2730 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002731};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002732
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002733
2734static PyObject *
2735list_iter(PyObject *seq)
2736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 listiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 if (!PyList_Check(seq)) {
2740 PyErr_BadInternalCall();
2741 return NULL;
2742 }
2743 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2744 if (it == NULL)
2745 return NULL;
2746 it->it_index = 0;
2747 Py_INCREF(seq);
2748 it->it_seq = (PyListObject *)seq;
2749 _PyObject_GC_TRACK(it);
2750 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002751}
2752
2753static void
2754listiter_dealloc(listiterobject *it)
2755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 _PyObject_GC_UNTRACK(it);
2757 Py_XDECREF(it->it_seq);
2758 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002759}
2760
2761static int
2762listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 Py_VISIT(it->it_seq);
2765 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002766}
2767
2768static PyObject *
2769listiter_next(listiterobject *it)
2770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 PyListObject *seq;
2772 PyObject *item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 assert(it != NULL);
2775 seq = it->it_seq;
2776 if (seq == NULL)
2777 return NULL;
2778 assert(PyList_Check(seq));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 if (it->it_index < PyList_GET_SIZE(seq)) {
2781 item = PyList_GET_ITEM(seq, it->it_index);
2782 ++it->it_index;
2783 Py_INCREF(item);
2784 return item;
2785 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002788 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002790}
2791
2792static PyObject *
2793listiter_len(listiterobject *it)
2794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 Py_ssize_t len;
2796 if (it->it_seq) {
2797 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2798 if (len >= 0)
2799 return PyLong_FromSsize_t(len);
2800 }
2801 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002802}
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002803
2804static PyObject *
2805listiter_reduce(listiterobject *it)
2806{
2807 return listiter_reduce_general(it, 1);
2808}
2809
2810static PyObject *
2811listiter_setstate(listiterobject *it, PyObject *state)
2812{
Victor Stinner7660b882013-06-24 23:59:24 +02002813 Py_ssize_t index = PyLong_AsSsize_t(state);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002814 if (index == -1 && PyErr_Occurred())
2815 return NULL;
2816 if (it->it_seq != NULL) {
2817 if (index < 0)
2818 index = 0;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002819 else if (index > PyList_GET_SIZE(it->it_seq))
2820 index = PyList_GET_SIZE(it->it_seq); /* iterator exhausted */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002821 it->it_index = index;
2822 }
2823 Py_RETURN_NONE;
2824}
2825
Raymond Hettinger1021c442003-11-07 15:38:09 +00002826/*********************** List Reverse Iterator **************************/
2827
2828typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 PyObject_HEAD
2830 Py_ssize_t it_index;
2831 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002832} listreviterobject;
2833
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002834static PyObject *list_reversed(PyListObject *, PyObject *);
2835static void listreviter_dealloc(listreviterobject *);
2836static int listreviter_traverse(listreviterobject *, visitproc, void *);
2837static PyObject *listreviter_next(listreviterobject *);
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002838static PyObject *listreviter_len(listreviterobject *);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002839static PyObject *listreviter_reduce(listreviterobject *);
2840static PyObject *listreviter_setstate(listreviterobject *, PyObject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002841
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002842static PyMethodDef listreviter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002844 {"__reduce__", (PyCFunction)listreviter_reduce, METH_NOARGS, reduce_doc},
2845 {"__setstate__", (PyCFunction)listreviter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 {NULL, NULL} /* sentinel */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002847};
2848
Raymond Hettinger1021c442003-11-07 15:38:09 +00002849PyTypeObject PyListRevIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2851 "list_reverseiterator", /* tp_name */
2852 sizeof(listreviterobject), /* tp_basicsize */
2853 0, /* tp_itemsize */
2854 /* methods */
2855 (destructor)listreviter_dealloc, /* tp_dealloc */
2856 0, /* tp_print */
2857 0, /* tp_getattr */
2858 0, /* tp_setattr */
2859 0, /* tp_reserved */
2860 0, /* tp_repr */
2861 0, /* tp_as_number */
2862 0, /* tp_as_sequence */
2863 0, /* tp_as_mapping */
2864 0, /* tp_hash */
2865 0, /* tp_call */
2866 0, /* tp_str */
2867 PyObject_GenericGetAttr, /* tp_getattro */
2868 0, /* tp_setattro */
2869 0, /* tp_as_buffer */
2870 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2871 0, /* tp_doc */
2872 (traverseproc)listreviter_traverse, /* tp_traverse */
2873 0, /* tp_clear */
2874 0, /* tp_richcompare */
2875 0, /* tp_weaklistoffset */
2876 PyObject_SelfIter, /* tp_iter */
2877 (iternextfunc)listreviter_next, /* tp_iternext */
2878 listreviter_methods, /* tp_methods */
2879 0,
Raymond Hettinger1021c442003-11-07 15:38:09 +00002880};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002881
2882static PyObject *
2883list_reversed(PyListObject *seq, PyObject *unused)
2884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 listreviterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2888 if (it == NULL)
2889 return NULL;
2890 assert(PyList_Check(seq));
2891 it->it_index = PyList_GET_SIZE(seq) - 1;
2892 Py_INCREF(seq);
2893 it->it_seq = seq;
2894 PyObject_GC_Track(it);
2895 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002896}
2897
2898static void
2899listreviter_dealloc(listreviterobject *it)
2900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 PyObject_GC_UnTrack(it);
2902 Py_XDECREF(it->it_seq);
2903 PyObject_GC_Del(it);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002904}
2905
2906static int
2907listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 Py_VISIT(it->it_seq);
2910 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002911}
2912
2913static PyObject *
2914listreviter_next(listreviterobject *it)
2915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 PyObject *item;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002917 Py_ssize_t index;
2918 PyListObject *seq;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002919
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002920 assert(it != NULL);
2921 seq = it->it_seq;
2922 if (seq == NULL) {
2923 return NULL;
2924 }
2925 assert(PyList_Check(seq));
2926
2927 index = it->it_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2929 item = PyList_GET_ITEM(seq, index);
2930 it->it_index--;
2931 Py_INCREF(item);
2932 return item;
2933 }
2934 it->it_index = -1;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002935 it->it_seq = NULL;
2936 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002938}
2939
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002940static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002941listreviter_len(listreviterobject *it)
2942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 Py_ssize_t len = it->it_index + 1;
2944 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2945 len = 0;
2946 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002947}
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002948
2949static PyObject *
2950listreviter_reduce(listreviterobject *it)
2951{
2952 return listiter_reduce_general(it, 0);
2953}
2954
2955static PyObject *
2956listreviter_setstate(listreviterobject *it, PyObject *state)
2957{
2958 Py_ssize_t index = PyLong_AsSsize_t(state);
2959 if (index == -1 && PyErr_Occurred())
2960 return NULL;
2961 if (it->it_seq != NULL) {
2962 if (index < -1)
2963 index = -1;
2964 else if (index > PyList_GET_SIZE(it->it_seq) - 1)
2965 index = PyList_GET_SIZE(it->it_seq) - 1;
2966 it->it_index = index;
2967 }
2968 Py_RETURN_NONE;
2969}
2970
2971/* common pickling support */
2972
2973static PyObject *
2974listiter_reduce_general(void *_it, int forward)
2975{
2976 PyObject *list;
2977
2978 /* the objects are not the same, index is of different types! */
2979 if (forward) {
2980 listiterobject *it = (listiterobject *)_it;
2981 if (it->it_seq)
Victor Stinner7660b882013-06-24 23:59:24 +02002982 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002983 it->it_seq, it->it_index);
2984 } else {
2985 listreviterobject *it = (listreviterobject *)_it;
2986 if (it->it_seq)
Antoine Pitroua7013882012-04-05 00:04:20 +02002987 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("reversed"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002988 it->it_seq, it->it_index);
2989 }
2990 /* empty iterator, create an empty list */
2991 list = PyList_New(0);
2992 if (list == NULL)
2993 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02002994 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002995}