blob: 7b4bf35a3fa23e254589c6643f3faa42be6070e7 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* List object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
4
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00005#ifdef STDC_HEADERS
6#include <stddef.h>
7#else
8#include <sys/types.h> /* For size_t */
9#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Tim Peters8d9eb102004-07-31 02:24:20 +000011/* Ensure ob_item has room for at least newsize elements, and set
12 * ob_size to newsize. If newsize > ob_size on entry, the content
13 * of the new slots at exit is undefined heap trash; it's the caller's
14 * responsiblity to overwrite them with sane values.
15 * The number of allocated elements may grow, shrink, or stay the same.
16 * Failure is impossible if newsize <= self.allocated on entry, although
17 * that partly relies on an assumption that the system realloc() never
18 * fails when passed a number of bytes <= the number of bytes last
19 * allocated (the C standard doesn't guarantee this, but it's hard to
20 * imagine a realloc implementation where it wouldn't be true).
21 * Note that self->ob_item may change, and even if newsize is less
22 * than ob_size on entry.
23 */
Guido van Rossuma46d51d1995-01-26 22:59:43 +000024static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000025list_resize(PyListObject *self, Py_ssize_t newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000026{
Raymond Hettinger4bb95402004-02-13 11:36:39 +000027 PyObject **items;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000028 size_t new_allocated;
Martin v. Löwis18e16552006-02-15 17:27:45 +000029 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000030
Raymond Hettinger4bb95402004-02-13 11:36:39 +000031 /* Bypass realloc() when a previous overallocation is large enough
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000032 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
Raymond Hettinger4bb95402004-02-13 11:36:39 +000034 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000035 if (allocated >= newsize && newsize >= (allocated >> 1)) {
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +000036 assert(self->ob_item != NULL || newsize == 0);
Christian Heimese93237d2007-12-19 02:37:44 +000037 Py_SIZE(self) = newsize;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000038 return 0;
39 }
40
41 /* This over-allocates proportional to the list size, making room
Tim Peters65b8b842001-05-26 05:28:40 +000042 * for additional growth. The over-allocation is mild, but is
43 * enough to give linear-time amortized behavior over a long
44 * sequence of appends() in the presence of a poorly-performing
Raymond Hettingerab517d22004-02-14 18:34:46 +000045 * system realloc().
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
Tim Peters65b8b842001-05-26 05:28:40 +000047 */
Gregory P. Smith9d534572008-06-11 07:41:16 +000048 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
49
50 /* check for integer overflow */
51 if (new_allocated > PY_SIZE_MAX - newsize) {
52 PyErr_NoMemory();
53 return -1;
54 } else {
55 new_allocated += newsize;
56 }
57
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000058 if (newsize == 0)
59 new_allocated = 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000060 items = self->ob_item;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000061 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
62 PyMem_RESIZE(items, PyObject *, new_allocated);
Raymond Hettinger4bb95402004-02-13 11:36:39 +000063 else
64 items = NULL;
65 if (items == NULL) {
66 PyErr_NoMemory();
67 return -1;
68 }
69 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +000070 Py_SIZE(self) = newsize;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000071 self->allocated = new_allocated;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000072 return 0;
73}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000074
Christian Heimesb4ee4a12008-02-07 17:15:30 +000075/* Debug statistic to compare allocations with reuse through the free list */
76#undef SHOW_ALLOC_COUNT
77#ifdef SHOW_ALLOC_COUNT
78static size_t count_alloc = 0;
79static size_t count_reuse = 0;
80
81static void
82show_alloc(void)
83{
Christian Heimes09bde042008-02-24 12:26:16 +000084 fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
85 count_alloc);
86 fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
87 "d\n", count_reuse);
Christian Heimesb4ee4a12008-02-07 17:15:30 +000088 fprintf(stderr, "%.2f%% reuse rate\n\n",
89 (100.0*count_reuse/(count_alloc+count_reuse)));
90}
91#endif
92
Raymond Hettinger0468e412004-05-05 05:37:53 +000093/* Empty list reuse scheme to save calls to malloc and free */
Christian Heimes5b970ad2008-02-06 13:33:44 +000094#ifndef PyList_MAXFREELIST
95#define PyList_MAXFREELIST 80
96#endif
97static PyListObject *free_list[PyList_MAXFREELIST];
98static int numfree = 0;
Raymond Hettinger0468e412004-05-05 05:37:53 +000099
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000100void
101PyList_Fini(void)
102{
103 PyListObject *op;
104
Christian Heimes5b970ad2008-02-06 13:33:44 +0000105 while (numfree) {
Christian Heimes48397d62008-02-08 00:14:34 +0000106 op = free_list[--numfree];
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000107 assert(PyList_CheckExact(op));
108 PyObject_GC_Del(op);
109 }
110}
111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000113PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000116 size_t nbytes;
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000117#ifdef SHOW_ALLOC_COUNT
118 static int initialized = 0;
119 if (!initialized) {
120 Py_AtExit(show_alloc);
121 initialized = 1;
122 }
123#endif
Tim Peters3986d4e2004-07-29 02:28:42 +0000124
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 return NULL;
128 }
Tim Peters7049d812004-01-18 20:31:02 +0000129 nbytes = size * sizeof(PyObject *);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000130 /* Check for overflow without an actual overflow,
131 * which can cause compiler to optimise out */
132 if (size > PY_SIZE_MAX / sizeof(PyObject *))
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 return PyErr_NoMemory();
Christian Heimes5b970ad2008-02-06 13:33:44 +0000134 if (numfree) {
135 numfree--;
136 op = free_list[numfree];
Raymond Hettinger0468e412004-05-05 05:37:53 +0000137 _Py_NewReference((PyObject *)op);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000138#ifdef SHOW_ALLOC_COUNT
139 count_reuse++;
140#endif
Raymond Hettinger0468e412004-05-05 05:37:53 +0000141 } else {
142 op = PyObject_GC_New(PyListObject, &PyList_Type);
143 if (op == NULL)
144 return NULL;
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000145#ifdef SHOW_ALLOC_COUNT
146 count_alloc++;
147#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 }
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000149 if (size <= 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 op->ob_item = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000152 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Neal Norwitza00c0b92006-06-12 02:08:41 +0000153 if (op->ob_item == NULL) {
154 Py_DECREF(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 return PyErr_NoMemory();
Neal Norwitza00c0b92006-06-12 02:08:41 +0000156 }
Tim Peters3986d4e2004-07-29 02:28:42 +0000157 memset(op->ob_item, 0, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158 }
Christian Heimese93237d2007-12-19 02:37:44 +0000159 Py_SIZE(op) = size;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000160 op->allocated = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000161 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163}
164
Martin v. Löwis18e16552006-02-15 17:27:45 +0000165Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000166PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 if (!PyList_Check(op)) {
169 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170 return -1;
171 }
172 else
Christian Heimese93237d2007-12-19 02:37:44 +0000173 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174}
175
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000176static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000177
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000179PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 if (!PyList_Check(op)) {
182 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183 return NULL;
184 }
Christian Heimese93237d2007-12-19 02:37:44 +0000185 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000186 if (indexerr == NULL)
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000187 indexerr = PyString_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 "list index out of range");
189 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190 return NULL;
191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193}
194
195int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000196PyList_SetItem(register PyObject *op, register Py_ssize_t i,
Fred Drakea2f55112000-07-09 15:16:51 +0000197 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199 register PyObject *olditem;
200 register PyObject **p;
201 if (!PyList_Check(op)) {
202 Py_XDECREF(newitem);
203 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000204 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 }
Christian Heimese93237d2007-12-19 02:37:44 +0000206 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 Py_XDECREF(newitem);
208 PyErr_SetString(PyExc_IndexError,
209 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000210 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000213 olditem = *p;
214 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216 return 0;
217}
218
219static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000220ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221{
Christian Heimese93237d2007-12-19 02:37:44 +0000222 Py_ssize_t i, n = Py_SIZE(self);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000224 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000226 return -1;
227 }
Martin v. Löwisb1ed7fa2006-04-13 07:52:27 +0000228 if (n == PY_SSIZE_T_MAX) {
Trent Micka5846642000-08-13 22:47:45 +0000229 PyErr_SetString(PyExc_OverflowError,
230 "cannot add more objects to list");
231 return -1;
232 }
Tim Petersb38e2b62004-07-29 02:29:26 +0000233
Raymond Hettingerd4ff7412004-03-15 09:01:31 +0000234 if (list_resize(self, n+1) == -1)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000235 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000236
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000237 if (where < 0) {
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000238 where += n;
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000239 if (where < 0)
240 where = 0;
241 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000242 if (where > n)
243 where = n;
244 items = self->ob_item;
245 for (i = n; --i >= where; )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 items[where] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 return 0;
250}
251
252int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 if (!PyList_Check(op)) {
256 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000257 return -1;
258 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000259 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260}
261
Raymond Hettinger40a03822004-04-12 13:05:09 +0000262static int
263app1(PyListObject *self, PyObject *v)
264{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000265 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000266
267 assert (v != NULL);
Martin v. Löwisb1ed7fa2006-04-13 07:52:27 +0000268 if (n == PY_SSIZE_T_MAX) {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000269 PyErr_SetString(PyExc_OverflowError,
270 "cannot add more objects to list");
271 return -1;
272 }
273
274 if (list_resize(self, n+1) == -1)
275 return -1;
276
277 Py_INCREF(v);
278 PyList_SET_ITEM(self, n, v);
279 return 0;
280}
281
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282int
Fred Drakea2f55112000-07-09 15:16:51 +0000283PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284{
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000285 if (PyList_Check(op) && (newitem != NULL))
286 return app1((PyListObject *)op, newitem);
287 PyErr_BadInternalCall();
288 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289}
290
291/* Methods */
292
293static void
Fred Drakea2f55112000-07-09 15:16:51 +0000294list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000296 Py_ssize_t i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000297 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000298 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000299 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000300 /* Do it backwards, for Christian Tismer.
301 There's a simple test case where somehow this reduces
302 thrashing when a *very* large list is created and
303 immediately deleted. */
Christian Heimese93237d2007-12-19 02:37:44 +0000304 i = Py_SIZE(op);
Guido van Rossumfa717011999-06-09 15:19:34 +0000305 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000307 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000308 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000309 }
Christian Heimes5b970ad2008-02-06 13:33:44 +0000310 if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
311 free_list[numfree++] = op;
Tim Petersb38e2b62004-07-29 02:29:26 +0000312 else
Christian Heimese93237d2007-12-19 02:37:44 +0000313 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000314 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}
316
Guido van Rossum90933611991-06-07 16:10:43 +0000317static int
Fred Drakea2f55112000-07-09 15:16:51 +0000318list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 int rc;
321 Py_ssize_t i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000322
Martin v. Löwis18e16552006-02-15 17:27:45 +0000323 rc = Py_ReprEnter((PyObject*)op);
324 if (rc != 0) {
325 if (rc < 0)
326 return rc;
Brett Cannon01531592007-09-17 03:28:34 +0000327 Py_BEGIN_ALLOW_THREADS
Guido van Rossumfb376de1998-04-10 22:47:27 +0000328 fprintf(fp, "[...]");
Brett Cannon01531592007-09-17 03:28:34 +0000329 Py_END_ALLOW_THREADS
Guido van Rossumfb376de1998-04-10 22:47:27 +0000330 return 0;
331 }
Brett Cannon01531592007-09-17 03:28:34 +0000332 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 fprintf(fp, "[");
Brett Cannon01531592007-09-17 03:28:34 +0000334 Py_END_ALLOW_THREADS
Christian Heimese93237d2007-12-19 02:37:44 +0000335 for (i = 0; i < Py_SIZE(op); i++) {
Brett Cannon01531592007-09-17 03:28:34 +0000336 if (i > 0) {
337 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +0000339 Py_END_ALLOW_THREADS
340 }
Guido van Rossumfb376de1998-04-10 22:47:27 +0000341 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
342 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000343 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000344 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345 }
Brett Cannon01531592007-09-17 03:28:34 +0000346 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 fprintf(fp, "]");
Brett Cannon01531592007-09-17 03:28:34 +0000348 Py_END_ALLOW_THREADS
Guido van Rossumfb376de1998-04-10 22:47:27 +0000349 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000350 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351}
352
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000354list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000356 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000357 PyObject *s, *temp;
358 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000359
360 i = Py_ReprEnter((PyObject*)v);
361 if (i != 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000362 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000363 }
Tim Petersa7259592001-06-16 05:11:17 +0000364
Christian Heimese93237d2007-12-19 02:37:44 +0000365 if (Py_SIZE(v) == 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000366 result = PyString_FromString("[]");
Tim Petersa7259592001-06-16 05:11:17 +0000367 goto Done;
368 }
369
370 pieces = PyList_New(0);
371 if (pieces == NULL)
372 goto Done;
373
374 /* Do repr() on each element. Note that this may mutate the list,
375 so must refetch the list size on each iteration. */
Christian Heimese93237d2007-12-19 02:37:44 +0000376 for (i = 0; i < Py_SIZE(v); ++i) {
Tim Petersa7259592001-06-16 05:11:17 +0000377 int status;
Brett Cannona0c05512007-09-10 21:38:27 +0000378 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
379 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000380 s = PyObject_Repr(v->ob_item[i]);
Brett Cannona0c05512007-09-10 21:38:27 +0000381 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000382 if (s == NULL)
383 goto Done;
384 status = PyList_Append(pieces, s);
385 Py_DECREF(s); /* append created a new ref */
386 if (status < 0)
387 goto Done;
388 }
389
390 /* Add "[]" decorations to the first and last items. */
391 assert(PyList_GET_SIZE(pieces) > 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000392 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000393 if (s == NULL)
394 goto Done;
395 temp = PyList_GET_ITEM(pieces, 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000396 PyString_ConcatAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000397 PyList_SET_ITEM(pieces, 0, s);
398 if (s == NULL)
399 goto Done;
400
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000401 s = PyString_FromString("]");
Tim Petersa7259592001-06-16 05:11:17 +0000402 if (s == NULL)
403 goto Done;
404 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000405 PyString_ConcatAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000406 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
407 if (temp == NULL)
408 goto Done;
409
410 /* Paste them all together with ", " between. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000411 s = PyString_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000412 if (s == NULL)
413 goto Done;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000414 result = _PyString_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000415 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000416
417Done:
418 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000419 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000420 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421}
422
Martin v. Löwis18e16552006-02-15 17:27:45 +0000423static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000424list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425{
Christian Heimese93237d2007-12-19 02:37:44 +0000426 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427}
428
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000429static int
Fred Drakea2f55112000-07-09 15:16:51 +0000430list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000431{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000432 Py_ssize_t i;
433 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000434
Christian Heimese93237d2007-12-19 02:37:44 +0000435 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
Raymond Hettingeraae59992002-09-05 14:23:49 +0000436 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000437 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000438 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000439}
440
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000442list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443{
Christian Heimese93237d2007-12-19 02:37:44 +0000444 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000445 if (indexerr == NULL)
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000446 indexerr = PyString_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 "list index out of range");
448 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 return NULL;
450 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452 return a->ob_item[i];
453}
454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000459 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000460 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 if (ilow < 0)
462 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000463 else if (ilow > Py_SIZE(a))
464 ilow = Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465 if (ihigh < ilow)
466 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000467 else if (ihigh > Py_SIZE(a))
468 ihigh = Py_SIZE(a);
Raymond Hettinger99842b62004-03-08 05:56:15 +0000469 len = ihigh - ilow;
470 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 if (np == NULL)
472 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000473
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000474 src = a->ob_item + ilow;
475 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000476 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000477 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000479 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482}
483
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000485PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000486{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 if (!PyList_Check(a)) {
488 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000489 return NULL;
490 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000492}
493
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000495list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000496{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000497 Py_ssize_t size;
498 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000499 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500 PyListObject *np;
501 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000502 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000503 "can only concatenate list (not \"%.200s\") to list",
504 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000505 return NULL;
506 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507#define b ((PyListObject *)bb)
Christian Heimese93237d2007-12-19 02:37:44 +0000508 size = Py_SIZE(a) + Py_SIZE(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000509 if (size < 0)
510 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000513 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000514 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000515 src = a->ob_item;
516 dest = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000517 for (i = 0; i < Py_SIZE(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000518 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000520 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000521 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000522 src = b->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000523 dest = np->ob_item + Py_SIZE(a);
524 for (i = 0; i < Py_SIZE(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000525 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000527 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000528 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530#undef b
531}
532
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000534list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000535{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000536 Py_ssize_t i, j;
537 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000539 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000540 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000541 if (n < 0)
542 n = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000543 size = Py_SIZE(a) * n;
544 if (n && size/n != Py_SIZE(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000545 return PyErr_NoMemory();
Armin Rigoa1e42e12007-10-17 18:46:37 +0000546 if (size == 0)
Guido van Rossum8d5cf4e2008-01-25 19:50:26 +0000547 return PyList_New(0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000549 if (np == NULL)
550 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000551
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000552 items = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000553 if (Py_SIZE(a) == 1) {
Raymond Hettinger6624e682003-05-21 05:58:46 +0000554 elem = a->ob_item[0];
555 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000556 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000557 Py_INCREF(elem);
558 }
559 return (PyObject *) np;
560 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000561 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000562 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000563 for (i = 0; i < n; i++) {
Christian Heimese93237d2007-12-19 02:37:44 +0000564 for (j = 0; j < Py_SIZE(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000565 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000567 p++;
568 }
569 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000571}
572
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573static int
Armin Rigo93677f02004-07-29 12:40:23 +0000574list_clear(PyListObject *a)
575{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000576 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000577 PyObject **item = a->ob_item;
578 if (item != NULL) {
579 /* Because XDECREF can recursively invoke operations on
580 this list, we make it empty first. */
Christian Heimese93237d2007-12-19 02:37:44 +0000581 i = Py_SIZE(a);
582 Py_SIZE(a) = 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000583 a->ob_item = NULL;
584 a->allocated = 0;
585 while (--i >= 0) {
586 Py_XDECREF(item[i]);
587 }
588 PyMem_FREE(item);
589 }
590 /* Never fails; the return value can be ignored.
591 Note that there is no guarantee that the list is actually empty
592 at this point, because XDECREF may have populated it again! */
593 return 0;
594}
595
Tim Peters8fc4a912004-07-31 21:53:19 +0000596/* a[ilow:ihigh] = v if v != NULL.
597 * del a[ilow:ihigh] if v == NULL.
598 *
599 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
600 * guaranteed the call cannot fail.
601 */
Armin Rigo93677f02004-07-29 12:40:23 +0000602static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000603list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000605 /* Because [X]DECREF can recursively invoke list operations on
606 this list, we must postpone all [X]DECREF activity until
607 after the list is back in its canonical shape. Therefore
608 we must allocate an additional array, 'recycle', into which
609 we temporarily copy the items that are deleted from the
610 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000611 PyObject *recycle_on_stack[8];
612 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000614 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000615 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000616 Py_ssize_t n; /* # of elements in replacement list */
617 Py_ssize_t norig; /* # of elements in list getting replaced */
618 Py_ssize_t d; /* Change in size */
619 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000620 size_t s;
621 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623 if (v == NULL)
624 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000625 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000626 if (a == b) {
627 /* Special case "a[i:j] = a" -- copy b first */
Christian Heimese93237d2007-12-19 02:37:44 +0000628 v = list_slice(b, 0, Py_SIZE(b));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000629 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000630 return result;
631 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000633 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000634 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000635 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000636 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000637 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000638 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000639 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000640 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000641 if (ilow < 0)
642 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000643 else if (ilow > Py_SIZE(a))
644 ilow = Py_SIZE(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000645
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000646 if (ihigh < ilow)
647 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000648 else if (ihigh > Py_SIZE(a))
649 ihigh = Py_SIZE(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000650
Tim Peters8d9eb102004-07-31 02:24:20 +0000651 norig = ihigh - ilow;
652 assert(norig >= 0);
653 d = n - norig;
Christian Heimese93237d2007-12-19 02:37:44 +0000654 if (Py_SIZE(a) + d == 0) {
Armin Rigo93677f02004-07-29 12:40:23 +0000655 Py_XDECREF(v_as_SF);
656 return list_clear(a);
657 }
658 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000659 /* recycle the items that we are about to remove */
660 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000661 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000662 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000663 if (recycle == NULL) {
664 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000665 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000666 }
667 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000668 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000669
Armin Rigo1dd04a02004-07-30 11:38:22 +0000670 if (d < 0) { /* Delete -d items */
671 memmove(&item[ihigh+d], &item[ihigh],
Christian Heimese93237d2007-12-19 02:37:44 +0000672 (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
673 list_resize(a, Py_SIZE(a) + d);
Armin Rigo1dd04a02004-07-30 11:38:22 +0000674 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000675 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000676 else if (d > 0) { /* Insert d items */
Christian Heimese93237d2007-12-19 02:37:44 +0000677 k = Py_SIZE(a);
Tim Peters73572222004-07-31 02:54:42 +0000678 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000679 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000680 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000681 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000682 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683 }
684 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000685 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000687 item[ilow] = w;
688 }
Tim Peters73572222004-07-31 02:54:42 +0000689 for (k = norig - 1; k >= 0; --k)
690 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000691 result = 0;
692 Error:
Tim Peters73572222004-07-31 02:54:42 +0000693 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000694 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000695 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000696 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000697#undef b
698}
699
Guido van Rossum234f9421993-06-17 12:35:49 +0000700int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000701PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000702{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 if (!PyList_Check(a)) {
704 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000705 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000706 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000708}
709
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000711list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000712{
713 PyObject **items;
Guido van Rossum8d5cf4e2008-01-25 19:50:26 +0000714 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000715
716
717 size = PyList_GET_SIZE(self);
Guido van Rossum8d5cf4e2008-01-25 19:50:26 +0000718 if (size == 0 || n == 1) {
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719 Py_INCREF(self);
720 return (PyObject *)self;
721 }
722
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000724 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725 Py_INCREF(self);
726 return (PyObject *)self;
727 }
728
Thomas Woutersa97744c2008-01-25 21:09:34 +0000729 if (size > PY_SSIZE_T_MAX / n) {
Armin Rigoa1e42e12007-10-17 18:46:37 +0000730 return PyErr_NoMemory();
Guido van Rossum8d5cf4e2008-01-25 19:50:26 +0000731 }
732
733 if (list_resize(self, size*n) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000734 return NULL;
735
736 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000737 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000738 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
739 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000740 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000741 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000742 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000743 }
744 }
745 Py_INCREF(self);
746 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000747}
748
Guido van Rossum4a450d01991-04-03 19:05:18 +0000749static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000750list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000751{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000752 PyObject *old_value;
Christian Heimese93237d2007-12-19 02:37:44 +0000753 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 PyErr_SetString(PyExc_IndexError,
755 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000756 return -1;
757 }
758 if (v == NULL)
759 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000761 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000762 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000763 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000764 return 0;
765}
766
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000768listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000770 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000772 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000774 if (ins1(self, i, v) == 0)
775 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000776 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000777}
778
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000780listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000781{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000782 if (app1(self, v) == 0)
783 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000784 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000785}
786
Barry Warsawdedf6d61998-10-09 16:37:25 +0000787static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000788listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000789{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000790 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000791 Py_ssize_t m; /* size of self */
792 Py_ssize_t n; /* guess for size of b */
793 Py_ssize_t mn; /* m + n */
794 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000795 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000796
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000797 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000798 1) lists and tuples which can use PySequence_Fast ops
799 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000800 */
801 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000802 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000803 b = PySequence_Fast(b, "argument must be iterable");
804 if (!b)
805 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000806 n = PySequence_Fast_GET_SIZE(b);
807 if (n == 0) {
808 /* short circuit when b is empty */
809 Py_DECREF(b);
810 Py_RETURN_NONE;
811 }
Christian Heimese93237d2007-12-19 02:37:44 +0000812 m = Py_SIZE(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000813 if (list_resize(self, m + n) == -1) {
814 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000815 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000816 }
817 /* note that we may still have self == b here for the
818 * situation a.extend(a), but the following code works
819 * in that case too. Just make sure to resize self
820 * before calling PySequence_Fast_ITEMS.
821 */
822 /* populate the end of self with b's items */
823 src = PySequence_Fast_ITEMS(b);
824 dest = self->ob_item + m;
825 for (i = 0; i < n; i++) {
826 PyObject *o = src[i];
827 Py_INCREF(o);
828 dest[i] = o;
829 }
830 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000831 Py_RETURN_NONE;
832 }
833
834 it = PyObject_GetIter(b);
835 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000836 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000837 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000839 /* Guess a result list size. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000840 n = _PyObject_LengthHint(b, 8);
Christian Heimese93237d2007-12-19 02:37:44 +0000841 m = Py_SIZE(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000842 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000843 if (mn >= m) {
844 /* Make room. */
845 if (list_resize(self, mn) == -1)
846 goto error;
847 /* Make the list sane again. */
Christian Heimese93237d2007-12-19 02:37:44 +0000848 Py_SIZE(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000849 }
850 /* Else m + n overflowed; on the chance that n lied, and there really
851 * is enough room, ignore it. If n was telling the truth, we'll
852 * eventually run out of memory during the loop.
853 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000854
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000855 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000856 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000857 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000858 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000859 if (PyErr_Occurred()) {
860 if (PyErr_ExceptionMatches(PyExc_StopIteration))
861 PyErr_Clear();
862 else
863 goto error;
864 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000865 break;
866 }
Christian Heimese93237d2007-12-19 02:37:44 +0000867 if (Py_SIZE(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000868 /* steals ref */
Christian Heimese93237d2007-12-19 02:37:44 +0000869 PyList_SET_ITEM(self, Py_SIZE(self), item);
870 ++Py_SIZE(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000871 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000872 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000873 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000874 Py_DECREF(item); /* append creates a new ref */
875 if (status < 0)
876 goto error;
877 }
878 }
879
880 /* Cut back result list if initial guess was too large. */
Christian Heimese93237d2007-12-19 02:37:44 +0000881 if (Py_SIZE(self) < self->allocated)
882 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000883
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000884 Py_DECREF(it);
885 Py_RETURN_NONE;
886
887 error:
888 Py_DECREF(it);
889 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000890}
891
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000892PyObject *
893_PyList_Extend(PyListObject *self, PyObject *b)
894{
895 return listextend(self, b);
896}
897
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000898static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000899list_inplace_concat(PyListObject *self, PyObject *other)
900{
901 PyObject *result;
902
903 result = listextend(self, other);
904 if (result == NULL)
905 return result;
906 Py_DECREF(result);
907 Py_INCREF(self);
908 return (PyObject *)self;
909}
910
911static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000912listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000913{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000914 Py_ssize_t i = -1;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000915 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000916 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000917
Armin Rigo7ccbca92006-10-04 12:17:45 +0000918 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000919 return NULL;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000920
Christian Heimese93237d2007-12-19 02:37:44 +0000921 if (Py_SIZE(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000922 /* Special-case most common failure cause */
923 PyErr_SetString(PyExc_IndexError, "pop from empty list");
924 return NULL;
925 }
926 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +0000927 i += Py_SIZE(self);
928 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000929 PyErr_SetString(PyExc_IndexError, "pop index out of range");
930 return NULL;
931 }
932 v = self->ob_item[i];
Christian Heimese93237d2007-12-19 02:37:44 +0000933 if (i == Py_SIZE(self) - 1) {
934 status = list_resize(self, Py_SIZE(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000935 assert(status >= 0);
936 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000937 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000938 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000939 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
940 assert(status >= 0);
941 /* Use status, so that in a release build compilers don't
942 * complain about the unused name.
943 */
Brett Cannon651dd522004-08-08 21:21:18 +0000944 (void) status;
945
946 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000947}
948
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000949/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
950static void
951reverse_slice(PyObject **lo, PyObject **hi)
952{
953 assert(lo && hi);
954
955 --hi;
956 while (lo < hi) {
957 PyObject *t = *lo;
958 *lo = *hi;
959 *hi = t;
960 ++lo;
961 --hi;
962 }
963}
964
Tim Petersa64dc242002-08-01 02:13:36 +0000965/* Lots of code for an adaptive, stable, natural mergesort. There are many
966 * pieces to this algorithm; read listsort.txt for overviews and details.
967 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000968
Guido van Rossum3f236de1996-12-10 23:55:39 +0000969/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000970 * comparison function (any callable Python object), which must not be
971 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
972 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000973 * Returns -1 on error, 1 if x < y, 0 if x >= y.
974 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000975static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000976islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000977{
Tim Petersf2a04732002-07-11 21:46:16 +0000978 PyObject *res;
979 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000980 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000981
Tim Peters66860f62002-08-04 17:47:26 +0000982 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000983 /* Call the user's comparison function and translate the 3-way
984 * result into true or false (or error).
985 */
Tim Petersf2a04732002-07-11 21:46:16 +0000986 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000987 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000988 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000989 Py_INCREF(x);
990 Py_INCREF(y);
991 PyTuple_SET_ITEM(args, 0, x);
992 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000993 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000995 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000996 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 if (!PyInt_Check(res)) {
Georg Brandl283a1352006-11-19 08:48:30 +0000998 PyErr_Format(PyExc_TypeError,
999 "comparison function must return int, not %.200s",
1000 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +00001002 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001003 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 i = PyInt_AsLong(res);
1005 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +00001006 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001007}
1008
Tim Peters66860f62002-08-04 17:47:26 +00001009/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
1010 * islt. This avoids a layer of function call in the usual case, and
1011 * sorting does many comparisons.
1012 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1013 */
1014#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
1015 PyObject_RichCompareBool(X, Y, Py_LT) : \
1016 islt(X, Y, COMPARE))
1017
1018/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +00001019 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
1020 started. It makes more sense in context <wink>. X and Y are PyObject*s.
1021*/
Tim Peters66860f62002-08-04 17:47:26 +00001022#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +00001023 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001024
1025/* binarysort is the best method for sorting small arrays: it does
1026 few compares, but can do data movement quadratic in the number of
1027 elements.
Guido van Rossum42812581998-06-17 14:15:44 +00001028 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +00001029 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001030 On entry, must have lo <= start <= hi, and that [lo, start) is already
1031 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +00001032 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001033 Even in case of error, the output slice will be some permutation of
1034 the input (nothing is lost or duplicated).
1035*/
Guido van Rossum3f236de1996-12-10 23:55:39 +00001036static int
Fred Drakea2f55112000-07-09 15:16:51 +00001037binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
1038 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001039{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001040 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001041 register PyObject **l, **p, **r;
1042 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001043
Tim Petersa8c974c2002-07-19 03:30:57 +00001044 assert(lo <= start && start <= hi);
1045 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001046 if (lo == start)
1047 ++start;
1048 for (; start < hi; ++start) {
1049 /* set l to where *start belongs */
1050 l = lo;
1051 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001052 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +00001053 /* Invariants:
1054 * pivot >= all in [lo, l).
1055 * pivot < all in [r, start).
1056 * The second is vacuously true at the start.
1057 */
1058 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001059 do {
1060 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +00001061 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001062 r = p;
1063 else
Tim Peters0fe977c2002-07-19 06:12:32 +00001064 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001065 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001066 assert(l == r);
1067 /* The invariants still hold, so pivot >= all in [lo, l) and
1068 pivot < all in [l, start), so pivot belongs at l. Note
1069 that if there are elements equal to pivot, l points to the
1070 first slot after them -- that's why this sort is stable.
1071 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001072 Caution: using memmove is much slower under MSVC 5;
1073 we're not usually moving many slots. */
1074 for (p = start; p > l; --p)
1075 *p = *(p-1);
1076 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001077 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001078 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001079
1080 fail:
1081 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001082}
1083
Tim Petersa64dc242002-08-01 02:13:36 +00001084/*
1085Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1086is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001087
Tim Petersa64dc242002-08-01 02:13:36 +00001088 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001089
Tim Petersa64dc242002-08-01 02:13:36 +00001090or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001091
Tim Petersa64dc242002-08-01 02:13:36 +00001092 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001093
Tim Petersa64dc242002-08-01 02:13:36 +00001094Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1095For its intended use in a stable mergesort, the strictness of the defn of
1096"descending" is needed so that the caller can safely reverse a descending
1097sequence without violating stability (strict > ensures there are no equal
1098elements to get out of order).
1099
1100Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001101*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001102static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001103count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001104{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001105 Py_ssize_t k;
1106 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001107
Tim Petersa64dc242002-08-01 02:13:36 +00001108 assert(lo < hi);
1109 *descending = 0;
1110 ++lo;
1111 if (lo == hi)
1112 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001113
Tim Petersa64dc242002-08-01 02:13:36 +00001114 n = 2;
1115 IFLT(*lo, *(lo-1)) {
1116 *descending = 1;
1117 for (lo = lo+1; lo < hi; ++lo, ++n) {
1118 IFLT(*lo, *(lo-1))
1119 ;
1120 else
1121 break;
1122 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001123 }
Tim Petersa64dc242002-08-01 02:13:36 +00001124 else {
1125 for (lo = lo+1; lo < hi; ++lo, ++n) {
1126 IFLT(*lo, *(lo-1))
1127 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001128 }
1129 }
1130
Tim Petersa64dc242002-08-01 02:13:36 +00001131 return n;
1132fail:
1133 return -1;
1134}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001135
Tim Petersa64dc242002-08-01 02:13:36 +00001136/*
1137Locate the proper position of key in a sorted vector; if the vector contains
1138an element equal to key, return the position immediately to the left of
1139the leftmost equal element. [gallop_right() does the same except returns
1140the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001141
Tim Petersa64dc242002-08-01 02:13:36 +00001142"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001143
Tim Petersa64dc242002-08-01 02:13:36 +00001144"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1145hint is to the final result, the faster this runs.
1146
1147The return value is the int k in 0..n such that
1148
1149 a[k-1] < key <= a[k]
1150
1151pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1152key belongs at index k; or, IOW, the first k elements of a should precede
1153key, and the last n-k should follow key.
1154
1155Returns -1 on error. See listsort.txt for info on the method.
1156*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001157static Py_ssize_t
1158gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001159{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160 Py_ssize_t ofs;
1161 Py_ssize_t lastofs;
1162 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001163
1164 assert(key && a && n > 0 && hint >= 0 && hint < n);
1165
1166 a += hint;
1167 lastofs = 0;
1168 ofs = 1;
1169 IFLT(*a, key) {
1170 /* a[hint] < key -- gallop right, until
1171 * a[hint + lastofs] < key <= a[hint + ofs]
1172 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001173 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001174 while (ofs < maxofs) {
1175 IFLT(a[ofs], key) {
1176 lastofs = ofs;
1177 ofs = (ofs << 1) + 1;
1178 if (ofs <= 0) /* int overflow */
1179 ofs = maxofs;
1180 }
1181 else /* key <= a[hint + ofs] */
1182 break;
1183 }
1184 if (ofs > maxofs)
1185 ofs = maxofs;
1186 /* Translate back to offsets relative to &a[0]. */
1187 lastofs += hint;
1188 ofs += hint;
1189 }
1190 else {
1191 /* key <= a[hint] -- gallop left, until
1192 * a[hint - ofs] < key <= a[hint - lastofs]
1193 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001194 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001195 while (ofs < maxofs) {
1196 IFLT(*(a-ofs), key)
1197 break;
1198 /* key <= a[hint - ofs] */
1199 lastofs = ofs;
1200 ofs = (ofs << 1) + 1;
1201 if (ofs <= 0) /* int overflow */
1202 ofs = maxofs;
1203 }
1204 if (ofs > maxofs)
1205 ofs = maxofs;
1206 /* Translate back to positive offsets relative to &a[0]. */
1207 k = lastofs;
1208 lastofs = hint - ofs;
1209 ofs = hint - k;
1210 }
1211 a -= hint;
1212
1213 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1214 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1215 * right of lastofs but no farther right than ofs. Do a binary
1216 * search, with invariant a[lastofs-1] < key <= a[ofs].
1217 */
1218 ++lastofs;
1219 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001220 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001221
1222 IFLT(a[m], key)
1223 lastofs = m+1; /* a[m] < key */
1224 else
1225 ofs = m; /* key <= a[m] */
1226 }
1227 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1228 return ofs;
1229
1230fail:
1231 return -1;
1232}
1233
1234/*
1235Exactly like gallop_left(), except that if key already exists in a[0:n],
1236finds the position immediately to the right of the rightmost equal value.
1237
1238The return value is the int k in 0..n such that
1239
1240 a[k-1] <= key < a[k]
1241
1242or -1 if error.
1243
1244The code duplication is massive, but this is enough different given that
1245we're sticking to "<" comparisons that it's much harder to follow if
1246written as one routine with yet another "left or right?" flag.
1247*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001248static Py_ssize_t
1249gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001250{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001251 Py_ssize_t ofs;
1252 Py_ssize_t lastofs;
1253 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001254
1255 assert(key && a && n > 0 && hint >= 0 && hint < n);
1256
1257 a += hint;
1258 lastofs = 0;
1259 ofs = 1;
1260 IFLT(key, *a) {
1261 /* key < a[hint] -- gallop left, until
1262 * a[hint - ofs] <= key < a[hint - lastofs]
1263 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001264 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001265 while (ofs < maxofs) {
1266 IFLT(key, *(a-ofs)) {
1267 lastofs = ofs;
1268 ofs = (ofs << 1) + 1;
1269 if (ofs <= 0) /* int overflow */
1270 ofs = maxofs;
1271 }
1272 else /* a[hint - ofs] <= key */
1273 break;
1274 }
1275 if (ofs > maxofs)
1276 ofs = maxofs;
1277 /* Translate back to positive offsets relative to &a[0]. */
1278 k = lastofs;
1279 lastofs = hint - ofs;
1280 ofs = hint - k;
1281 }
1282 else {
1283 /* a[hint] <= key -- gallop right, until
1284 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001285 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001286 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001287 while (ofs < maxofs) {
1288 IFLT(key, a[ofs])
1289 break;
1290 /* a[hint + ofs] <= key */
1291 lastofs = ofs;
1292 ofs = (ofs << 1) + 1;
1293 if (ofs <= 0) /* int overflow */
1294 ofs = maxofs;
1295 }
1296 if (ofs > maxofs)
1297 ofs = maxofs;
1298 /* Translate back to offsets relative to &a[0]. */
1299 lastofs += hint;
1300 ofs += hint;
1301 }
1302 a -= hint;
1303
1304 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1305 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1306 * right of lastofs but no farther right than ofs. Do a binary
1307 * search, with invariant a[lastofs-1] <= key < a[ofs].
1308 */
1309 ++lastofs;
1310 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001311 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001312
1313 IFLT(key, a[m])
1314 ofs = m; /* key < a[m] */
1315 else
1316 lastofs = m+1; /* a[m] <= key */
1317 }
1318 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1319 return ofs;
1320
1321fail:
1322 return -1;
1323}
1324
1325/* The maximum number of entries in a MergeState's pending-runs stack.
1326 * This is enough to sort arrays of size up to about
1327 * 32 * phi ** MAX_MERGE_PENDING
1328 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1329 * with 2**64 elements.
1330 */
1331#define MAX_MERGE_PENDING 85
1332
Tim Peterse05f65a2002-08-10 05:21:15 +00001333/* When we get into galloping mode, we stay there until both runs win less
1334 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001335 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001336#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001337
1338/* Avoid malloc for small temp arrays. */
1339#define MERGESTATE_TEMP_SIZE 256
1340
1341/* One MergeState exists on the stack per invocation of mergesort. It's just
1342 * a convenient way to pass state around among the helper functions.
1343 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001344struct s_slice {
1345 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001346 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001347};
1348
Tim Petersa64dc242002-08-01 02:13:36 +00001349typedef struct s_MergeState {
1350 /* The user-supplied comparison function. or NULL if none given. */
1351 PyObject *compare;
1352
Tim Peterse05f65a2002-08-10 05:21:15 +00001353 /* This controls when we get *into* galloping mode. It's initialized
1354 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1355 * random data, and lower for highly structured data.
1356 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001357 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001358
Tim Petersa64dc242002-08-01 02:13:36 +00001359 /* 'a' is temp storage to help with merges. It contains room for
1360 * alloced entries.
1361 */
1362 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001363 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001364
1365 /* A stack of n pending runs yet to be merged. Run #i starts at
1366 * address base[i] and extends for len[i] elements. It's always
1367 * true (so long as the indices are in bounds) that
1368 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001369 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001370 *
1371 * so we could cut the storage for this, but it's a minor amount,
1372 * and keeping all the info explicit simplifies the code.
1373 */
1374 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001375 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001376
1377 /* 'a' points to this when possible, rather than muck with malloc. */
1378 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1379} MergeState;
1380
1381/* Conceptually a MergeState's constructor. */
1382static void
1383merge_init(MergeState *ms, PyObject *compare)
1384{
1385 assert(ms != NULL);
1386 ms->compare = compare;
1387 ms->a = ms->temparray;
1388 ms->alloced = MERGESTATE_TEMP_SIZE;
1389 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001390 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001391}
1392
1393/* Free all the temp memory owned by the MergeState. This must be called
1394 * when you're done with a MergeState, and may be called before then if
1395 * you want to free the temp memory early.
1396 */
1397static void
1398merge_freemem(MergeState *ms)
1399{
1400 assert(ms != NULL);
1401 if (ms->a != ms->temparray)
1402 PyMem_Free(ms->a);
1403 ms->a = ms->temparray;
1404 ms->alloced = MERGESTATE_TEMP_SIZE;
1405}
1406
1407/* Ensure enough temp memory for 'need' array slots is available.
1408 * Returns 0 on success and -1 if the memory can't be gotten.
1409 */
1410static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001411merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001412{
1413 assert(ms != NULL);
1414 if (need <= ms->alloced)
1415 return 0;
1416 /* Don't realloc! That can cost cycles to copy the old data, but
1417 * we don't care what's in the block.
1418 */
1419 merge_freemem(ms);
Gregory P. Smith9d534572008-06-11 07:41:16 +00001420 if (need > PY_SSIZE_T_MAX / sizeof(PyObject*)) {
1421 PyErr_NoMemory();
1422 return -1;
1423 }
Tim Petersa64dc242002-08-01 02:13:36 +00001424 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1425 if (ms->a) {
1426 ms->alloced = need;
1427 return 0;
1428 }
1429 PyErr_NoMemory();
1430 merge_freemem(ms); /* reset to sane state */
1431 return -1;
1432}
1433#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1434 merge_getmem(MS, NEED))
1435
1436/* Merge the na elements starting at pa with the nb elements starting at pb
1437 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1438 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1439 * merge, and should have na <= nb. See listsort.txt for more info.
1440 * Return 0 if successful, -1 if error.
1441 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001442static Py_ssize_t
1443merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1444 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001445{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001446 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001447 PyObject *compare;
1448 PyObject **dest;
1449 int result = -1; /* guilty until proved innocent */
Neal Norwitz7fd96072006-08-19 04:28:55 +00001450 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001451
1452 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1453 if (MERGE_GETMEM(ms, na) < 0)
1454 return -1;
1455 memcpy(ms->a, pa, na * sizeof(PyObject*));
1456 dest = pa;
1457 pa = ms->a;
1458
1459 *dest++ = *pb++;
1460 --nb;
1461 if (nb == 0)
1462 goto Succeed;
1463 if (na == 1)
1464 goto CopyB;
1465
Neal Norwitz7fd96072006-08-19 04:28:55 +00001466 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001467 compare = ms->compare;
1468 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001469 Py_ssize_t acount = 0; /* # of times A won in a row */
1470 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001471
1472 /* Do the straightforward thing until (if ever) one run
1473 * appears to win consistently.
1474 */
1475 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001476 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001477 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001478 if (k) {
1479 if (k < 0)
1480 goto Fail;
1481 *dest++ = *pb++;
1482 ++bcount;
1483 acount = 0;
1484 --nb;
1485 if (nb == 0)
1486 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001487 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001488 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001489 }
1490 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001491 *dest++ = *pa++;
1492 ++acount;
1493 bcount = 0;
1494 --na;
1495 if (na == 1)
1496 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001497 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001498 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001499 }
Tim Petersa64dc242002-08-01 02:13:36 +00001500 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001501
Tim Petersa64dc242002-08-01 02:13:36 +00001502 /* One run is winning so consistently that galloping may
1503 * be a huge win. So try that, and continue galloping until
1504 * (if ever) neither run appears to be winning consistently
1505 * anymore.
1506 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001507 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001508 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001509 assert(na > 1 && nb > 0);
1510 min_gallop -= min_gallop > 1;
1511 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001512 k = gallop_right(*pb, pa, na, 0, compare);
1513 acount = k;
1514 if (k) {
1515 if (k < 0)
1516 goto Fail;
1517 memcpy(dest, pa, k * sizeof(PyObject *));
1518 dest += k;
1519 pa += k;
1520 na -= k;
1521 if (na == 1)
1522 goto CopyB;
1523 /* na==0 is impossible now if the comparison
1524 * function is consistent, but we can't assume
1525 * that it is.
1526 */
1527 if (na == 0)
1528 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001529 }
Tim Petersa64dc242002-08-01 02:13:36 +00001530 *dest++ = *pb++;
1531 --nb;
1532 if (nb == 0)
1533 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001534
Tim Petersa64dc242002-08-01 02:13:36 +00001535 k = gallop_left(*pa, pb, nb, 0, compare);
1536 bcount = k;
1537 if (k) {
1538 if (k < 0)
1539 goto Fail;
1540 memmove(dest, pb, k * sizeof(PyObject *));
1541 dest += k;
1542 pb += k;
1543 nb -= k;
1544 if (nb == 0)
1545 goto Succeed;
1546 }
1547 *dest++ = *pa++;
1548 --na;
1549 if (na == 1)
1550 goto CopyB;
1551 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001552 ++min_gallop; /* penalize it for leaving galloping mode */
1553 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001554 }
1555Succeed:
1556 result = 0;
1557Fail:
1558 if (na)
1559 memcpy(dest, pa, na * sizeof(PyObject*));
1560 return result;
1561CopyB:
1562 assert(na == 1 && nb > 0);
1563 /* The last element of pa belongs at the end of the merge. */
1564 memmove(dest, pb, nb * sizeof(PyObject *));
1565 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001566 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001567}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001568
Tim Petersa64dc242002-08-01 02:13:36 +00001569/* Merge the na elements starting at pa with the nb elements starting at pb
1570 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1571 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1572 * merge, and should have na >= nb. See listsort.txt for more info.
1573 * Return 0 if successful, -1 if error.
1574 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001575static Py_ssize_t
1576merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001577{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001578 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001579 PyObject *compare;
1580 PyObject **dest;
1581 int result = -1; /* guilty until proved innocent */
1582 PyObject **basea;
1583 PyObject **baseb;
Neal Norwitz7fd96072006-08-19 04:28:55 +00001584 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001585
1586 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1587 if (MERGE_GETMEM(ms, nb) < 0)
1588 return -1;
1589 dest = pb + nb - 1;
1590 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1591 basea = pa;
1592 baseb = ms->a;
1593 pb = ms->a + nb - 1;
1594 pa += na - 1;
1595
1596 *dest-- = *pa--;
1597 --na;
1598 if (na == 0)
1599 goto Succeed;
1600 if (nb == 1)
1601 goto CopyA;
1602
Neal Norwitz7fd96072006-08-19 04:28:55 +00001603 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001604 compare = ms->compare;
1605 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001606 Py_ssize_t acount = 0; /* # of times A won in a row */
1607 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001608
1609 /* Do the straightforward thing until (if ever) one run
1610 * appears to win consistently.
1611 */
1612 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001613 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001614 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001615 if (k) {
1616 if (k < 0)
1617 goto Fail;
1618 *dest-- = *pa--;
1619 ++acount;
1620 bcount = 0;
1621 --na;
1622 if (na == 0)
1623 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001624 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001625 break;
1626 }
1627 else {
1628 *dest-- = *pb--;
1629 ++bcount;
1630 acount = 0;
1631 --nb;
1632 if (nb == 1)
1633 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001634 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001635 break;
1636 }
1637 }
1638
1639 /* One run is winning so consistently that galloping may
1640 * be a huge win. So try that, and continue galloping until
1641 * (if ever) neither run appears to be winning consistently
1642 * anymore.
1643 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001644 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001645 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001646 assert(na > 0 && nb > 1);
1647 min_gallop -= min_gallop > 1;
1648 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001649 k = gallop_right(*pb, basea, na, na-1, compare);
1650 if (k < 0)
1651 goto Fail;
1652 k = na - k;
1653 acount = k;
1654 if (k) {
1655 dest -= k;
1656 pa -= k;
1657 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1658 na -= k;
1659 if (na == 0)
1660 goto Succeed;
1661 }
1662 *dest-- = *pb--;
1663 --nb;
1664 if (nb == 1)
1665 goto CopyA;
1666
1667 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1668 if (k < 0)
1669 goto Fail;
1670 k = nb - k;
1671 bcount = k;
1672 if (k) {
1673 dest -= k;
1674 pb -= k;
1675 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1676 nb -= k;
1677 if (nb == 1)
1678 goto CopyA;
1679 /* nb==0 is impossible now if the comparison
1680 * function is consistent, but we can't assume
1681 * that it is.
1682 */
1683 if (nb == 0)
1684 goto Succeed;
1685 }
1686 *dest-- = *pa--;
1687 --na;
1688 if (na == 0)
1689 goto Succeed;
1690 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001691 ++min_gallop; /* penalize it for leaving galloping mode */
1692 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001693 }
1694Succeed:
1695 result = 0;
1696Fail:
1697 if (nb)
1698 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1699 return result;
1700CopyA:
1701 assert(nb == 1 && na > 0);
1702 /* The first element of pb belongs at the front of the merge. */
1703 dest -= na;
1704 pa -= na;
1705 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1706 *dest = *pb;
1707 return 0;
1708}
1709
1710/* Merge the two runs at stack indices i and i+1.
1711 * Returns 0 on success, -1 on error.
1712 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001713static Py_ssize_t
1714merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001715{
1716 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001717 Py_ssize_t na, nb;
1718 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001719 PyObject *compare;
1720
1721 assert(ms != NULL);
1722 assert(ms->n >= 2);
1723 assert(i >= 0);
1724 assert(i == ms->n - 2 || i == ms->n - 3);
1725
Tim Peterse05f65a2002-08-10 05:21:15 +00001726 pa = ms->pending[i].base;
1727 na = ms->pending[i].len;
1728 pb = ms->pending[i+1].base;
1729 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001730 assert(na > 0 && nb > 0);
1731 assert(pa + na == pb);
1732
1733 /* Record the length of the combined runs; if i is the 3rd-last
1734 * run now, also slide over the last run (which isn't involved
1735 * in this merge). The current run i+1 goes away in any case.
1736 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001737 ms->pending[i].len = na + nb;
1738 if (i == ms->n - 3)
1739 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001740 --ms->n;
1741
1742 /* Where does b start in a? Elements in a before that can be
1743 * ignored (already in place).
1744 */
1745 compare = ms->compare;
1746 k = gallop_right(*pb, pa, na, 0, compare);
1747 if (k < 0)
1748 return -1;
1749 pa += k;
1750 na -= k;
1751 if (na == 0)
1752 return 0;
1753
1754 /* Where does a end in b? Elements in b after that can be
1755 * ignored (already in place).
1756 */
1757 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1758 if (nb <= 0)
1759 return nb;
1760
1761 /* Merge what remains of the runs, using a temp array with
1762 * min(na, nb) elements.
1763 */
1764 if (na <= nb)
1765 return merge_lo(ms, pa, na, pb, nb);
1766 else
1767 return merge_hi(ms, pa, na, pb, nb);
1768}
1769
1770/* Examine the stack of runs waiting to be merged, merging adjacent runs
1771 * until the stack invariants are re-established:
1772 *
1773 * 1. len[-3] > len[-2] + len[-1]
1774 * 2. len[-2] > len[-1]
1775 *
1776 * See listsort.txt for more info.
1777 *
1778 * Returns 0 on success, -1 on error.
1779 */
1780static int
1781merge_collapse(MergeState *ms)
1782{
Tim Peterse05f65a2002-08-10 05:21:15 +00001783 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001784
1785 assert(ms);
1786 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001787 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001788 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1789 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001790 --n;
1791 if (merge_at(ms, n) < 0)
1792 return -1;
1793 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001794 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001795 if (merge_at(ms, n) < 0)
1796 return -1;
1797 }
1798 else
1799 break;
1800 }
1801 return 0;
1802}
1803
1804/* Regardless of invariants, merge all runs on the stack until only one
1805 * remains. This is used at the end of the mergesort.
1806 *
1807 * Returns 0 on success, -1 on error.
1808 */
1809static int
1810merge_force_collapse(MergeState *ms)
1811{
Tim Peterse05f65a2002-08-10 05:21:15 +00001812 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001813
1814 assert(ms);
1815 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001816 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001817 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001818 --n;
1819 if (merge_at(ms, n) < 0)
1820 return -1;
1821 }
1822 return 0;
1823}
1824
1825/* Compute a good value for the minimum run length; natural runs shorter
1826 * than this are boosted artificially via binary insertion.
1827 *
1828 * If n < 64, return n (it's too small to bother with fancy stuff).
1829 * Else if n is an exact power of 2, return 32.
1830 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1831 * strictly less than, an exact power of 2.
1832 *
1833 * See listsort.txt for more info.
1834 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001835static Py_ssize_t
1836merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001837{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001838 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001839
1840 assert(n >= 0);
1841 while (n >= 64) {
1842 r |= n & 1;
1843 n >>= 1;
1844 }
1845 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001846}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001847
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001848/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001849 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001850 which is returned during the undecorate phase. By exposing only the key
1851 during comparisons, the underlying sort stability characteristics are left
1852 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001853 the key instead of a full record. */
1854
1855typedef struct {
1856 PyObject_HEAD
1857 PyObject *key;
1858 PyObject *value;
1859} sortwrapperobject;
1860
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001861PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Anthony Baxter377be112006-04-11 06:54:30 +00001862static PyObject *
1863sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1864static void
1865sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001866
1867static PyTypeObject sortwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001868 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001869 "sortwrapper", /* tp_name */
1870 sizeof(sortwrapperobject), /* tp_basicsize */
1871 0, /* tp_itemsize */
1872 /* methods */
1873 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1874 0, /* tp_print */
1875 0, /* tp_getattr */
1876 0, /* tp_setattr */
1877 0, /* tp_compare */
1878 0, /* tp_repr */
1879 0, /* tp_as_number */
1880 0, /* tp_as_sequence */
1881 0, /* tp_as_mapping */
1882 0, /* tp_hash */
1883 0, /* tp_call */
1884 0, /* tp_str */
1885 PyObject_GenericGetAttr, /* tp_getattro */
1886 0, /* tp_setattro */
1887 0, /* tp_as_buffer */
Tim Petersb38e2b62004-07-29 02:29:26 +00001888 Py_TPFLAGS_DEFAULT |
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001889 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1890 sortwrapper_doc, /* tp_doc */
1891 0, /* tp_traverse */
1892 0, /* tp_clear */
1893 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1894};
1895
Anthony Baxter377be112006-04-11 06:54:30 +00001896
1897static PyObject *
1898sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1899{
1900 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1901 PyErr_SetString(PyExc_TypeError,
1902 "expected a sortwrapperobject");
1903 return NULL;
1904 }
1905 return PyObject_RichCompare(a->key, b->key, op);
1906}
1907
1908static void
1909sortwrapper_dealloc(sortwrapperobject *so)
1910{
1911 Py_XDECREF(so->key);
1912 Py_XDECREF(so->value);
1913 PyObject_Del(so);
1914}
1915
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001916/* Returns a new reference to a sortwrapper.
1917 Consumes the references to the two underlying objects. */
1918
1919static PyObject *
1920build_sortwrapper(PyObject *key, PyObject *value)
1921{
1922 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001923
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001924 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1925 if (so == NULL)
1926 return NULL;
1927 so->key = key;
1928 so->value = value;
1929 return (PyObject *)so;
1930}
1931
1932/* Returns a new reference to the value underlying the wrapper. */
1933static PyObject *
1934sortwrapper_getvalue(PyObject *so)
1935{
1936 PyObject *value;
1937
1938 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001939 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001940 "expected a sortwrapperobject");
1941 return NULL;
1942 }
1943 value = ((sortwrapperobject *)so)->value;
1944 Py_INCREF(value);
1945 return value;
1946}
1947
1948/* Wrapper for user specified cmp functions in combination with a
1949 specified key function. Makes sure the cmp function is presented
1950 with the actual key instead of the sortwrapper */
1951
1952typedef struct {
1953 PyObject_HEAD
1954 PyObject *func;
1955} cmpwrapperobject;
1956
1957static void
1958cmpwrapper_dealloc(cmpwrapperobject *co)
1959{
1960 Py_XDECREF(co->func);
1961 PyObject_Del(co);
1962}
1963
1964static PyObject *
1965cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1966{
1967 PyObject *x, *y, *xx, *yy;
1968
1969 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1970 return NULL;
1971 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001972 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001973 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001974 "expected a sortwrapperobject");
1975 return NULL;
1976 }
1977 xx = ((sortwrapperobject *)x)->key;
1978 yy = ((sortwrapperobject *)y)->key;
1979 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1980}
1981
1982PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1983
1984static PyTypeObject cmpwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001985 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001986 "cmpwrapper", /* tp_name */
1987 sizeof(cmpwrapperobject), /* tp_basicsize */
1988 0, /* tp_itemsize */
1989 /* methods */
1990 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1991 0, /* tp_print */
1992 0, /* tp_getattr */
1993 0, /* tp_setattr */
1994 0, /* tp_compare */
1995 0, /* tp_repr */
1996 0, /* tp_as_number */
1997 0, /* tp_as_sequence */
1998 0, /* tp_as_mapping */
1999 0, /* tp_hash */
2000 (ternaryfunc)cmpwrapper_call, /* tp_call */
2001 0, /* tp_str */
2002 PyObject_GenericGetAttr, /* tp_getattro */
2003 0, /* tp_setattro */
2004 0, /* tp_as_buffer */
2005 Py_TPFLAGS_DEFAULT, /* tp_flags */
2006 cmpwrapper_doc, /* tp_doc */
2007};
2008
2009static PyObject *
2010build_cmpwrapper(PyObject *cmpfunc)
2011{
2012 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00002013
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002014 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
2015 if (co == NULL)
2016 return NULL;
2017 Py_INCREF(cmpfunc);
2018 co->func = cmpfunc;
2019 return (PyObject *)co;
2020}
2021
Tim Petersa64dc242002-08-01 02:13:36 +00002022/* An adaptive, stable, natural mergesort. See listsort.txt.
2023 * Returns Py_None on success, NULL on error. Even in case of error, the
2024 * list will be some permutation of its input state (nothing is lost or
2025 * duplicated).
2026 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002028listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00002029{
Tim Petersa64dc242002-08-01 02:13:36 +00002030 MergeState ms;
2031 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002032 Py_ssize_t nremaining;
2033 Py_ssize_t minrun;
2034 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00002035 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00002036 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002037 PyObject *compare = NULL;
2038 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002039 int reverse = 0;
2040 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002041 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002042 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002043 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002044
Tim Petersa64dc242002-08-01 02:13:36 +00002045 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002046 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002047 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002048 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2049 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002050 return NULL;
2051 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002052 if (compare == Py_None)
2053 compare = NULL;
Raymond Hettinger05387862008-03-19 17:45:19 +00002054 if (compare != NULL &&
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00002055 PyErr_WarnPy3k("the cmp argument is not supported in 3.x", 1) < 0)
Raymond Hettinger6c0ff8a2008-03-18 23:33:08 +00002056 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002057 if (keyfunc == Py_None)
2058 keyfunc = NULL;
2059 if (compare != NULL && keyfunc != NULL) {
2060 compare = build_cmpwrapper(compare);
2061 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002062 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002063 } else
2064 Py_XINCREF(compare);
2065
Tim Petersb9099c32002-11-12 22:08:10 +00002066 /* The list is temporarily made empty, so that mutations performed
2067 * by comparison functions can't affect the slice of memory we're
2068 * sorting (allowing mutations during sorting is a core-dump
2069 * factory, since ob_item may change).
2070 */
Christian Heimese93237d2007-12-19 02:37:44 +00002071 saved_ob_size = Py_SIZE(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002072 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002073 saved_allocated = self->allocated;
Christian Heimese93237d2007-12-19 02:37:44 +00002074 Py_SIZE(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002075 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002076 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002077
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002078 if (keyfunc != NULL) {
2079 for (i=0 ; i < saved_ob_size ; i++) {
2080 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002081 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002082 NULL);
2083 if (key == NULL) {
2084 for (i=i-1 ; i>=0 ; i--) {
2085 kvpair = saved_ob_item[i];
2086 value = sortwrapper_getvalue(kvpair);
2087 saved_ob_item[i] = value;
2088 Py_DECREF(kvpair);
2089 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002090 goto dsu_fail;
2091 }
2092 kvpair = build_sortwrapper(key, value);
2093 if (kvpair == NULL)
2094 goto dsu_fail;
2095 saved_ob_item[i] = kvpair;
2096 }
2097 }
2098
2099 /* Reverse sort stability achieved by initially reversing the list,
2100 applying a stable forward sort, then reversing the final result. */
2101 if (reverse && saved_ob_size > 1)
2102 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2103
2104 merge_init(&ms, compare);
2105
Tim Petersb9099c32002-11-12 22:08:10 +00002106 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002107 if (nremaining < 2)
2108 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002109
Tim Petersa64dc242002-08-01 02:13:36 +00002110 /* March over the array once, left to right, finding natural runs,
2111 * and extending short natural runs to minrun elements.
2112 */
Tim Petersb9099c32002-11-12 22:08:10 +00002113 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002114 hi = lo + nremaining;
2115 minrun = merge_compute_minrun(nremaining);
2116 do {
2117 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002118 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002119
Tim Petersa64dc242002-08-01 02:13:36 +00002120 /* Identify next run. */
2121 n = count_run(lo, hi, compare, &descending);
2122 if (n < 0)
2123 goto fail;
2124 if (descending)
2125 reverse_slice(lo, lo + n);
2126 /* If short, extend to min(minrun, nremaining). */
2127 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002128 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002129 nremaining : minrun;
2130 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2131 goto fail;
2132 n = force;
2133 }
2134 /* Push run onto pending-runs stack, and maybe merge. */
2135 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002136 ms.pending[ms.n].base = lo;
2137 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002138 ++ms.n;
2139 if (merge_collapse(&ms) < 0)
2140 goto fail;
2141 /* Advance to find next run. */
2142 lo += n;
2143 nremaining -= n;
2144 } while (nremaining);
2145 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002146
Tim Petersa64dc242002-08-01 02:13:36 +00002147 if (merge_force_collapse(&ms) < 0)
2148 goto fail;
2149 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002150 assert(ms.pending[0].base == saved_ob_item);
2151 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002152
2153succeed:
2154 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002155fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002156 if (keyfunc != NULL) {
2157 for (i=0 ; i < saved_ob_size ; i++) {
2158 kvpair = saved_ob_item[i];
2159 value = sortwrapper_getvalue(kvpair);
2160 saved_ob_item[i] = value;
2161 Py_DECREF(kvpair);
2162 }
2163 }
2164
Armin Rigo93677f02004-07-29 12:40:23 +00002165 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002166 /* The user mucked with the list during the sort,
2167 * and we don't already have another error to report.
2168 */
2169 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2170 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002171 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002172
2173 if (reverse && saved_ob_size > 1)
2174 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2175
2176 merge_freemem(&ms);
2177
2178dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002179 final_ob_item = self->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +00002180 i = Py_SIZE(self);
2181 Py_SIZE(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002182 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002183 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002184 if (final_ob_item != NULL) {
2185 /* we cannot use list_clear() for this because it does not
2186 guarantee that the list is really empty when it returns */
2187 while (--i >= 0) {
2188 Py_XDECREF(final_ob_item[i]);
2189 }
2190 PyMem_FREE(final_ob_item);
2191 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002192 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002193 Py_XINCREF(result);
2194 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002195}
Tim Peters330f9e92002-07-19 07:05:44 +00002196#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002197#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002198
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002199int
Fred Drakea2f55112000-07-09 15:16:51 +00002200PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002201{
2202 if (v == NULL || !PyList_Check(v)) {
2203 PyErr_BadInternalCall();
2204 return -1;
2205 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002206 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002207 if (v == NULL)
2208 return -1;
2209 Py_DECREF(v);
2210 return 0;
2211}
2212
Guido van Rossumb86c5492001-02-12 22:06:02 +00002213static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002214listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002215{
Christian Heimese93237d2007-12-19 02:37:44 +00002216 if (Py_SIZE(self) > 1)
2217 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002218 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002219}
2220
Guido van Rossum84c76f51990-10-30 13:32:20 +00002221int
Fred Drakea2f55112000-07-09 15:16:51 +00002222PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002223{
Tim Peters6063e262002-08-08 01:06:39 +00002224 PyListObject *self = (PyListObject *)v;
2225
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002226 if (v == NULL || !PyList_Check(v)) {
2227 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002228 return -1;
2229 }
Christian Heimese93237d2007-12-19 02:37:44 +00002230 if (Py_SIZE(self) > 1)
2231 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002232 return 0;
2233}
2234
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002235PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002236PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002237{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238 PyObject *w;
Raymond Hettinger6c87af52007-12-15 00:07:25 +00002239 PyObject **p, **q;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002240 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002241 if (v == NULL || !PyList_Check(v)) {
2242 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002243 return NULL;
2244 }
Christian Heimese93237d2007-12-19 02:37:44 +00002245 n = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002246 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002247 if (w == NULL)
2248 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002249 p = ((PyTupleObject *)w)->ob_item;
Raymond Hettinger6c87af52007-12-15 00:07:25 +00002250 q = ((PyListObject *)v)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002251 while (--n >= 0) {
Raymond Hettinger6c87af52007-12-15 00:07:25 +00002252 Py_INCREF(*q);
2253 *p = *q;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002254 p++;
Raymond Hettinger6c87af52007-12-15 00:07:25 +00002255 q++;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002256 }
2257 return w;
2258}
2259
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002260static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002261listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002262{
Christian Heimese93237d2007-12-19 02:37:44 +00002263 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002264 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002265
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002266 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2267 _PyEval_SliceIndex, &start,
2268 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002269 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002270 if (start < 0) {
Christian Heimese93237d2007-12-19 02:37:44 +00002271 start += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002272 if (start < 0)
2273 start = 0;
2274 }
2275 if (stop < 0) {
Christian Heimese93237d2007-12-19 02:37:44 +00002276 stop += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002277 if (stop < 0)
2278 stop = 0;
2279 }
Christian Heimese93237d2007-12-19 02:37:44 +00002280 for (i = start; i < stop && i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002281 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2282 if (cmp > 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002283 return PyInt_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002284 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002285 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002286 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002287 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002288 return NULL;
2289}
2290
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002291static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002292listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002293{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002294 Py_ssize_t count = 0;
2295 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002296
Christian Heimese93237d2007-12-19 02:37:44 +00002297 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002298 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2299 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002300 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002301 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002302 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002303 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002304 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002305}
2306
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002307static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002308listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002309{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002310 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002311
Christian Heimese93237d2007-12-19 02:37:44 +00002312 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002313 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2314 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002315 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002316 (PyObject *)NULL) == 0)
2317 Py_RETURN_NONE;
2318 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002319 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002320 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002321 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002323 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002324 return NULL;
2325}
2326
Jeremy Hylton8caad492000-06-23 14:18:11 +00002327static int
2328list_traverse(PyListObject *o, visitproc visit, void *arg)
2329{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002330 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002331
Christian Heimese93237d2007-12-19 02:37:44 +00002332 for (i = Py_SIZE(o); --i >= 0; )
Thomas Woutersc6e55062006-04-15 21:47:09 +00002333 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002334 return 0;
2335}
2336
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002337static PyObject *
2338list_richcompare(PyObject *v, PyObject *w, int op)
2339{
2340 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002341 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002342
2343 if (!PyList_Check(v) || !PyList_Check(w)) {
2344 Py_INCREF(Py_NotImplemented);
2345 return Py_NotImplemented;
2346 }
2347
2348 vl = (PyListObject *)v;
2349 wl = (PyListObject *)w;
2350
Christian Heimese93237d2007-12-19 02:37:44 +00002351 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002352 /* Shortcut: if the lengths differ, the lists differ */
2353 PyObject *res;
2354 if (op == Py_EQ)
2355 res = Py_False;
2356 else
2357 res = Py_True;
2358 Py_INCREF(res);
2359 return res;
2360 }
2361
2362 /* Search for the first index where items are different */
Christian Heimese93237d2007-12-19 02:37:44 +00002363 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002364 int k = PyObject_RichCompareBool(vl->ob_item[i],
2365 wl->ob_item[i], Py_EQ);
2366 if (k < 0)
2367 return NULL;
2368 if (!k)
2369 break;
2370 }
2371
Christian Heimese93237d2007-12-19 02:37:44 +00002372 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002373 /* No more items to compare -- compare sizes */
Christian Heimese93237d2007-12-19 02:37:44 +00002374 Py_ssize_t vs = Py_SIZE(vl);
2375 Py_ssize_t ws = Py_SIZE(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002376 int cmp;
2377 PyObject *res;
2378 switch (op) {
2379 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002380 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002381 case Py_EQ: cmp = vs == ws; break;
2382 case Py_NE: cmp = vs != ws; break;
2383 case Py_GT: cmp = vs > ws; break;
2384 case Py_GE: cmp = vs >= ws; break;
2385 default: return NULL; /* cannot happen */
2386 }
2387 if (cmp)
2388 res = Py_True;
2389 else
2390 res = Py_False;
2391 Py_INCREF(res);
2392 return res;
2393 }
2394
2395 /* We have an item that differs -- shortcuts for EQ/NE */
2396 if (op == Py_EQ) {
2397 Py_INCREF(Py_False);
2398 return Py_False;
2399 }
2400 if (op == Py_NE) {
2401 Py_INCREF(Py_True);
2402 return Py_True;
2403 }
2404
2405 /* Compare the final item again using the proper operator */
2406 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2407}
2408
Tim Peters6d6c1a32001-08-02 04:15:00 +00002409static int
2410list_init(PyListObject *self, PyObject *args, PyObject *kw)
2411{
2412 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002413 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002414
2415 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2416 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002417
2418 /* Verify list invariants established by PyType_GenericAlloc() */
Christian Heimese93237d2007-12-19 02:37:44 +00002419 assert(0 <= Py_SIZE(self));
2420 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002421 assert(self->ob_item != NULL ||
2422 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002423
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002424 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002425 if (self->ob_item != NULL) {
2426 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002427 }
2428 if (arg != NULL) {
2429 PyObject *rv = listextend(self, arg);
2430 if (rv == NULL)
2431 return -1;
2432 Py_DECREF(rv);
2433 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002434 return 0;
2435}
2436
Robert Schuppenies51df0642008-06-01 16:16:17 +00002437static PyObject *
2438list_sizeof(PyListObject *self)
2439{
2440 Py_ssize_t res;
2441
2442 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
2443 return PyInt_FromSsize_t(res);
2444}
2445
Raymond Hettinger1021c442003-11-07 15:38:09 +00002446static PyObject *list_iter(PyObject *seq);
2447static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2448
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002449PyDoc_STRVAR(getitem_doc,
2450"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002451PyDoc_STRVAR(reversed_doc,
2452"L.__reversed__() -- return a reverse iterator over the list");
Robert Schuppenies51df0642008-06-01 16:16:17 +00002453PyDoc_STRVAR(sizeof_doc,
Georg Brandl7a6de8b2008-06-01 16:42:16 +00002454"L.__sizeof__() -- size of L in memory, in bytes");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002455PyDoc_STRVAR(append_doc,
2456"L.append(object) -- append object to end");
2457PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002458"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002459PyDoc_STRVAR(insert_doc,
2460"L.insert(index, object) -- insert object before index");
2461PyDoc_STRVAR(pop_doc,
Andrew M. Kuchlingd810cdf2008-10-04 01:04:24 +00002462"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2463"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002464PyDoc_STRVAR(remove_doc,
Andrew M. Kuchlingd810cdf2008-10-04 01:04:24 +00002465"L.remove(value) -- remove first occurrence of value.\n"
2466"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002467PyDoc_STRVAR(index_doc,
Andrew M. Kuchlingd810cdf2008-10-04 01:04:24 +00002468"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2469"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002470PyDoc_STRVAR(count_doc,
2471"L.count(value) -> integer -- return number of occurrences of value");
2472PyDoc_STRVAR(reverse_doc,
2473"L.reverse() -- reverse *IN PLACE*");
2474PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002475"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2476cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002477
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002478static PyObject *list_subscript(PyListObject*, PyObject*);
2479
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002480static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002481 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002482 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Robert Schuppenies51df0642008-06-01 16:16:17 +00002483 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002484 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002485 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002486 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002487 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002488 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002489 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002490 {"count", (PyCFunction)listcount, METH_O, count_doc},
2491 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002492 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002493 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002494};
2495
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002496static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002497 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002498 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002499 (ssizeargfunc)list_repeat, /* sq_repeat */
2500 (ssizeargfunc)list_item, /* sq_item */
2501 (ssizessizeargfunc)list_slice, /* sq_slice */
2502 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2503 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002504 (objobjproc)list_contains, /* sq_contains */
2505 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002506 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002507};
2508
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002509PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002510"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002511"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002512
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002513
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002514static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002515list_subscript(PyListObject* self, PyObject* item)
2516{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002517 if (PyIndex_Check(item)) {
2518 Py_ssize_t i;
2519 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002520 if (i == -1 && PyErr_Occurred())
2521 return NULL;
2522 if (i < 0)
2523 i += PyList_GET_SIZE(self);
2524 return list_item(self, i);
2525 }
2526 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002527 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002528 PyObject* result;
2529 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002530 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002531
Christian Heimese93237d2007-12-19 02:37:44 +00002532 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002533 &start, &stop, &step, &slicelength) < 0) {
2534 return NULL;
2535 }
2536
2537 if (slicelength <= 0) {
2538 return PyList_New(0);
2539 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002540 else if (step == 1) {
2541 return list_slice(self, start, stop);
2542 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002543 else {
2544 result = PyList_New(slicelength);
2545 if (!result) return NULL;
2546
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002547 src = self->ob_item;
2548 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002549 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002550 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002551 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002552 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002553 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002554 }
Tim Peters3b01a122002-07-19 02:35:45 +00002555
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002556 return result;
2557 }
2558 }
2559 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002560 PyErr_Format(PyExc_TypeError,
2561 "list indices must be integers, not %.200s",
2562 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002563 return NULL;
2564 }
2565}
2566
Tim Peters3b01a122002-07-19 02:35:45 +00002567static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002568list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2569{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002570 if (PyIndex_Check(item)) {
2571 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002572 if (i == -1 && PyErr_Occurred())
2573 return -1;
2574 if (i < 0)
2575 i += PyList_GET_SIZE(self);
2576 return list_ass_item(self, i, value);
2577 }
2578 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002579 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002580
Christian Heimese93237d2007-12-19 02:37:44 +00002581 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002582 &start, &stop, &step, &slicelength) < 0) {
2583 return -1;
2584 }
2585
Thomas Wouters3ccec682007-08-28 15:28:19 +00002586 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002587 return list_ass_slice(self, start, stop, value);
2588
Thomas Wouters3ccec682007-08-28 15:28:19 +00002589 /* Make sure s[5:2] = [..] inserts at the right place:
2590 before 5, not before 2. */
2591 if ((step < 0 && start < stop) ||
2592 (step > 0 && start > stop))
2593 stop = start;
2594
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002595 if (value == NULL) {
2596 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002597 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002598 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002599
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002600 if (slicelength <= 0)
2601 return 0;
2602
2603 if (step < 0) {
2604 stop = start + 1;
2605 start = stop + step*(slicelength - 1) - 1;
2606 step = -step;
2607 }
2608
Gregory P. Smith9d534572008-06-11 07:41:16 +00002609 assert(slicelength <= PY_SIZE_MAX / sizeof(PyObject*));
2610
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002611 garbage = (PyObject**)
2612 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002613 if (!garbage) {
2614 PyErr_NoMemory();
2615 return -1;
2616 }
Tim Peters3b01a122002-07-19 02:35:45 +00002617
Thomas Wouters3ccec682007-08-28 15:28:19 +00002618 /* drawing pictures might help understand these for
2619 loops. Basically, we memmove the parts of the
2620 list that are *not* part of the slice: step-1
2621 items for each item that is part of the slice,
2622 and then tail end of the list that was not
2623 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002624 for (cur = start, i = 0;
2625 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002626 cur += step, i++) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00002627 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002628
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002629 garbage[i] = PyList_GET_ITEM(self, cur);
2630
Christian Heimese93237d2007-12-19 02:37:44 +00002631 if (cur + step >= Py_SIZE(self)) {
2632 lim = Py_SIZE(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002633 }
2634
Tim Petersb38e2b62004-07-29 02:29:26 +00002635 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002636 self->ob_item + cur + 1,
2637 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002638 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002639 cur = start + slicelength*step;
Christian Heimese93237d2007-12-19 02:37:44 +00002640 if (cur < Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00002641 memmove(self->ob_item + cur - slicelength,
2642 self->ob_item + cur,
Christian Heimese93237d2007-12-19 02:37:44 +00002643 (Py_SIZE(self) - cur) *
Thomas Wouters3ccec682007-08-28 15:28:19 +00002644 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002645 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002646
Christian Heimese93237d2007-12-19 02:37:44 +00002647 Py_SIZE(self) -= slicelength;
2648 list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002649
2650 for (i = 0; i < slicelength; i++) {
2651 Py_DECREF(garbage[i]);
2652 }
2653 PyMem_FREE(garbage);
2654
2655 return 0;
2656 }
2657 else {
2658 /* assign slice */
Thomas Wouters3ccec682007-08-28 15:28:19 +00002659 PyObject *ins, *seq;
2660 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002661 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002662
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002663 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002664 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002665 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002666 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002667 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002668 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002669 seq = PySequence_Fast(value,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002670 "must assign iterable "
2671 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002672 }
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002673 if (!seq)
2674 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002675
2676 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2677 PyErr_Format(PyExc_ValueError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002678 "attempt to assign sequence of "
2679 "size %zd to extended slice of "
2680 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002681 PySequence_Fast_GET_SIZE(seq),
2682 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002683 Py_DECREF(seq);
2684 return -1;
2685 }
2686
2687 if (!slicelength) {
2688 Py_DECREF(seq);
2689 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002690 }
2691
2692 garbage = (PyObject**)
2693 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitze7e4e2d2006-10-28 21:20:12 +00002694 if (!garbage) {
2695 Py_DECREF(seq);
2696 PyErr_NoMemory();
2697 return -1;
2698 }
Tim Peters3b01a122002-07-19 02:35:45 +00002699
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002700 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002701 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002702 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002703 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002704 garbage[i] = selfitems[cur];
2705 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002706 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002707 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002708 }
2709
2710 for (i = 0; i < slicelength; i++) {
2711 Py_DECREF(garbage[i]);
2712 }
Tim Peters3b01a122002-07-19 02:35:45 +00002713
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002714 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002715 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002716
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002717 return 0;
2718 }
Tim Peters3b01a122002-07-19 02:35:45 +00002719 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002720 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002721 PyErr_Format(PyExc_TypeError,
2722 "list indices must be integers, not %.200s",
2723 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002724 return -1;
2725 }
2726}
2727
2728static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002729 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002730 (binaryfunc)list_subscript,
2731 (objobjargproc)list_ass_subscript
2732};
2733
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002734PyTypeObject PyList_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002735 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002736 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002737 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002738 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002739 (destructor)list_dealloc, /* tp_dealloc */
2740 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002741 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002742 0, /* tp_setattr */
2743 0, /* tp_compare */
2744 (reprfunc)list_repr, /* tp_repr */
2745 0, /* tp_as_number */
2746 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002747 &list_as_mapping, /* tp_as_mapping */
Nick Coghlan53663a62008-07-15 14:27:37 +00002748 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002749 0, /* tp_call */
2750 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002751 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002752 0, /* tp_setattro */
2753 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002754 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002755 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002756 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002757 (traverseproc)list_traverse, /* tp_traverse */
2758 (inquiry)list_clear, /* tp_clear */
2759 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002760 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002761 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002762 0, /* tp_iternext */
2763 list_methods, /* tp_methods */
2764 0, /* tp_members */
2765 0, /* tp_getset */
2766 0, /* tp_base */
2767 0, /* tp_dict */
2768 0, /* tp_descr_get */
2769 0, /* tp_descr_set */
2770 0, /* tp_dictoffset */
2771 (initproc)list_init, /* tp_init */
2772 PyType_GenericAlloc, /* tp_alloc */
2773 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002774 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002775};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002776
2777
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002778/*********************** List Iterator **************************/
2779
2780typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002781 PyObject_HEAD
2782 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002783 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002784} listiterobject;
2785
Anthony Baxter377be112006-04-11 06:54:30 +00002786static PyObject *list_iter(PyObject *);
2787static void listiter_dealloc(listiterobject *);
2788static int listiter_traverse(listiterobject *, visitproc, void *);
2789static PyObject *listiter_next(listiterobject *);
2790static PyObject *listiter_len(listiterobject *);
2791
2792PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2793
2794static PyMethodDef listiter_methods[] = {
2795 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2796 {NULL, NULL} /* sentinel */
2797};
2798
2799PyTypeObject PyListIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002800 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002801 "listiterator", /* tp_name */
2802 sizeof(listiterobject), /* tp_basicsize */
2803 0, /* tp_itemsize */
2804 /* methods */
2805 (destructor)listiter_dealloc, /* tp_dealloc */
2806 0, /* tp_print */
2807 0, /* tp_getattr */
2808 0, /* tp_setattr */
2809 0, /* tp_compare */
2810 0, /* tp_repr */
2811 0, /* tp_as_number */
2812 0, /* tp_as_sequence */
2813 0, /* tp_as_mapping */
2814 0, /* tp_hash */
2815 0, /* tp_call */
2816 0, /* tp_str */
2817 PyObject_GenericGetAttr, /* tp_getattro */
2818 0, /* tp_setattro */
2819 0, /* tp_as_buffer */
2820 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2821 0, /* tp_doc */
2822 (traverseproc)listiter_traverse, /* tp_traverse */
2823 0, /* tp_clear */
2824 0, /* tp_richcompare */
2825 0, /* tp_weaklistoffset */
2826 PyObject_SelfIter, /* tp_iter */
2827 (iternextfunc)listiter_next, /* tp_iternext */
2828 listiter_methods, /* tp_methods */
2829 0, /* tp_members */
2830};
2831
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002832
Guido van Rossum5086e492002-07-16 15:56:52 +00002833static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002834list_iter(PyObject *seq)
2835{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002836 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002837
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002838 if (!PyList_Check(seq)) {
2839 PyErr_BadInternalCall();
2840 return NULL;
2841 }
2842 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2843 if (it == NULL)
2844 return NULL;
2845 it->it_index = 0;
2846 Py_INCREF(seq);
2847 it->it_seq = (PyListObject *)seq;
2848 _PyObject_GC_TRACK(it);
2849 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002850}
2851
2852static void
2853listiter_dealloc(listiterobject *it)
2854{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002855 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002856 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002857 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002858}
2859
2860static int
2861listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2862{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002863 Py_VISIT(it->it_seq);
2864 return 0;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002865}
2866
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002867static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002868listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002869{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002870 PyListObject *seq;
2871 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002872
Tim Peters93b2cc42002-06-01 05:22:55 +00002873 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002874 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002875 if (seq == NULL)
2876 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002877 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002878
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002879 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002880 item = PyList_GET_ITEM(seq, it->it_index);
2881 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002882 Py_INCREF(item);
2883 return item;
2884 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002885
2886 Py_DECREF(seq);
2887 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002888 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002889}
2890
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002891static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +00002892listiter_len(listiterobject *it)
2893{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002894 Py_ssize_t len;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002895 if (it->it_seq) {
2896 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2897 if (len >= 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002898 return PyInt_FromSsize_t(len);
Raymond Hettinger40a03822004-04-12 13:05:09 +00002899 }
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002900 return PyInt_FromLong(0);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002901}
Anthony Baxter377be112006-04-11 06:54:30 +00002902/*********************** List Reverse Iterator **************************/
Raymond Hettinger435bf582004-03-18 22:43:10 +00002903
Anthony Baxter377be112006-04-11 06:54:30 +00002904typedef struct {
2905 PyObject_HEAD
2906 Py_ssize_t it_index;
2907 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2908} listreviterobject;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002909
Anthony Baxter377be112006-04-11 06:54:30 +00002910static PyObject *list_reversed(PyListObject *, PyObject *);
2911static void listreviter_dealloc(listreviterobject *);
2912static int listreviter_traverse(listreviterobject *, visitproc, void *);
2913static PyObject *listreviter_next(listreviterobject *);
Raymond Hettinger7989a4d2008-12-03 15:42:10 +00002914static PyObject *listreviter_len(listreviterobject *);
Anthony Baxter377be112006-04-11 06:54:30 +00002915
Raymond Hettinger7989a4d2008-12-03 15:42:10 +00002916static PyMethodDef listreviter_methods[] = {
2917 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
2918 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002919};
2920
Anthony Baxter377be112006-04-11 06:54:30 +00002921PyTypeObject PyListRevIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002922 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002923 "listreverseiterator", /* tp_name */
2924 sizeof(listreviterobject), /* tp_basicsize */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002925 0, /* tp_itemsize */
2926 /* methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002927 (destructor)listreviter_dealloc, /* tp_dealloc */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002928 0, /* tp_print */
2929 0, /* tp_getattr */
2930 0, /* tp_setattr */
2931 0, /* tp_compare */
2932 0, /* tp_repr */
2933 0, /* tp_as_number */
Raymond Hettinger7989a4d2008-12-03 15:42:10 +00002934 0, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002935 0, /* tp_as_mapping */
2936 0, /* tp_hash */
2937 0, /* tp_call */
2938 0, /* tp_str */
2939 PyObject_GenericGetAttr, /* tp_getattro */
2940 0, /* tp_setattro */
2941 0, /* tp_as_buffer */
2942 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2943 0, /* tp_doc */
Anthony Baxter377be112006-04-11 06:54:30 +00002944 (traverseproc)listreviter_traverse, /* tp_traverse */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002945 0, /* tp_clear */
2946 0, /* tp_richcompare */
2947 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002948 PyObject_SelfIter, /* tp_iter */
Anthony Baxter377be112006-04-11 06:54:30 +00002949 (iternextfunc)listreviter_next, /* tp_iternext */
Raymond Hettinger7989a4d2008-12-03 15:42:10 +00002950 listreviter_methods, /* tp_methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002951 0,
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002952};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002953
Raymond Hettinger1021c442003-11-07 15:38:09 +00002954static PyObject *
2955list_reversed(PyListObject *seq, PyObject *unused)
2956{
2957 listreviterobject *it;
2958
2959 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2960 if (it == NULL)
2961 return NULL;
2962 assert(PyList_Check(seq));
2963 it->it_index = PyList_GET_SIZE(seq) - 1;
2964 Py_INCREF(seq);
2965 it->it_seq = seq;
2966 PyObject_GC_Track(it);
2967 return (PyObject *)it;
2968}
2969
2970static void
2971listreviter_dealloc(listreviterobject *it)
2972{
2973 PyObject_GC_UnTrack(it);
2974 Py_XDECREF(it->it_seq);
2975 PyObject_GC_Del(it);
2976}
2977
2978static int
2979listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2980{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002981 Py_VISIT(it->it_seq);
2982 return 0;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002983}
2984
2985static PyObject *
2986listreviter_next(listreviterobject *it)
2987{
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002988 PyObject *item;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002989 Py_ssize_t index = it->it_index;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002990 PyListObject *seq = it->it_seq;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002991
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002992 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2993 item = PyList_GET_ITEM(seq, index);
Raymond Hettinger1021c442003-11-07 15:38:09 +00002994 it->it_index--;
2995 Py_INCREF(item);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002996 return item;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002997 }
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002998 it->it_index = -1;
2999 if (seq != NULL) {
3000 it->it_seq = NULL;
3001 Py_DECREF(seq);
3002 }
3003 return NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00003004}
3005
Raymond Hettinger7989a4d2008-12-03 15:42:10 +00003006static PyObject *
Raymond Hettingeref9bf402004-03-10 10:10:42 +00003007listreviter_len(listreviterobject *it)
3008{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003009 Py_ssize_t len = it->it_index + 1;
Raymond Hettinger40a03822004-04-12 13:05:09 +00003010 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
Raymond Hettinger7989a4d2008-12-03 15:42:10 +00003011 len = 0;
3012 return PyLong_FromSsize_t(len);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00003013}