blob: 40077a1b2b3686e733eb23638aab2b17b7ed727f [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 Heimes90aa7642007-12-19 02:45:37 +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 */
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +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 Heimes90aa7642007-12-19 02:45:37 +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 Heimes77c02eb2008-02-09 02:18:51 +000075/* Debug statistic to compare allocations with reuse through the free list */
76#undef SHOW_ALLOC_COUNT
77#ifdef SHOW_ALLOC_COUNT
78static size_t count_alloc = 0;
79static size_t count_reuse = 0;
80
81static void
82show_alloc(void)
83{
Christian Heimes23daade02008-02-25 12:39:23 +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 Heimes77c02eb2008-02-09 02:18:51 +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 Heimes2202f872008-02-06 14:31:34 +000094#ifndef PyList_MAXFREELIST
95#define PyList_MAXFREELIST 80
96#endif
97static PyListObject *free_list[PyList_MAXFREELIST];
98static int numfree = 0;
Raymond Hettinger0468e412004-05-05 05:37:53 +000099
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000100void
101PyList_Fini(void)
102{
103 PyListObject *op;
104
Christian Heimes2202f872008-02-06 14:31:34 +0000105 while (numfree) {
Christian Heimes77c02eb2008-02-09 02:18:51 +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 Heimes77c02eb2008-02-09 02:18:51 +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 *);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +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 Heimes2202f872008-02-06 14:31:34 +0000134 if (numfree) {
135 numfree--;
136 op = free_list[numfree];
Raymond Hettinger0468e412004-05-05 05:37:53 +0000137 _Py_NewReference((PyObject *)op);
Christian Heimes77c02eb2008-02-09 02:18:51 +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 Heimes77c02eb2008-02-09 02:18:51 +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);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000153 if (op->ob_item == NULL) {
154 Py_DECREF(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 return PyErr_NoMemory();
Thomas Wouters0e3f5912006-08-11 14:57:12 +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 Heimes90aa7642007-12-19 02:45:37 +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 Heimes90aa7642007-12-19 02:45:37 +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 Heimes90aa7642007-12-19 02:45:37 +0000185 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000186 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000187 indexerr = PyUnicode_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 Heimes90aa7642007-12-19 02:45:37 +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 Heimes90aa7642007-12-19 02:45:37 +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 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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 Heimes90aa7642007-12-19 02:45:37 +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 Heimes2202f872008-02-06 14:31:34 +0000310 if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
311 free_list[numfree++] = op;
Tim Petersb38e2b62004-07-29 02:29:26 +0000312 else
Christian Heimes90aa7642007-12-19 02:45:37 +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 Rossumc0b618a1997-05-02 03:12:38 +0000317static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000318list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000321 PyObject *s, *temp;
322 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000323
324 i = Py_ReprEnter((PyObject*)v);
325 if (i != 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000326 return i > 0 ? PyUnicode_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000327 }
Tim Petersa7259592001-06-16 05:11:17 +0000328
Christian Heimes90aa7642007-12-19 02:45:37 +0000329 if (Py_SIZE(v) == 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000330 result = PyUnicode_FromString("[]");
Tim Petersa7259592001-06-16 05:11:17 +0000331 goto Done;
332 }
333
334 pieces = PyList_New(0);
335 if (pieces == NULL)
336 goto Done;
337
338 /* Do repr() on each element. Note that this may mutate the list,
339 so must refetch the list size on each iteration. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000340 for (i = 0; i < Py_SIZE(v); ++i) {
Tim Petersa7259592001-06-16 05:11:17 +0000341 int status;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000342 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
343 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000344 s = PyObject_Repr(v->ob_item[i]);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000345 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000346 if (s == NULL)
347 goto Done;
348 status = PyList_Append(pieces, s);
349 Py_DECREF(s); /* append created a new ref */
350 if (status < 0)
351 goto Done;
352 }
353
354 /* Add "[]" decorations to the first and last items. */
355 assert(PyList_GET_SIZE(pieces) > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000356 s = PyUnicode_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000357 if (s == NULL)
358 goto Done;
359 temp = PyList_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000360 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000361 PyList_SET_ITEM(pieces, 0, s);
362 if (s == NULL)
363 goto Done;
364
Walter Dörwald1ab83302007-05-18 17:15:44 +0000365 s = PyUnicode_FromString("]");
Tim Petersa7259592001-06-16 05:11:17 +0000366 if (s == NULL)
367 goto Done;
368 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000369 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000370 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
371 if (temp == NULL)
372 goto Done;
373
374 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000375 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000376 if (s == NULL)
377 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000378 result = PyUnicode_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000379 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000380
381Done:
382 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000383 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000384 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385}
386
Martin v. Löwis18e16552006-02-15 17:27:45 +0000387static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000388list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389{
Christian Heimes90aa7642007-12-19 02:45:37 +0000390 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391}
392
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000393static int
Fred Drakea2f55112000-07-09 15:16:51 +0000394list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000395{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000396 Py_ssize_t i;
397 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000398
Christian Heimes90aa7642007-12-19 02:45:37 +0000399 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
Raymond Hettingeraae59992002-09-05 14:23:49 +0000400 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000401 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000402 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000403}
404
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000406list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407{
Christian Heimes90aa7642007-12-19 02:45:37 +0000408 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000409 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000410 indexerr = PyUnicode_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 "list index out of range");
412 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413 return NULL;
414 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416 return a->ob_item[i];
417}
418
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000420list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000423 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000424 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425 if (ilow < 0)
426 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000427 else if (ilow > Py_SIZE(a))
428 ilow = Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 if (ihigh < ilow)
430 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000431 else if (ihigh > Py_SIZE(a))
432 ihigh = Py_SIZE(a);
Raymond Hettinger99842b62004-03-08 05:56:15 +0000433 len = ihigh - ilow;
434 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435 if (np == NULL)
436 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000437
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000438 src = a->ob_item + ilow;
439 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000440 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000441 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000443 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446}
447
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000449PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000450{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 if (!PyList_Check(a)) {
452 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000453 return NULL;
454 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000456}
457
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000459list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000461 Py_ssize_t size;
462 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000463 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 PyListObject *np;
465 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000466 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000467 "can only concatenate list (not \"%.200s\") to list",
468 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469 return NULL;
470 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471#define b ((PyListObject *)bb)
Christian Heimes90aa7642007-12-19 02:45:37 +0000472 size = Py_SIZE(a) + Py_SIZE(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000473 if (size < 0)
474 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000477 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000479 src = a->ob_item;
480 dest = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000481 for (i = 0; i < Py_SIZE(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000482 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000484 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000486 src = b->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000487 dest = np->ob_item + Py_SIZE(a);
488 for (i = 0; i < Py_SIZE(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000489 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000491 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494#undef b
495}
496
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000498list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000499{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000500 Py_ssize_t i, j;
501 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000503 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000504 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000505 if (n < 0)
506 n = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000507 size = Py_SIZE(a) * n;
508 if (n && size/n != Py_SIZE(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000509 return PyErr_NoMemory();
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000510 if (size == 0)
Christian Heimesaf98da12008-01-27 15:18:18 +0000511 return PyList_New(0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000513 if (np == NULL)
514 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000515
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000516 items = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000517 if (Py_SIZE(a) == 1) {
Raymond Hettinger6624e682003-05-21 05:58:46 +0000518 elem = a->ob_item[0];
519 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000520 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000521 Py_INCREF(elem);
522 }
523 return (PyObject *) np;
524 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000525 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000526 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000527 for (i = 0; i < n; i++) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000528 for (j = 0; j < Py_SIZE(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000529 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000531 p++;
532 }
533 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000535}
536
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537static int
Armin Rigo93677f02004-07-29 12:40:23 +0000538list_clear(PyListObject *a)
539{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000540 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000541 PyObject **item = a->ob_item;
542 if (item != NULL) {
543 /* Because XDECREF can recursively invoke operations on
544 this list, we make it empty first. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000545 i = Py_SIZE(a);
546 Py_SIZE(a) = 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000547 a->ob_item = NULL;
548 a->allocated = 0;
549 while (--i >= 0) {
550 Py_XDECREF(item[i]);
551 }
552 PyMem_FREE(item);
553 }
554 /* Never fails; the return value can be ignored.
555 Note that there is no guarantee that the list is actually empty
556 at this point, because XDECREF may have populated it again! */
557 return 0;
558}
559
Tim Peters8fc4a912004-07-31 21:53:19 +0000560/* a[ilow:ihigh] = v if v != NULL.
561 * del a[ilow:ihigh] if v == NULL.
562 *
563 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
564 * guaranteed the call cannot fail.
565 */
Armin Rigo93677f02004-07-29 12:40:23 +0000566static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000567list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000569 /* Because [X]DECREF can recursively invoke list operations on
570 this list, we must postpone all [X]DECREF activity until
571 after the list is back in its canonical shape. Therefore
572 we must allocate an additional array, 'recycle', into which
573 we temporarily copy the items that are deleted from the
574 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000575 PyObject *recycle_on_stack[8];
576 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000578 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000579 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000580 Py_ssize_t n; /* # of elements in replacement list */
581 Py_ssize_t norig; /* # of elements in list getting replaced */
582 Py_ssize_t d; /* Change in size */
583 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000584 size_t s;
585 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000587 if (v == NULL)
588 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000589 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000590 if (a == b) {
591 /* Special case "a[i:j] = a" -- copy b first */
Christian Heimes90aa7642007-12-19 02:45:37 +0000592 v = list_slice(b, 0, Py_SIZE(b));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000593 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000594 return result;
595 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000597 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000598 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000599 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000600 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000601 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000602 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000603 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000604 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605 if (ilow < 0)
606 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000607 else if (ilow > Py_SIZE(a))
608 ilow = Py_SIZE(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000609
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000610 if (ihigh < ilow)
611 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000612 else if (ihigh > Py_SIZE(a))
613 ihigh = Py_SIZE(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000614
Tim Peters8d9eb102004-07-31 02:24:20 +0000615 norig = ihigh - ilow;
616 assert(norig >= 0);
617 d = n - norig;
Christian Heimes90aa7642007-12-19 02:45:37 +0000618 if (Py_SIZE(a) + d == 0) {
Armin Rigo93677f02004-07-29 12:40:23 +0000619 Py_XDECREF(v_as_SF);
620 return list_clear(a);
621 }
622 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000623 /* recycle the items that we are about to remove */
624 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000625 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000626 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000627 if (recycle == NULL) {
628 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000629 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000630 }
631 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000632 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000633
Armin Rigo1dd04a02004-07-30 11:38:22 +0000634 if (d < 0) { /* Delete -d items */
635 memmove(&item[ihigh+d], &item[ihigh],
Christian Heimes90aa7642007-12-19 02:45:37 +0000636 (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
637 list_resize(a, Py_SIZE(a) + d);
Armin Rigo1dd04a02004-07-30 11:38:22 +0000638 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000639 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000640 else if (d > 0) { /* Insert d items */
Christian Heimes90aa7642007-12-19 02:45:37 +0000641 k = Py_SIZE(a);
Tim Peters73572222004-07-31 02:54:42 +0000642 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000643 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000644 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000645 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000646 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647 }
648 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000649 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000651 item[ilow] = w;
652 }
Tim Peters73572222004-07-31 02:54:42 +0000653 for (k = norig - 1; k >= 0; --k)
654 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000655 result = 0;
656 Error:
Tim Peters73572222004-07-31 02:54:42 +0000657 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000658 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000659 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000660 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000661#undef b
662}
663
Guido van Rossum234f9421993-06-17 12:35:49 +0000664int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000665PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000666{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 if (!PyList_Check(a)) {
668 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000669 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000670 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000672}
673
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000674static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000675list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000676{
677 PyObject **items;
Christian Heimesaf98da12008-01-27 15:18:18 +0000678 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000679
680
681 size = PyList_GET_SIZE(self);
Christian Heimesaf98da12008-01-27 15:18:18 +0000682 if (size == 0 || n == 1) {
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000683 Py_INCREF(self);
684 return (PyObject *)self;
685 }
686
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000687 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000688 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000689 Py_INCREF(self);
690 return (PyObject *)self;
691 }
692
Christian Heimesaf98da12008-01-27 15:18:18 +0000693 if (size > PY_SSIZE_T_MAX / n) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000694 return PyErr_NoMemory();
Christian Heimesaf98da12008-01-27 15:18:18 +0000695 }
696
697 if (list_resize(self, size*n) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000698 return NULL;
699
700 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000701 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000702 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
703 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000704 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000705 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000706 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000707 }
708 }
709 Py_INCREF(self);
710 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000711}
712
Guido van Rossum4a450d01991-04-03 19:05:18 +0000713static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000714list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000715{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 PyObject *old_value;
Christian Heimes90aa7642007-12-19 02:45:37 +0000717 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyErr_SetString(PyExc_IndexError,
719 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000720 return -1;
721 }
722 if (v == NULL)
723 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000725 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000726 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000727 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000728 return 0;
729}
730
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000732listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000734 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000736 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000737 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000738 if (ins1(self, i, v) == 0)
739 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000740 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000741}
742
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000744listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000745{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000746 if (app1(self, v) == 0)
747 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000748 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000749}
750
Barry Warsawdedf6d61998-10-09 16:37:25 +0000751static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000752listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000753{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000754 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000755 Py_ssize_t m; /* size of self */
756 Py_ssize_t n; /* guess for size of b */
757 Py_ssize_t mn; /* m + n */
758 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000759 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000760
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000761 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000762 1) lists and tuples which can use PySequence_Fast ops
763 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000764 */
765 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000766 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000767 b = PySequence_Fast(b, "argument must be iterable");
768 if (!b)
769 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000770 n = PySequence_Fast_GET_SIZE(b);
771 if (n == 0) {
772 /* short circuit when b is empty */
773 Py_DECREF(b);
774 Py_RETURN_NONE;
775 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000776 m = Py_SIZE(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000777 if (list_resize(self, m + n) == -1) {
778 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000779 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000780 }
781 /* note that we may still have self == b here for the
782 * situation a.extend(a), but the following code works
783 * in that case too. Just make sure to resize self
784 * before calling PySequence_Fast_ITEMS.
785 */
786 /* populate the end of self with b's items */
787 src = PySequence_Fast_ITEMS(b);
788 dest = self->ob_item + m;
789 for (i = 0; i < n; i++) {
790 PyObject *o = src[i];
791 Py_INCREF(o);
792 dest[i] = o;
793 }
794 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000795 Py_RETURN_NONE;
796 }
797
798 it = PyObject_GetIter(b);
799 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000800 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000801 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000802
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000803 /* Guess a result list size. */
Christian Heimes255f53b2007-12-08 15:33:56 +0000804 n = _PyObject_LengthHint(b, 8);
Christian Heimes90aa7642007-12-19 02:45:37 +0000805 m = Py_SIZE(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000806 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000807 if (mn >= m) {
808 /* Make room. */
809 if (list_resize(self, mn) == -1)
810 goto error;
811 /* Make the list sane again. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000812 Py_SIZE(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000813 }
814 /* Else m + n overflowed; on the chance that n lied, and there really
815 * is enough room, ignore it. If n was telling the truth, we'll
816 * eventually run out of memory during the loop.
817 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000818
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000819 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000820 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000821 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000822 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000823 if (PyErr_Occurred()) {
824 if (PyErr_ExceptionMatches(PyExc_StopIteration))
825 PyErr_Clear();
826 else
827 goto error;
828 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000829 break;
830 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000831 if (Py_SIZE(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000832 /* steals ref */
Christian Heimes90aa7642007-12-19 02:45:37 +0000833 PyList_SET_ITEM(self, Py_SIZE(self), item);
834 ++Py_SIZE(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000835 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000836 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000837 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000838 Py_DECREF(item); /* append creates a new ref */
839 if (status < 0)
840 goto error;
841 }
842 }
843
844 /* Cut back result list if initial guess was too large. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000845 if (Py_SIZE(self) < self->allocated)
846 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000847
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000848 Py_DECREF(it);
849 Py_RETURN_NONE;
850
851 error:
852 Py_DECREF(it);
853 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000854}
855
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000856PyObject *
857_PyList_Extend(PyListObject *self, PyObject *b)
858{
859 return listextend(self, b);
860}
861
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000862static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000863list_inplace_concat(PyListObject *self, PyObject *other)
864{
865 PyObject *result;
866
867 result = listextend(self, other);
868 if (result == NULL)
869 return result;
870 Py_DECREF(result);
871 Py_INCREF(self);
872 return (PyObject *)self;
873}
874
875static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000876listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000877{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000878 Py_ssize_t i = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000879 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000880 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000881
Thomas Wouters89f507f2006-12-13 04:49:30 +0000882 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000883 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000884
Christian Heimes90aa7642007-12-19 02:45:37 +0000885 if (Py_SIZE(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000886 /* Special-case most common failure cause */
887 PyErr_SetString(PyExc_IndexError, "pop from empty list");
888 return NULL;
889 }
890 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000891 i += Py_SIZE(self);
892 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000893 PyErr_SetString(PyExc_IndexError, "pop index out of range");
894 return NULL;
895 }
896 v = self->ob_item[i];
Christian Heimes90aa7642007-12-19 02:45:37 +0000897 if (i == Py_SIZE(self) - 1) {
898 status = list_resize(self, Py_SIZE(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000899 assert(status >= 0);
900 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000901 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000902 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000903 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
904 assert(status >= 0);
905 /* Use status, so that in a release build compilers don't
906 * complain about the unused name.
907 */
Brett Cannon651dd522004-08-08 21:21:18 +0000908 (void) status;
909
910 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000911}
912
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000913/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
914static void
915reverse_slice(PyObject **lo, PyObject **hi)
916{
917 assert(lo && hi);
918
919 --hi;
920 while (lo < hi) {
921 PyObject *t = *lo;
922 *lo = *hi;
923 *hi = t;
924 ++lo;
925 --hi;
926 }
927}
928
Tim Petersa64dc242002-08-01 02:13:36 +0000929/* Lots of code for an adaptive, stable, natural mergesort. There are many
930 * pieces to this algorithm; read listsort.txt for overviews and details.
931 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000932
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000933/* Comparison function: PyObject_RichCompareBool with Py_LT.
Tim Petersa64dc242002-08-01 02:13:36 +0000934 * Returns -1 on error, 1 if x < y, 0 if x >= y.
935 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000936
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000937#define ISLT(X, Y) (PyObject_RichCompareBool(X, Y, Py_LT))
Tim Peters66860f62002-08-04 17:47:26 +0000938
939/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000940 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
941 started. It makes more sense in context <wink>. X and Y are PyObject*s.
942*/
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000943#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000944 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000945
946/* binarysort is the best method for sorting small arrays: it does
947 few compares, but can do data movement quadratic in the number of
948 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000949 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000950 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000951 On entry, must have lo <= start <= hi, and that [lo, start) is already
952 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000953 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000954 Even in case of error, the output slice will be some permutation of
955 the input (nothing is lost or duplicated).
956*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000957static int
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000958binarysort(PyObject **lo, PyObject **hi, PyObject **start)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000959{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000960 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000961 register PyObject **l, **p, **r;
962 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000963
Tim Petersa8c974c2002-07-19 03:30:57 +0000964 assert(lo <= start && start <= hi);
965 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000966 if (lo == start)
967 ++start;
968 for (; start < hi; ++start) {
969 /* set l to where *start belongs */
970 l = lo;
971 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000972 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000973 /* Invariants:
974 * pivot >= all in [lo, l).
975 * pivot < all in [r, start).
976 * The second is vacuously true at the start.
977 */
978 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000979 do {
980 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000981 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000982 r = p;
983 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000984 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000985 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000986 assert(l == r);
987 /* The invariants still hold, so pivot >= all in [lo, l) and
988 pivot < all in [l, start), so pivot belongs at l. Note
989 that if there are elements equal to pivot, l points to the
990 first slot after them -- that's why this sort is stable.
991 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000992 Caution: using memmove is much slower under MSVC 5;
993 we're not usually moving many slots. */
994 for (p = start; p > l; --p)
995 *p = *(p-1);
996 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000997 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000998 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000999
1000 fail:
1001 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001002}
1003
Tim Petersa64dc242002-08-01 02:13:36 +00001004/*
1005Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1006is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001007
Tim Petersa64dc242002-08-01 02:13:36 +00001008 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001009
Tim Petersa64dc242002-08-01 02:13:36 +00001010or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001011
Tim Petersa64dc242002-08-01 02:13:36 +00001012 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001013
Tim Petersa64dc242002-08-01 02:13:36 +00001014Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1015For its intended use in a stable mergesort, the strictness of the defn of
1016"descending" is needed so that the caller can safely reverse a descending
1017sequence without violating stability (strict > ensures there are no equal
1018elements to get out of order).
1019
1020Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001021*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001022static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001023count_run(PyObject **lo, PyObject **hi, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001024{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001025 Py_ssize_t k;
1026 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001027
Tim Petersa64dc242002-08-01 02:13:36 +00001028 assert(lo < hi);
1029 *descending = 0;
1030 ++lo;
1031 if (lo == hi)
1032 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001033
Tim Petersa64dc242002-08-01 02:13:36 +00001034 n = 2;
1035 IFLT(*lo, *(lo-1)) {
1036 *descending = 1;
1037 for (lo = lo+1; lo < hi; ++lo, ++n) {
1038 IFLT(*lo, *(lo-1))
1039 ;
1040 else
1041 break;
1042 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001043 }
Tim Petersa64dc242002-08-01 02:13:36 +00001044 else {
1045 for (lo = lo+1; lo < hi; ++lo, ++n) {
1046 IFLT(*lo, *(lo-1))
1047 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001048 }
1049 }
1050
Tim Petersa64dc242002-08-01 02:13:36 +00001051 return n;
1052fail:
1053 return -1;
1054}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001055
Tim Petersa64dc242002-08-01 02:13:36 +00001056/*
1057Locate the proper position of key in a sorted vector; if the vector contains
1058an element equal to key, return the position immediately to the left of
1059the leftmost equal element. [gallop_right() does the same except returns
1060the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001061
Tim Petersa64dc242002-08-01 02:13:36 +00001062"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001063
Tim Petersa64dc242002-08-01 02:13:36 +00001064"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1065hint is to the final result, the faster this runs.
1066
1067The return value is the int k in 0..n such that
1068
1069 a[k-1] < key <= a[k]
1070
1071pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1072key belongs at index k; or, IOW, the first k elements of a should precede
1073key, and the last n-k should follow key.
1074
1075Returns -1 on error. See listsort.txt for info on the method.
1076*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001077static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001078gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001079{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001080 Py_ssize_t ofs;
1081 Py_ssize_t lastofs;
1082 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001083
1084 assert(key && a && n > 0 && hint >= 0 && hint < n);
1085
1086 a += hint;
1087 lastofs = 0;
1088 ofs = 1;
1089 IFLT(*a, key) {
1090 /* a[hint] < key -- gallop right, until
1091 * a[hint + lastofs] < key <= a[hint + ofs]
1092 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001093 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001094 while (ofs < maxofs) {
1095 IFLT(a[ofs], key) {
1096 lastofs = ofs;
1097 ofs = (ofs << 1) + 1;
1098 if (ofs <= 0) /* int overflow */
1099 ofs = maxofs;
1100 }
1101 else /* key <= a[hint + ofs] */
1102 break;
1103 }
1104 if (ofs > maxofs)
1105 ofs = maxofs;
1106 /* Translate back to offsets relative to &a[0]. */
1107 lastofs += hint;
1108 ofs += hint;
1109 }
1110 else {
1111 /* key <= a[hint] -- gallop left, until
1112 * a[hint - ofs] < key <= a[hint - lastofs]
1113 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001114 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001115 while (ofs < maxofs) {
1116 IFLT(*(a-ofs), key)
1117 break;
1118 /* key <= a[hint - ofs] */
1119 lastofs = ofs;
1120 ofs = (ofs << 1) + 1;
1121 if (ofs <= 0) /* int overflow */
1122 ofs = maxofs;
1123 }
1124 if (ofs > maxofs)
1125 ofs = maxofs;
1126 /* Translate back to positive offsets relative to &a[0]. */
1127 k = lastofs;
1128 lastofs = hint - ofs;
1129 ofs = hint - k;
1130 }
1131 a -= hint;
1132
1133 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1134 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1135 * right of lastofs but no farther right than ofs. Do a binary
1136 * search, with invariant a[lastofs-1] < key <= a[ofs].
1137 */
1138 ++lastofs;
1139 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001140 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001141
1142 IFLT(a[m], key)
1143 lastofs = m+1; /* a[m] < key */
1144 else
1145 ofs = m; /* key <= a[m] */
1146 }
1147 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1148 return ofs;
1149
1150fail:
1151 return -1;
1152}
1153
1154/*
1155Exactly like gallop_left(), except that if key already exists in a[0:n],
1156finds the position immediately to the right of the rightmost equal value.
1157
1158The return value is the int k in 0..n such that
1159
1160 a[k-1] <= key < a[k]
1161
1162or -1 if error.
1163
1164The code duplication is massive, but this is enough different given that
1165we're sticking to "<" comparisons that it's much harder to follow if
1166written as one routine with yet another "left or right?" flag.
1167*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001168static Py_ssize_t
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001169gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
Tim Petersa64dc242002-08-01 02:13:36 +00001170{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001171 Py_ssize_t ofs;
1172 Py_ssize_t lastofs;
1173 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001174
1175 assert(key && a && n > 0 && hint >= 0 && hint < n);
1176
1177 a += hint;
1178 lastofs = 0;
1179 ofs = 1;
1180 IFLT(key, *a) {
1181 /* key < a[hint] -- gallop left, until
1182 * a[hint - ofs] <= key < a[hint - lastofs]
1183 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001184 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001185 while (ofs < maxofs) {
1186 IFLT(key, *(a-ofs)) {
1187 lastofs = ofs;
1188 ofs = (ofs << 1) + 1;
1189 if (ofs <= 0) /* int overflow */
1190 ofs = maxofs;
1191 }
1192 else /* a[hint - ofs] <= key */
1193 break;
1194 }
1195 if (ofs > maxofs)
1196 ofs = maxofs;
1197 /* Translate back to positive offsets relative to &a[0]. */
1198 k = lastofs;
1199 lastofs = hint - ofs;
1200 ofs = hint - k;
1201 }
1202 else {
1203 /* a[hint] <= key -- gallop right, until
1204 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001205 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001206 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001207 while (ofs < maxofs) {
1208 IFLT(key, a[ofs])
1209 break;
1210 /* a[hint + ofs] <= key */
1211 lastofs = ofs;
1212 ofs = (ofs << 1) + 1;
1213 if (ofs <= 0) /* int overflow */
1214 ofs = maxofs;
1215 }
1216 if (ofs > maxofs)
1217 ofs = maxofs;
1218 /* Translate back to offsets relative to &a[0]. */
1219 lastofs += hint;
1220 ofs += hint;
1221 }
1222 a -= hint;
1223
1224 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1225 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1226 * right of lastofs but no farther right than ofs. Do a binary
1227 * search, with invariant a[lastofs-1] <= key < a[ofs].
1228 */
1229 ++lastofs;
1230 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001231 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001232
1233 IFLT(key, a[m])
1234 ofs = m; /* key < a[m] */
1235 else
1236 lastofs = m+1; /* a[m] <= key */
1237 }
1238 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1239 return ofs;
1240
1241fail:
1242 return -1;
1243}
1244
1245/* The maximum number of entries in a MergeState's pending-runs stack.
1246 * This is enough to sort arrays of size up to about
1247 * 32 * phi ** MAX_MERGE_PENDING
1248 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1249 * with 2**64 elements.
1250 */
1251#define MAX_MERGE_PENDING 85
1252
Tim Peterse05f65a2002-08-10 05:21:15 +00001253/* When we get into galloping mode, we stay there until both runs win less
1254 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001255 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001256#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001257
1258/* Avoid malloc for small temp arrays. */
1259#define MERGESTATE_TEMP_SIZE 256
1260
1261/* One MergeState exists on the stack per invocation of mergesort. It's just
1262 * a convenient way to pass state around among the helper functions.
1263 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001264struct s_slice {
1265 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001266 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001267};
1268
Tim Petersa64dc242002-08-01 02:13:36 +00001269typedef struct s_MergeState {
Tim Peterse05f65a2002-08-10 05:21:15 +00001270 /* This controls when we get *into* galloping mode. It's initialized
1271 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1272 * random data, and lower for highly structured data.
1273 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001274 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001275
Tim Petersa64dc242002-08-01 02:13:36 +00001276 /* 'a' is temp storage to help with merges. It contains room for
1277 * alloced entries.
1278 */
1279 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001280 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001281
1282 /* A stack of n pending runs yet to be merged. Run #i starts at
1283 * address base[i] and extends for len[i] elements. It's always
1284 * true (so long as the indices are in bounds) that
1285 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001286 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001287 *
1288 * so we could cut the storage for this, but it's a minor amount,
1289 * and keeping all the info explicit simplifies the code.
1290 */
1291 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001292 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001293
1294 /* 'a' points to this when possible, rather than muck with malloc. */
1295 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1296} MergeState;
1297
1298/* Conceptually a MergeState's constructor. */
1299static void
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001300merge_init(MergeState *ms)
Tim Petersa64dc242002-08-01 02:13:36 +00001301{
1302 assert(ms != NULL);
Tim Petersa64dc242002-08-01 02:13:36 +00001303 ms->a = ms->temparray;
1304 ms->alloced = MERGESTATE_TEMP_SIZE;
1305 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001306 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001307}
1308
1309/* Free all the temp memory owned by the MergeState. This must be called
1310 * when you're done with a MergeState, and may be called before then if
1311 * you want to free the temp memory early.
1312 */
1313static void
1314merge_freemem(MergeState *ms)
1315{
1316 assert(ms != NULL);
1317 if (ms->a != ms->temparray)
1318 PyMem_Free(ms->a);
1319 ms->a = ms->temparray;
1320 ms->alloced = MERGESTATE_TEMP_SIZE;
1321}
1322
1323/* Ensure enough temp memory for 'need' array slots is available.
1324 * Returns 0 on success and -1 if the memory can't be gotten.
1325 */
1326static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001327merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001328{
1329 assert(ms != NULL);
1330 if (need <= ms->alloced)
1331 return 0;
1332 /* Don't realloc! That can cost cycles to copy the old data, but
1333 * we don't care what's in the block.
1334 */
1335 merge_freemem(ms);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001336 if (need > PY_SSIZE_T_MAX / sizeof(PyObject*)) {
1337 PyErr_NoMemory();
1338 return -1;
1339 }
Tim Petersa64dc242002-08-01 02:13:36 +00001340 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1341 if (ms->a) {
1342 ms->alloced = need;
1343 return 0;
1344 }
1345 PyErr_NoMemory();
1346 merge_freemem(ms); /* reset to sane state */
1347 return -1;
1348}
1349#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1350 merge_getmem(MS, NEED))
1351
1352/* Merge the na elements starting at pa with the nb elements starting at pb
1353 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1354 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1355 * merge, and should have na <= nb. See listsort.txt for more info.
1356 * Return 0 if successful, -1 if error.
1357 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001358static Py_ssize_t
1359merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1360 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001361{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001362 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001363 PyObject **dest;
1364 int result = -1; /* guilty until proved innocent */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001365 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001366
1367 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1368 if (MERGE_GETMEM(ms, na) < 0)
1369 return -1;
1370 memcpy(ms->a, pa, na * sizeof(PyObject*));
1371 dest = pa;
1372 pa = ms->a;
1373
1374 *dest++ = *pb++;
1375 --nb;
1376 if (nb == 0)
1377 goto Succeed;
1378 if (na == 1)
1379 goto CopyB;
1380
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001381 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001382 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001383 Py_ssize_t acount = 0; /* # of times A won in a row */
1384 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001385
1386 /* Do the straightforward thing until (if ever) one run
1387 * appears to win consistently.
1388 */
1389 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001390 assert(na > 1 && nb > 0);
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001391 k = ISLT(*pb, *pa);
Tim Petersa64dc242002-08-01 02:13:36 +00001392 if (k) {
1393 if (k < 0)
1394 goto Fail;
1395 *dest++ = *pb++;
1396 ++bcount;
1397 acount = 0;
1398 --nb;
1399 if (nb == 0)
1400 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001401 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001402 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001403 }
1404 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001405 *dest++ = *pa++;
1406 ++acount;
1407 bcount = 0;
1408 --na;
1409 if (na == 1)
1410 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001411 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001412 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001413 }
Tim Petersa64dc242002-08-01 02:13:36 +00001414 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001415
Tim Petersa64dc242002-08-01 02:13:36 +00001416 /* One run is winning so consistently that galloping may
1417 * be a huge win. So try that, and continue galloping until
1418 * (if ever) neither run appears to be winning consistently
1419 * anymore.
1420 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001421 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001422 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001423 assert(na > 1 && nb > 0);
1424 min_gallop -= min_gallop > 1;
1425 ms->min_gallop = min_gallop;
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001426 k = gallop_right(*pb, pa, na, 0);
Tim Petersa64dc242002-08-01 02:13:36 +00001427 acount = k;
1428 if (k) {
1429 if (k < 0)
1430 goto Fail;
1431 memcpy(dest, pa, k * sizeof(PyObject *));
1432 dest += k;
1433 pa += k;
1434 na -= k;
1435 if (na == 1)
1436 goto CopyB;
1437 /* na==0 is impossible now if the comparison
1438 * function is consistent, but we can't assume
1439 * that it is.
1440 */
1441 if (na == 0)
1442 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001443 }
Tim Petersa64dc242002-08-01 02:13:36 +00001444 *dest++ = *pb++;
1445 --nb;
1446 if (nb == 0)
1447 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001448
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001449 k = gallop_left(*pa, pb, nb, 0);
Tim Petersa64dc242002-08-01 02:13:36 +00001450 bcount = k;
1451 if (k) {
1452 if (k < 0)
1453 goto Fail;
1454 memmove(dest, pb, k * sizeof(PyObject *));
1455 dest += k;
1456 pb += k;
1457 nb -= k;
1458 if (nb == 0)
1459 goto Succeed;
1460 }
1461 *dest++ = *pa++;
1462 --na;
1463 if (na == 1)
1464 goto CopyB;
1465 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001466 ++min_gallop; /* penalize it for leaving galloping mode */
1467 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001468 }
1469Succeed:
1470 result = 0;
1471Fail:
1472 if (na)
1473 memcpy(dest, pa, na * sizeof(PyObject*));
1474 return result;
1475CopyB:
1476 assert(na == 1 && nb > 0);
1477 /* The last element of pa belongs at the end of the merge. */
1478 memmove(dest, pb, nb * sizeof(PyObject *));
1479 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001480 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001481}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001482
Tim Petersa64dc242002-08-01 02:13:36 +00001483/* Merge the na elements starting at pa with the nb elements starting at pb
1484 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1485 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1486 * merge, and should have na >= nb. See listsort.txt for more info.
1487 * Return 0 if successful, -1 if error.
1488 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001489static Py_ssize_t
1490merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001491{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001492 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001493 PyObject **dest;
1494 int result = -1; /* guilty until proved innocent */
1495 PyObject **basea;
1496 PyObject **baseb;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001497 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001498
1499 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1500 if (MERGE_GETMEM(ms, nb) < 0)
1501 return -1;
1502 dest = pb + nb - 1;
1503 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1504 basea = pa;
1505 baseb = ms->a;
1506 pb = ms->a + nb - 1;
1507 pa += na - 1;
1508
1509 *dest-- = *pa--;
1510 --na;
1511 if (na == 0)
1512 goto Succeed;
1513 if (nb == 1)
1514 goto CopyA;
1515
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001516 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001517 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001518 Py_ssize_t acount = 0; /* # of times A won in a row */
1519 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001520
1521 /* Do the straightforward thing until (if ever) one run
1522 * appears to win consistently.
1523 */
1524 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001525 assert(na > 0 && nb > 1);
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001526 k = ISLT(*pb, *pa);
Tim Petersa64dc242002-08-01 02:13:36 +00001527 if (k) {
1528 if (k < 0)
1529 goto Fail;
1530 *dest-- = *pa--;
1531 ++acount;
1532 bcount = 0;
1533 --na;
1534 if (na == 0)
1535 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001536 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001537 break;
1538 }
1539 else {
1540 *dest-- = *pb--;
1541 ++bcount;
1542 acount = 0;
1543 --nb;
1544 if (nb == 1)
1545 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001546 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001547 break;
1548 }
1549 }
1550
1551 /* One run is winning so consistently that galloping may
1552 * be a huge win. So try that, and continue galloping until
1553 * (if ever) neither run appears to be winning consistently
1554 * anymore.
1555 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001556 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001557 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001558 assert(na > 0 && nb > 1);
1559 min_gallop -= min_gallop > 1;
1560 ms->min_gallop = min_gallop;
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001561 k = gallop_right(*pb, basea, na, na-1);
Tim Petersa64dc242002-08-01 02:13:36 +00001562 if (k < 0)
1563 goto Fail;
1564 k = na - k;
1565 acount = k;
1566 if (k) {
1567 dest -= k;
1568 pa -= k;
1569 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1570 na -= k;
1571 if (na == 0)
1572 goto Succeed;
1573 }
1574 *dest-- = *pb--;
1575 --nb;
1576 if (nb == 1)
1577 goto CopyA;
1578
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001579 k = gallop_left(*pa, baseb, nb, nb-1);
Tim Petersa64dc242002-08-01 02:13:36 +00001580 if (k < 0)
1581 goto Fail;
1582 k = nb - k;
1583 bcount = k;
1584 if (k) {
1585 dest -= k;
1586 pb -= k;
1587 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1588 nb -= k;
1589 if (nb == 1)
1590 goto CopyA;
1591 /* nb==0 is impossible now if the comparison
1592 * function is consistent, but we can't assume
1593 * that it is.
1594 */
1595 if (nb == 0)
1596 goto Succeed;
1597 }
1598 *dest-- = *pa--;
1599 --na;
1600 if (na == 0)
1601 goto Succeed;
1602 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001603 ++min_gallop; /* penalize it for leaving galloping mode */
1604 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001605 }
1606Succeed:
1607 result = 0;
1608Fail:
1609 if (nb)
1610 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1611 return result;
1612CopyA:
1613 assert(nb == 1 && na > 0);
1614 /* The first element of pb belongs at the front of the merge. */
1615 dest -= na;
1616 pa -= na;
1617 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1618 *dest = *pb;
1619 return 0;
1620}
1621
1622/* Merge the two runs at stack indices i and i+1.
1623 * Returns 0 on success, -1 on error.
1624 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001625static Py_ssize_t
1626merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001627{
1628 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001629 Py_ssize_t na, nb;
1630 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001631
1632 assert(ms != NULL);
1633 assert(ms->n >= 2);
1634 assert(i >= 0);
1635 assert(i == ms->n - 2 || i == ms->n - 3);
1636
Tim Peterse05f65a2002-08-10 05:21:15 +00001637 pa = ms->pending[i].base;
1638 na = ms->pending[i].len;
1639 pb = ms->pending[i+1].base;
1640 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001641 assert(na > 0 && nb > 0);
1642 assert(pa + na == pb);
1643
1644 /* Record the length of the combined runs; if i is the 3rd-last
1645 * run now, also slide over the last run (which isn't involved
1646 * in this merge). The current run i+1 goes away in any case.
1647 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001648 ms->pending[i].len = na + nb;
1649 if (i == ms->n - 3)
1650 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001651 --ms->n;
1652
1653 /* Where does b start in a? Elements in a before that can be
1654 * ignored (already in place).
1655 */
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001656 k = gallop_right(*pb, pa, na, 0);
Tim Petersa64dc242002-08-01 02:13:36 +00001657 if (k < 0)
1658 return -1;
1659 pa += k;
1660 na -= k;
1661 if (na == 0)
1662 return 0;
1663
1664 /* Where does a end in b? Elements in b after that can be
1665 * ignored (already in place).
1666 */
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001667 nb = gallop_left(pa[na-1], pb, nb, nb-1);
Tim Petersa64dc242002-08-01 02:13:36 +00001668 if (nb <= 0)
1669 return nb;
1670
1671 /* Merge what remains of the runs, using a temp array with
1672 * min(na, nb) elements.
1673 */
1674 if (na <= nb)
1675 return merge_lo(ms, pa, na, pb, nb);
1676 else
1677 return merge_hi(ms, pa, na, pb, nb);
1678}
1679
1680/* Examine the stack of runs waiting to be merged, merging adjacent runs
1681 * until the stack invariants are re-established:
1682 *
1683 * 1. len[-3] > len[-2] + len[-1]
1684 * 2. len[-2] > len[-1]
1685 *
1686 * See listsort.txt for more info.
1687 *
1688 * Returns 0 on success, -1 on error.
1689 */
1690static int
1691merge_collapse(MergeState *ms)
1692{
Tim Peterse05f65a2002-08-10 05:21:15 +00001693 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001694
1695 assert(ms);
1696 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001697 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001698 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1699 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001700 --n;
1701 if (merge_at(ms, n) < 0)
1702 return -1;
1703 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001704 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001705 if (merge_at(ms, n) < 0)
1706 return -1;
1707 }
1708 else
1709 break;
1710 }
1711 return 0;
1712}
1713
1714/* Regardless of invariants, merge all runs on the stack until only one
1715 * remains. This is used at the end of the mergesort.
1716 *
1717 * Returns 0 on success, -1 on error.
1718 */
1719static int
1720merge_force_collapse(MergeState *ms)
1721{
Tim Peterse05f65a2002-08-10 05:21:15 +00001722 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001723
1724 assert(ms);
1725 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001726 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001727 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001728 --n;
1729 if (merge_at(ms, n) < 0)
1730 return -1;
1731 }
1732 return 0;
1733}
1734
1735/* Compute a good value for the minimum run length; natural runs shorter
1736 * than this are boosted artificially via binary insertion.
1737 *
1738 * If n < 64, return n (it's too small to bother with fancy stuff).
1739 * Else if n is an exact power of 2, return 32.
1740 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1741 * strictly less than, an exact power of 2.
1742 *
1743 * See listsort.txt for more info.
1744 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001745static Py_ssize_t
1746merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001747{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001748 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001749
1750 assert(n >= 0);
1751 while (n >= 64) {
1752 r |= n & 1;
1753 n >>= 1;
1754 }
1755 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001756}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001757
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001758/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001759 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001760 which is returned during the undecorate phase. By exposing only the key
1761 during comparisons, the underlying sort stability characteristics are left
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001762 unchanged. Also, the comparison function will only see the key instead of
1763 a full record. */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001764
1765typedef struct {
1766 PyObject_HEAD
1767 PyObject *key;
1768 PyObject *value;
1769} sortwrapperobject;
1770
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001771PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001772static PyObject *
1773sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1774static void
1775sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001776
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001777PyTypeObject PySortWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001778 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001779 "sortwrapper", /* tp_name */
1780 sizeof(sortwrapperobject), /* tp_basicsize */
1781 0, /* tp_itemsize */
1782 /* methods */
1783 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1784 0, /* tp_print */
1785 0, /* tp_getattr */
1786 0, /* tp_setattr */
1787 0, /* tp_compare */
1788 0, /* tp_repr */
1789 0, /* tp_as_number */
1790 0, /* tp_as_sequence */
1791 0, /* tp_as_mapping */
1792 0, /* tp_hash */
1793 0, /* tp_call */
1794 0, /* tp_str */
1795 PyObject_GenericGetAttr, /* tp_getattro */
1796 0, /* tp_setattro */
1797 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001798 Py_TPFLAGS_DEFAULT, /* tp_flags */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001799 sortwrapper_doc, /* tp_doc */
1800 0, /* tp_traverse */
1801 0, /* tp_clear */
1802 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1803};
1804
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805
1806static PyObject *
1807sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1808{
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001809 if (!PyObject_TypeCheck(b, &PySortWrapper_Type)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001810 PyErr_SetString(PyExc_TypeError,
1811 "expected a sortwrapperobject");
1812 return NULL;
1813 }
1814 return PyObject_RichCompare(a->key, b->key, op);
1815}
1816
1817static void
1818sortwrapper_dealloc(sortwrapperobject *so)
1819{
1820 Py_XDECREF(so->key);
1821 Py_XDECREF(so->value);
1822 PyObject_Del(so);
1823}
1824
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001825/* Returns a new reference to a sortwrapper.
1826 Consumes the references to the two underlying objects. */
1827
1828static PyObject *
1829build_sortwrapper(PyObject *key, PyObject *value)
1830{
1831 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001832
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001833 so = PyObject_New(sortwrapperobject, &PySortWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001834 if (so == NULL)
1835 return NULL;
1836 so->key = key;
1837 so->value = value;
1838 return (PyObject *)so;
1839}
1840
1841/* Returns a new reference to the value underlying the wrapper. */
1842static PyObject *
1843sortwrapper_getvalue(PyObject *so)
1844{
1845 PyObject *value;
1846
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001847 if (!PyObject_TypeCheck(so, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001848 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001849 "expected a sortwrapperobject");
1850 return NULL;
1851 }
1852 value = ((sortwrapperobject *)so)->value;
1853 Py_INCREF(value);
1854 return value;
1855}
1856
Tim Petersa64dc242002-08-01 02:13:36 +00001857/* An adaptive, stable, natural mergesort. See listsort.txt.
1858 * Returns Py_None on success, NULL on error. Even in case of error, the
1859 * list will be some permutation of its input state (nothing is lost or
1860 * duplicated).
1861 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001862static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001863listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001864{
Tim Petersa64dc242002-08-01 02:13:36 +00001865 MergeState ms;
1866 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001867 Py_ssize_t nremaining;
1868 Py_ssize_t minrun;
1869 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001870 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001871 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001872 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001873 int reverse = 0;
1874 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001875 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001876 PyObject *key, *value, *kvpair;
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001877 static char *kwlist[] = {"key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001878
Tim Petersa64dc242002-08-01 02:13:36 +00001879 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001880 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001881 if (args != NULL) {
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001882 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1883 kwlist, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001884 return NULL;
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001885 if (Py_SIZE(args) > 0) {
1886 PyErr_SetString(PyExc_TypeError,
1887 "must use keyword argument for key function");
1888 return NULL;
1889 }
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001890 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001891 if (keyfunc == Py_None)
1892 keyfunc = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001893
Tim Petersb9099c32002-11-12 22:08:10 +00001894 /* The list is temporarily made empty, so that mutations performed
1895 * by comparison functions can't affect the slice of memory we're
1896 * sorting (allowing mutations during sorting is a core-dump
1897 * factory, since ob_item may change).
1898 */
Christian Heimes90aa7642007-12-19 02:45:37 +00001899 saved_ob_size = Py_SIZE(self);
Tim Petersb9099c32002-11-12 22:08:10 +00001900 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00001901 saved_allocated = self->allocated;
Christian Heimes90aa7642007-12-19 02:45:37 +00001902 Py_SIZE(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00001903 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00001904 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00001905
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001906 if (keyfunc != NULL) {
1907 for (i=0 ; i < saved_ob_size ; i++) {
1908 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00001909 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001910 NULL);
1911 if (key == NULL) {
1912 for (i=i-1 ; i>=0 ; i--) {
1913 kvpair = saved_ob_item[i];
1914 value = sortwrapper_getvalue(kvpair);
1915 saved_ob_item[i] = value;
1916 Py_DECREF(kvpair);
1917 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001918 goto dsu_fail;
1919 }
1920 kvpair = build_sortwrapper(key, value);
1921 if (kvpair == NULL)
1922 goto dsu_fail;
1923 saved_ob_item[i] = kvpair;
1924 }
1925 }
1926
1927 /* Reverse sort stability achieved by initially reversing the list,
1928 applying a stable forward sort, then reversing the final result. */
1929 if (reverse && saved_ob_size > 1)
1930 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
1931
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001932 merge_init(&ms);
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001933
Tim Petersb9099c32002-11-12 22:08:10 +00001934 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00001935 if (nremaining < 2)
1936 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001937
Tim Petersa64dc242002-08-01 02:13:36 +00001938 /* March over the array once, left to right, finding natural runs,
1939 * and extending short natural runs to minrun elements.
1940 */
Tim Petersb9099c32002-11-12 22:08:10 +00001941 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001942 hi = lo + nremaining;
1943 minrun = merge_compute_minrun(nremaining);
1944 do {
1945 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001946 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00001947
Tim Petersa64dc242002-08-01 02:13:36 +00001948 /* Identify next run. */
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001949 n = count_run(lo, hi, &descending);
Tim Petersa64dc242002-08-01 02:13:36 +00001950 if (n < 0)
1951 goto fail;
1952 if (descending)
1953 reverse_slice(lo, lo + n);
1954 /* If short, extend to min(minrun, nremaining). */
1955 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001956 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00001957 nremaining : minrun;
Raymond Hettinger70b64fc2008-01-30 20:15:17 +00001958 if (binarysort(lo, lo + force, lo + n) < 0)
Tim Petersa64dc242002-08-01 02:13:36 +00001959 goto fail;
1960 n = force;
1961 }
1962 /* Push run onto pending-runs stack, and maybe merge. */
1963 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00001964 ms.pending[ms.n].base = lo;
1965 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00001966 ++ms.n;
1967 if (merge_collapse(&ms) < 0)
1968 goto fail;
1969 /* Advance to find next run. */
1970 lo += n;
1971 nremaining -= n;
1972 } while (nremaining);
1973 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00001974
Tim Petersa64dc242002-08-01 02:13:36 +00001975 if (merge_force_collapse(&ms) < 0)
1976 goto fail;
1977 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00001978 assert(ms.pending[0].base == saved_ob_item);
1979 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00001980
1981succeed:
1982 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00001983fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001984 if (keyfunc != NULL) {
1985 for (i=0 ; i < saved_ob_size ; i++) {
1986 kvpair = saved_ob_item[i];
1987 value = sortwrapper_getvalue(kvpair);
1988 saved_ob_item[i] = value;
1989 Py_DECREF(kvpair);
1990 }
1991 }
1992
Armin Rigo93677f02004-07-29 12:40:23 +00001993 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00001994 /* The user mucked with the list during the sort,
1995 * and we don't already have another error to report.
1996 */
1997 PyErr_SetString(PyExc_ValueError, "list modified during sort");
1998 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00001999 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002000
2001 if (reverse && saved_ob_size > 1)
2002 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2003
2004 merge_freemem(&ms);
2005
2006dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002007 final_ob_item = self->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +00002008 i = Py_SIZE(self);
2009 Py_SIZE(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002010 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002011 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002012 if (final_ob_item != NULL) {
2013 /* we cannot use list_clear() for this because it does not
2014 guarantee that the list is really empty when it returns */
2015 while (--i >= 0) {
2016 Py_XDECREF(final_ob_item[i]);
2017 }
2018 PyMem_FREE(final_ob_item);
2019 }
Tim Petersa64dc242002-08-01 02:13:36 +00002020 Py_XINCREF(result);
2021 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002022}
Tim Peters330f9e92002-07-19 07:05:44 +00002023#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002024#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002025
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002026int
Fred Drakea2f55112000-07-09 15:16:51 +00002027PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002028{
2029 if (v == NULL || !PyList_Check(v)) {
2030 PyErr_BadInternalCall();
2031 return -1;
2032 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002033 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002034 if (v == NULL)
2035 return -1;
2036 Py_DECREF(v);
2037 return 0;
2038}
2039
Guido van Rossumb86c5492001-02-12 22:06:02 +00002040static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002041listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002042{
Christian Heimes90aa7642007-12-19 02:45:37 +00002043 if (Py_SIZE(self) > 1)
2044 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002045 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002046}
2047
Guido van Rossum84c76f51990-10-30 13:32:20 +00002048int
Fred Drakea2f55112000-07-09 15:16:51 +00002049PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002050{
Tim Peters6063e262002-08-08 01:06:39 +00002051 PyListObject *self = (PyListObject *)v;
2052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002053 if (v == NULL || !PyList_Check(v)) {
2054 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002055 return -1;
2056 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002057 if (Py_SIZE(self) > 1)
2058 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002059 return 0;
2060}
2061
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002062PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002063PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002064{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002065 PyObject *w;
Christian Heimes2c181612007-12-17 20:04:13 +00002066 PyObject **p, **q;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002067 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002068 if (v == NULL || !PyList_Check(v)) {
2069 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002070 return NULL;
2071 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002072 n = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002073 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002074 if (w == NULL)
2075 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002076 p = ((PyTupleObject *)w)->ob_item;
Christian Heimes2c181612007-12-17 20:04:13 +00002077 q = ((PyListObject *)v)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002078 while (--n >= 0) {
Christian Heimes2c181612007-12-17 20:04:13 +00002079 Py_INCREF(*q);
2080 *p = *q;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002081 p++;
Christian Heimes2c181612007-12-17 20:04:13 +00002082 q++;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002083 }
2084 return w;
2085}
2086
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002087static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002088listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002089{
Christian Heimes90aa7642007-12-19 02:45:37 +00002090 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002091 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002092
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002093 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2094 _PyEval_SliceIndex, &start,
2095 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002096 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002097 if (start < 0) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002098 start += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002099 if (start < 0)
2100 start = 0;
2101 }
2102 if (stop < 0) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002103 stop += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002104 if (stop < 0)
2105 stop = 0;
2106 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002107 for (i = start; i < stop && i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002108 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2109 if (cmp > 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002110 return PyLong_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002111 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002112 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002113 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002114 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002115 return NULL;
2116}
2117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002118static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002119listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002120{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002121 Py_ssize_t count = 0;
2122 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002123
Christian Heimes90aa7642007-12-19 02:45:37 +00002124 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002125 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2126 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002127 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002128 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002129 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002130 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002131 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002132}
2133
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002134static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002135listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002136{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002137 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002138
Christian Heimes90aa7642007-12-19 02:45:37 +00002139 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002140 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2141 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002142 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002143 (PyObject *)NULL) == 0)
2144 Py_RETURN_NONE;
2145 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002146 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002147 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002148 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002149 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002150 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002151 return NULL;
2152}
2153
Jeremy Hylton8caad492000-06-23 14:18:11 +00002154static int
2155list_traverse(PyListObject *o, visitproc visit, void *arg)
2156{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002157 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002158
Christian Heimes90aa7642007-12-19 02:45:37 +00002159 for (i = Py_SIZE(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002160 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002161 return 0;
2162}
2163
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002164static PyObject *
2165list_richcompare(PyObject *v, PyObject *w, int op)
2166{
2167 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002168 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002169
2170 if (!PyList_Check(v) || !PyList_Check(w)) {
2171 Py_INCREF(Py_NotImplemented);
2172 return Py_NotImplemented;
2173 }
2174
2175 vl = (PyListObject *)v;
2176 wl = (PyListObject *)w;
2177
Christian Heimes90aa7642007-12-19 02:45:37 +00002178 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002179 /* Shortcut: if the lengths differ, the lists differ */
2180 PyObject *res;
2181 if (op == Py_EQ)
2182 res = Py_False;
2183 else
2184 res = Py_True;
2185 Py_INCREF(res);
2186 return res;
2187 }
2188
2189 /* Search for the first index where items are different */
Christian Heimes90aa7642007-12-19 02:45:37 +00002190 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002191 int k = PyObject_RichCompareBool(vl->ob_item[i],
2192 wl->ob_item[i], Py_EQ);
2193 if (k < 0)
2194 return NULL;
2195 if (!k)
2196 break;
2197 }
2198
Christian Heimes90aa7642007-12-19 02:45:37 +00002199 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002200 /* No more items to compare -- compare sizes */
Christian Heimes90aa7642007-12-19 02:45:37 +00002201 Py_ssize_t vs = Py_SIZE(vl);
2202 Py_ssize_t ws = Py_SIZE(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002203 int cmp;
2204 PyObject *res;
2205 switch (op) {
2206 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002207 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002208 case Py_EQ: cmp = vs == ws; break;
2209 case Py_NE: cmp = vs != ws; break;
2210 case Py_GT: cmp = vs > ws; break;
2211 case Py_GE: cmp = vs >= ws; break;
2212 default: return NULL; /* cannot happen */
2213 }
2214 if (cmp)
2215 res = Py_True;
2216 else
2217 res = Py_False;
2218 Py_INCREF(res);
2219 return res;
2220 }
2221
2222 /* We have an item that differs -- shortcuts for EQ/NE */
2223 if (op == Py_EQ) {
2224 Py_INCREF(Py_False);
2225 return Py_False;
2226 }
2227 if (op == Py_NE) {
2228 Py_INCREF(Py_True);
2229 return Py_True;
2230 }
2231
2232 /* Compare the final item again using the proper operator */
2233 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2234}
2235
Tim Peters6d6c1a32001-08-02 04:15:00 +00002236static int
2237list_init(PyListObject *self, PyObject *args, PyObject *kw)
2238{
2239 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002240 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002241
2242 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2243 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002244
2245 /* Verify list invariants established by PyType_GenericAlloc() */
Christian Heimes90aa7642007-12-19 02:45:37 +00002246 assert(0 <= Py_SIZE(self));
2247 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002248 assert(self->ob_item != NULL ||
2249 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002250
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002251 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002252 if (self->ob_item != NULL) {
2253 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002254 }
2255 if (arg != NULL) {
2256 PyObject *rv = listextend(self, arg);
2257 if (rv == NULL)
2258 return -1;
2259 Py_DECREF(rv);
2260 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002261 return 0;
2262}
2263
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002264static PyObject *
2265list_sizeof(PyListObject *self)
2266{
2267 Py_ssize_t res;
2268
2269 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
2270 return PyLong_FromSsize_t(res);
2271}
2272
Raymond Hettinger1021c442003-11-07 15:38:09 +00002273static PyObject *list_iter(PyObject *seq);
2274static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2275
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002276PyDoc_STRVAR(getitem_doc,
2277"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002278PyDoc_STRVAR(reversed_doc,
2279"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002280PyDoc_STRVAR(sizeof_doc,
2281"L.__sizeof__() -- size of L in memory, in bytes");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002282PyDoc_STRVAR(append_doc,
2283"L.append(object) -- append object to end");
2284PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002285"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002286PyDoc_STRVAR(insert_doc,
2287"L.insert(index, object) -- insert object before index");
2288PyDoc_STRVAR(pop_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002289"L.pop([index]) -> item -- remove and return item at index (default last).\n"
2290"Raises IndexError if list is empty or index is out of range.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002291PyDoc_STRVAR(remove_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002292"L.remove(value) -- remove first occurrence of value.\n"
2293"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002294PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002295"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2296"Raises ValueError if the value is not present.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002297PyDoc_STRVAR(count_doc,
2298"L.count(value) -> integer -- return number of occurrences of value");
2299PyDoc_STRVAR(reverse_doc,
2300"L.reverse() -- reverse *IN PLACE*");
2301PyDoc_STRVAR(sort_doc,
Benjamin Petersoncb9a5512008-09-30 02:08:36 +00002302"L.sort(key=None, reverse=False) -- stable sort *IN PLACE*");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002303
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002304static PyObject *list_subscript(PyListObject*, PyObject*);
2305
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002306static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002307 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002308 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002309 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002310 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002311 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002312 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002313 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002314 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002315 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002316 {"count", (PyCFunction)listcount, METH_O, count_doc},
2317 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002318 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002319 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002320};
2321
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002322static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002323 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002324 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002325 (ssizeargfunc)list_repeat, /* sq_repeat */
2326 (ssizeargfunc)list_item, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002327 0, /* sq_slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002328 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002329 0, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002330 (objobjproc)list_contains, /* sq_contains */
2331 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002332 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002333};
2334
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002335PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002336"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002337"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002338
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002339static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002340list_subscript(PyListObject* self, PyObject* item)
2341{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002342 if (PyIndex_Check(item)) {
2343 Py_ssize_t i;
2344 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002345 if (i == -1 && PyErr_Occurred())
2346 return NULL;
2347 if (i < 0)
2348 i += PyList_GET_SIZE(self);
2349 return list_item(self, i);
2350 }
2351 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002352 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002353 PyObject* result;
2354 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002355 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002356
Christian Heimes90aa7642007-12-19 02:45:37 +00002357 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002358 &start, &stop, &step, &slicelength) < 0) {
2359 return NULL;
2360 }
2361
2362 if (slicelength <= 0) {
2363 return PyList_New(0);
2364 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002365 else if (step == 1) {
2366 return list_slice(self, start, stop);
2367 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002368 else {
2369 result = PyList_New(slicelength);
2370 if (!result) return NULL;
2371
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002372 src = self->ob_item;
2373 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002374 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002375 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002376 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002377 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002378 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002379 }
Tim Peters3b01a122002-07-19 02:35:45 +00002380
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002381 return result;
2382 }
2383 }
2384 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002385 PyErr_Format(PyExc_TypeError,
2386 "list indices must be integers, not %.200s",
2387 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002388 return NULL;
2389 }
2390}
2391
Tim Peters3b01a122002-07-19 02:35:45 +00002392static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002393list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2394{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002395 if (PyIndex_Check(item)) {
2396 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002397 if (i == -1 && PyErr_Occurred())
2398 return -1;
2399 if (i < 0)
2400 i += PyList_GET_SIZE(self);
2401 return list_ass_item(self, i, value);
2402 }
2403 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002404 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002405
Christian Heimes90aa7642007-12-19 02:45:37 +00002406 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002407 &start, &stop, &step, &slicelength) < 0) {
2408 return -1;
2409 }
2410
Thomas Woutersed03b412007-08-28 21:37:11 +00002411 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002412 return list_ass_slice(self, start, stop, value);
2413
Thomas Woutersed03b412007-08-28 21:37:11 +00002414 /* Make sure s[5:2] = [..] inserts at the right place:
2415 before 5, not before 2. */
2416 if ((step < 0 && start < stop) ||
2417 (step > 0 && start > stop))
2418 stop = start;
2419
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002420 if (value == NULL) {
2421 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002422 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002423 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002424
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002425 if (slicelength <= 0)
2426 return 0;
2427
2428 if (step < 0) {
2429 stop = start + 1;
2430 start = stop + step*(slicelength - 1) - 1;
2431 step = -step;
2432 }
2433
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00002434 assert(slicelength <= PY_SIZE_MAX / sizeof(PyObject*));
2435
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002436 garbage = (PyObject**)
2437 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002438 if (!garbage) {
2439 PyErr_NoMemory();
2440 return -1;
2441 }
Tim Peters3b01a122002-07-19 02:35:45 +00002442
Thomas Woutersed03b412007-08-28 21:37:11 +00002443 /* drawing pictures might help understand these for
2444 loops. Basically, we memmove the parts of the
2445 list that are *not* part of the slice: step-1
2446 items for each item that is part of the slice,
2447 and then tail end of the list that was not
2448 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002449 for (cur = start, i = 0;
2450 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002451 cur += step, i++) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002452 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002453
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002454 garbage[i] = PyList_GET_ITEM(self, cur);
2455
Christian Heimes90aa7642007-12-19 02:45:37 +00002456 if (cur + step >= Py_SIZE(self)) {
2457 lim = Py_SIZE(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002458 }
2459
Tim Petersb38e2b62004-07-29 02:29:26 +00002460 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002461 self->ob_item + cur + 1,
2462 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002463 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002464 cur = start + slicelength*step;
Christian Heimes90aa7642007-12-19 02:45:37 +00002465 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002466 memmove(self->ob_item + cur - slicelength,
2467 self->ob_item + cur,
Christian Heimes90aa7642007-12-19 02:45:37 +00002468 (Py_SIZE(self) - cur) *
Thomas Woutersed03b412007-08-28 21:37:11 +00002469 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002470 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002471
Christian Heimes90aa7642007-12-19 02:45:37 +00002472 Py_SIZE(self) -= slicelength;
2473 list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002474
2475 for (i = 0; i < slicelength; i++) {
2476 Py_DECREF(garbage[i]);
2477 }
2478 PyMem_FREE(garbage);
2479
2480 return 0;
2481 }
2482 else {
2483 /* assign slice */
Thomas Woutersed03b412007-08-28 21:37:11 +00002484 PyObject *ins, *seq;
2485 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002486 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002487
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002488 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002489 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002490 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002491 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002492 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002493 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002494 seq = PySequence_Fast(value,
Thomas Woutersed03b412007-08-28 21:37:11 +00002495 "must assign iterable "
2496 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002497 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002498 if (!seq)
2499 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002500
2501 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2502 PyErr_Format(PyExc_ValueError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002503 "attempt to assign sequence of "
2504 "size %zd to extended slice of "
2505 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002506 PySequence_Fast_GET_SIZE(seq),
2507 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002508 Py_DECREF(seq);
2509 return -1;
2510 }
2511
2512 if (!slicelength) {
2513 Py_DECREF(seq);
2514 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002515 }
2516
2517 garbage = (PyObject**)
2518 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 if (!garbage) {
2520 Py_DECREF(seq);
2521 PyErr_NoMemory();
2522 return -1;
2523 }
Tim Peters3b01a122002-07-19 02:35:45 +00002524
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002525 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002526 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002527 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002528 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002529 garbage[i] = selfitems[cur];
2530 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002531 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002532 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002533 }
2534
2535 for (i = 0; i < slicelength; i++) {
2536 Py_DECREF(garbage[i]);
2537 }
Tim Peters3b01a122002-07-19 02:35:45 +00002538
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002539 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002540 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002541
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002542 return 0;
2543 }
Tim Peters3b01a122002-07-19 02:35:45 +00002544 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002545 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002546 PyErr_Format(PyExc_TypeError,
2547 "list indices must be integers, not %.200s",
2548 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002549 return -1;
2550 }
2551}
2552
2553static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002554 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002555 (binaryfunc)list_subscript,
2556 (objobjargproc)list_ass_subscript
2557};
2558
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002559PyTypeObject PyList_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002560 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002561 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002562 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002563 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002564 (destructor)list_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002565 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002566 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002567 0, /* tp_setattr */
2568 0, /* tp_compare */
2569 (reprfunc)list_repr, /* tp_repr */
2570 0, /* tp_as_number */
2571 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002572 &list_as_mapping, /* tp_as_mapping */
Nick Coghland1abd252008-07-15 15:46:38 +00002573 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002574 0, /* tp_call */
2575 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002576 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002577 0, /* tp_setattro */
2578 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002579 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002580 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002581 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002582 (traverseproc)list_traverse, /* tp_traverse */
2583 (inquiry)list_clear, /* tp_clear */
2584 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002585 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002586 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002587 0, /* tp_iternext */
2588 list_methods, /* tp_methods */
2589 0, /* tp_members */
2590 0, /* tp_getset */
2591 0, /* tp_base */
2592 0, /* tp_dict */
2593 0, /* tp_descr_get */
2594 0, /* tp_descr_set */
2595 0, /* tp_dictoffset */
2596 (initproc)list_init, /* tp_init */
2597 PyType_GenericAlloc, /* tp_alloc */
2598 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002599 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002600};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002601
2602
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002603/*********************** List Iterator **************************/
2604
2605typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002606 PyObject_HEAD
2607 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002608 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002609} listiterobject;
2610
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002611static PyObject *list_iter(PyObject *);
2612static void listiter_dealloc(listiterobject *);
2613static int listiter_traverse(listiterobject *, visitproc, void *);
2614static PyObject *listiter_next(listiterobject *);
2615static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002616
Armin Rigof5b3e362006-02-11 21:32:43 +00002617PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002618
2619static PyMethodDef listiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002620 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002621 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002622};
2623
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002624PyTypeObject PyListIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002625 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002626 "list_iterator", /* tp_name */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002627 sizeof(listiterobject), /* tp_basicsize */
2628 0, /* tp_itemsize */
2629 /* methods */
2630 (destructor)listiter_dealloc, /* tp_dealloc */
2631 0, /* tp_print */
2632 0, /* tp_getattr */
2633 0, /* tp_setattr */
2634 0, /* tp_compare */
2635 0, /* tp_repr */
2636 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002637 0, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002638 0, /* tp_as_mapping */
2639 0, /* tp_hash */
2640 0, /* tp_call */
2641 0, /* tp_str */
2642 PyObject_GenericGetAttr, /* tp_getattro */
2643 0, /* tp_setattro */
2644 0, /* tp_as_buffer */
2645 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2646 0, /* tp_doc */
2647 (traverseproc)listiter_traverse, /* tp_traverse */
2648 0, /* tp_clear */
2649 0, /* tp_richcompare */
2650 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002651 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002652 (iternextfunc)listiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002653 listiter_methods, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002654 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002655};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002656
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002657
2658static PyObject *
2659list_iter(PyObject *seq)
2660{
2661 listiterobject *it;
2662
2663 if (!PyList_Check(seq)) {
2664 PyErr_BadInternalCall();
2665 return NULL;
2666 }
2667 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2668 if (it == NULL)
2669 return NULL;
2670 it->it_index = 0;
2671 Py_INCREF(seq);
2672 it->it_seq = (PyListObject *)seq;
2673 _PyObject_GC_TRACK(it);
2674 return (PyObject *)it;
2675}
2676
2677static void
2678listiter_dealloc(listiterobject *it)
2679{
2680 _PyObject_GC_UNTRACK(it);
2681 Py_XDECREF(it->it_seq);
2682 PyObject_GC_Del(it);
2683}
2684
2685static int
2686listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2687{
2688 Py_VISIT(it->it_seq);
2689 return 0;
2690}
2691
2692static PyObject *
2693listiter_next(listiterobject *it)
2694{
2695 PyListObject *seq;
2696 PyObject *item;
2697
2698 assert(it != NULL);
2699 seq = it->it_seq;
2700 if (seq == NULL)
2701 return NULL;
2702 assert(PyList_Check(seq));
2703
2704 if (it->it_index < PyList_GET_SIZE(seq)) {
2705 item = PyList_GET_ITEM(seq, it->it_index);
2706 ++it->it_index;
2707 Py_INCREF(item);
2708 return item;
2709 }
2710
2711 Py_DECREF(seq);
2712 it->it_seq = NULL;
2713 return NULL;
2714}
2715
2716static PyObject *
2717listiter_len(listiterobject *it)
2718{
2719 Py_ssize_t len;
2720 if (it->it_seq) {
2721 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2722 if (len >= 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002723 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002724 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002725 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002726}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002727/*********************** List Reverse Iterator **************************/
2728
2729typedef struct {
2730 PyObject_HEAD
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002731 Py_ssize_t it_index;
Raymond Hettinger001f2282003-11-08 11:58:44 +00002732 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002733} listreviterobject;
2734
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002735static PyObject *list_reversed(PyListObject *, PyObject *);
2736static void listreviter_dealloc(listreviterobject *);
2737static int listreviter_traverse(listreviterobject *, visitproc, void *);
2738static PyObject *listreviter_next(listreviterobject *);
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002739static PyObject *listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002740
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002741static PyMethodDef listreviter_methods[] = {
2742 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
2743 {NULL, NULL} /* sentinel */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002744};
2745
Raymond Hettinger1021c442003-11-07 15:38:09 +00002746PyTypeObject PyListRevIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002747 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002748 "list_reverseiterator", /* tp_name */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002749 sizeof(listreviterobject), /* tp_basicsize */
2750 0, /* tp_itemsize */
2751 /* methods */
2752 (destructor)listreviter_dealloc, /* tp_dealloc */
2753 0, /* tp_print */
2754 0, /* tp_getattr */
2755 0, /* tp_setattr */
2756 0, /* tp_compare */
2757 0, /* tp_repr */
2758 0, /* tp_as_number */
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002759 0, /* tp_as_sequence */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002760 0, /* tp_as_mapping */
2761 0, /* tp_hash */
2762 0, /* tp_call */
2763 0, /* tp_str */
2764 PyObject_GenericGetAttr, /* tp_getattro */
2765 0, /* tp_setattro */
2766 0, /* tp_as_buffer */
2767 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2768 0, /* tp_doc */
2769 (traverseproc)listreviter_traverse, /* tp_traverse */
2770 0, /* tp_clear */
2771 0, /* tp_richcompare */
2772 0, /* tp_weaklistoffset */
2773 PyObject_SelfIter, /* tp_iter */
2774 (iternextfunc)listreviter_next, /* tp_iternext */
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002775 listreviter_methods, /* tp_methods */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002776 0,
2777};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002778
2779static PyObject *
2780list_reversed(PyListObject *seq, PyObject *unused)
2781{
2782 listreviterobject *it;
2783
2784 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2785 if (it == NULL)
2786 return NULL;
2787 assert(PyList_Check(seq));
2788 it->it_index = PyList_GET_SIZE(seq) - 1;
2789 Py_INCREF(seq);
2790 it->it_seq = seq;
2791 PyObject_GC_Track(it);
2792 return (PyObject *)it;
2793}
2794
2795static void
2796listreviter_dealloc(listreviterobject *it)
2797{
2798 PyObject_GC_UnTrack(it);
2799 Py_XDECREF(it->it_seq);
2800 PyObject_GC_Del(it);
2801}
2802
2803static int
2804listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2805{
2806 Py_VISIT(it->it_seq);
2807 return 0;
2808}
2809
2810static PyObject *
2811listreviter_next(listreviterobject *it)
2812{
2813 PyObject *item;
2814 Py_ssize_t index = it->it_index;
2815 PyListObject *seq = it->it_seq;
2816
2817 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2818 item = PyList_GET_ITEM(seq, index);
2819 it->it_index--;
2820 Py_INCREF(item);
2821 return item;
2822 }
2823 it->it_index = -1;
2824 if (seq != NULL) {
2825 it->it_seq = NULL;
2826 Py_DECREF(seq);
2827 }
2828 return NULL;
2829}
2830
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002831static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002832listreviter_len(listreviterobject *it)
2833{
2834 Py_ssize_t len = it->it_index + 1;
2835 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
Raymond Hettingerf5b64112008-12-02 21:33:45 +00002836 len = 0;
2837 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002838}
2839