blob: 59674bf0ee591003322db9f7695fcff97135facf [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);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +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 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000048 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;
49 if (newsize == 0)
50 new_allocated = 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000051 items = self->ob_item;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000052 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
53 PyMem_RESIZE(items, PyObject *, new_allocated);
Raymond Hettinger4bb95402004-02-13 11:36:39 +000054 else
55 items = NULL;
56 if (items == NULL) {
57 PyErr_NoMemory();
58 return -1;
59 }
60 self->ob_item = items;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000061 Py_Size(self) = newsize;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000062 self->allocated = new_allocated;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000063 return 0;
64}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000065
Raymond Hettinger0468e412004-05-05 05:37:53 +000066/* Empty list reuse scheme to save calls to malloc and free */
67#define MAXFREELISTS 80
68static PyListObject *free_lists[MAXFREELISTS];
69static int num_free_lists = 0;
70
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +000071void
72PyList_Fini(void)
73{
74 PyListObject *op;
75
76 while (num_free_lists) {
77 num_free_lists--;
78 op = free_lists[num_free_lists];
79 assert(PyList_CheckExact(op));
80 PyObject_GC_Del(op);
81 }
82}
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000085PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000088 size_t nbytes;
Tim Peters3986d4e2004-07-29 02:28:42 +000089
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 return NULL;
93 }
Tim Peters7049d812004-01-18 20:31:02 +000094 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000095 /* Check for overflow */
Raymond Hettingerfdfe6182004-05-05 06:28:16 +000096 if (nbytes / sizeof(PyObject *) != (size_t)size)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return PyErr_NoMemory();
Raymond Hettinger0468e412004-05-05 05:37:53 +000098 if (num_free_lists) {
99 num_free_lists--;
100 op = free_lists[num_free_lists];
101 _Py_NewReference((PyObject *)op);
102 } else {
103 op = PyObject_GC_New(PyListObject, &PyList_Type);
104 if (op == NULL)
105 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 }
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000107 if (size <= 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108 op->ob_item = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000111 if (op->ob_item == NULL) {
112 Py_DECREF(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 return PyErr_NoMemory();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000114 }
Tim Peters3986d4e2004-07-29 02:28:42 +0000115 memset(op->ob_item, 0, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000117 Py_Size(op) = size;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000118 op->allocated = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000119 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000124PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 if (!PyList_Check(op)) {
127 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return -1;
129 }
130 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000131 return Py_Size(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000134static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000137PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 if (!PyList_Check(op)) {
140 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141 return NULL;
142 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000143 if (i < 0 || i >= Py_Size(op)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000144 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000145 indexerr = PyUnicode_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 "list index out of range");
147 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 return NULL;
149 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151}
152
153int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000154PyList_SetItem(register PyObject *op, register Py_ssize_t i,
Fred Drakea2f55112000-07-09 15:16:51 +0000155 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 register PyObject *olditem;
158 register PyObject **p;
159 if (!PyList_Check(op)) {
160 Py_XDECREF(newitem);
161 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000162 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000164 if (i < 0 || i >= Py_Size(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 Py_XDECREF(newitem);
166 PyErr_SetString(PyExc_IndexError,
167 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000168 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000171 olditem = *p;
172 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 return 0;
175}
176
177static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000178ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000180 Py_ssize_t i, n = Py_Size(self);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000182 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000184 return -1;
185 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000186 if (n == PY_SSIZE_T_MAX) {
Trent Micka5846642000-08-13 22:47:45 +0000187 PyErr_SetString(PyExc_OverflowError,
188 "cannot add more objects to list");
189 return -1;
190 }
Tim Petersb38e2b62004-07-29 02:29:26 +0000191
Raymond Hettingerd4ff7412004-03-15 09:01:31 +0000192 if (list_resize(self, n+1) == -1)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000193 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000194
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000195 if (where < 0) {
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000196 where += n;
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000197 if (where < 0)
198 where = 0;
199 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000200 if (where > n)
201 where = n;
202 items = self->ob_item;
203 for (i = n; --i >= where; )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 items[where] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 return 0;
208}
209
210int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000211PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 if (!PyList_Check(op)) {
214 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000215 return -1;
216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218}
219
Raymond Hettinger40a03822004-04-12 13:05:09 +0000220static int
221app1(PyListObject *self, PyObject *v)
222{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000224
225 assert (v != NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000226 if (n == PY_SSIZE_T_MAX) {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000227 PyErr_SetString(PyExc_OverflowError,
228 "cannot add more objects to list");
229 return -1;
230 }
231
232 if (list_resize(self, n+1) == -1)
233 return -1;
234
235 Py_INCREF(v);
236 PyList_SET_ITEM(self, n, v);
237 return 0;
238}
239
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240int
Fred Drakea2f55112000-07-09 15:16:51 +0000241PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242{
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000243 if (PyList_Check(op) && (newitem != NULL))
244 return app1((PyListObject *)op, newitem);
245 PyErr_BadInternalCall();
246 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
249/* Methods */
250
251static void
Fred Drakea2f55112000-07-09 15:16:51 +0000252list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254 Py_ssize_t i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000255 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000256 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000257 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000258 /* Do it backwards, for Christian Tismer.
259 There's a simple test case where somehow this reduces
260 thrashing when a *very* large list is created and
261 immediately deleted. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000262 i = Py_Size(op);
Guido van Rossumfa717011999-06-09 15:19:34 +0000263 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000265 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000266 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000267 }
Raymond Hettinger0468e412004-05-05 05:37:53 +0000268 if (num_free_lists < MAXFREELISTS && PyList_CheckExact(op))
269 free_lists[num_free_lists++] = op;
Tim Petersb38e2b62004-07-29 02:29:26 +0000270 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000271 Py_Type(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000272 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273}
274
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000276list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000278 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000279 PyObject *s, *temp;
280 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000281
282 i = Py_ReprEnter((PyObject*)v);
283 if (i != 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000284 return i > 0 ? PyUnicode_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000285 }
Tim Petersa7259592001-06-16 05:11:17 +0000286
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000287 if (Py_Size(v) == 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000288 result = PyUnicode_FromString("[]");
Tim Petersa7259592001-06-16 05:11:17 +0000289 goto Done;
290 }
291
292 pieces = PyList_New(0);
293 if (pieces == NULL)
294 goto Done;
295
296 /* Do repr() on each element. Note that this may mutate the list,
297 so must refetch the list size on each iteration. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000298 for (i = 0; i < Py_Size(v); ++i) {
Tim Petersa7259592001-06-16 05:11:17 +0000299 int status;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000300 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
301 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000302 s = PyObject_Repr(v->ob_item[i]);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000303 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000304 if (s == NULL)
305 goto Done;
306 status = PyList_Append(pieces, s);
307 Py_DECREF(s); /* append created a new ref */
308 if (status < 0)
309 goto Done;
310 }
311
312 /* Add "[]" decorations to the first and last items. */
313 assert(PyList_GET_SIZE(pieces) > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000314 s = PyUnicode_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000315 if (s == NULL)
316 goto Done;
317 temp = PyList_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000318 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000319 PyList_SET_ITEM(pieces, 0, s);
320 if (s == NULL)
321 goto Done;
322
Walter Dörwald1ab83302007-05-18 17:15:44 +0000323 s = PyUnicode_FromString("]");
Tim Petersa7259592001-06-16 05:11:17 +0000324 if (s == NULL)
325 goto Done;
326 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000327 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000328 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
329 if (temp == NULL)
330 goto Done;
331
332 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000333 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000334 if (s == NULL)
335 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000336 result = PyUnicode_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000337 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000338
339Done:
340 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000341 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000342 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
Martin v. Löwis18e16552006-02-15 17:27:45 +0000345static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000346list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000348 return Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
350
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000351static int
Fred Drakea2f55112000-07-09 15:16:51 +0000352list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000353{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000354 Py_ssize_t i;
355 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000356
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000357 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_Size(a); ++i)
Raymond Hettingeraae59992002-09-05 14:23:49 +0000358 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000359 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000360 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000361}
362
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000364list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000366 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000367 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000368 indexerr = PyUnicode_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 "list index out of range");
370 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 return NULL;
372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 return a->ob_item[i];
375}
376
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000378list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000381 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383 if (ilow < 0)
384 ilow = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000385 else if (ilow > Py_Size(a))
386 ilow = Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 if (ihigh < ilow)
388 ihigh = ilow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000389 else if (ihigh > Py_Size(a))
390 ihigh = Py_Size(a);
Raymond Hettinger99842b62004-03-08 05:56:15 +0000391 len = ihigh - ilow;
392 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 if (np == NULL)
394 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000395
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000396 src = a->ob_item + ilow;
397 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000398 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000399 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000401 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000407PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000408{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 if (!PyList_Check(a)) {
410 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000411 return NULL;
412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000414}
415
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000417list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000419 Py_ssize_t size;
420 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000421 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyListObject *np;
423 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000424 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000425 "can only concatenate list (not \"%.200s\") to list",
426 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 return NULL;
428 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429#define b ((PyListObject *)bb)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000430 size = Py_Size(a) + Py_Size(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000431 if (size < 0)
432 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000435 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000437 src = a->ob_item;
438 dest = np->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000439 for (i = 0; i < Py_Size(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000440 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000442 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000444 src = b->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000445 dest = np->ob_item + Py_Size(a);
446 for (i = 0; i < Py_Size(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000447 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000449 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452#undef b
453}
454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000457{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000458 Py_ssize_t i, j;
459 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000461 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000462 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000463 if (n < 0)
464 n = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000465 size = Py_Size(a) * n;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000466 if (n && size/n != Py_Size(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000467 return PyErr_NoMemory();
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000468 if (size == 0)
469 return PyList_New(0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000471 if (np == NULL)
472 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000473
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000474 items = np->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000475 if (Py_Size(a) == 1) {
Raymond Hettinger6624e682003-05-21 05:58:46 +0000476 elem = a->ob_item[0];
477 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000478 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000479 Py_INCREF(elem);
480 }
481 return (PyObject *) np;
482 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000483 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000484 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000485 for (i = 0; i < n; i++) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000486 for (j = 0; j < Py_Size(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000487 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000489 p++;
490 }
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000493}
494
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495static int
Armin Rigo93677f02004-07-29 12:40:23 +0000496list_clear(PyListObject *a)
497{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000498 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000499 PyObject **item = a->ob_item;
500 if (item != NULL) {
501 /* Because XDECREF can recursively invoke operations on
502 this list, we make it empty first. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000503 i = Py_Size(a);
504 Py_Size(a) = 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000505 a->ob_item = NULL;
506 a->allocated = 0;
507 while (--i >= 0) {
508 Py_XDECREF(item[i]);
509 }
510 PyMem_FREE(item);
511 }
512 /* Never fails; the return value can be ignored.
513 Note that there is no guarantee that the list is actually empty
514 at this point, because XDECREF may have populated it again! */
515 return 0;
516}
517
Tim Peters8fc4a912004-07-31 21:53:19 +0000518/* a[ilow:ihigh] = v if v != NULL.
519 * del a[ilow:ihigh] if v == NULL.
520 *
521 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
522 * guaranteed the call cannot fail.
523 */
Armin Rigo93677f02004-07-29 12:40:23 +0000524static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000525list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000527 /* Because [X]DECREF can recursively invoke list operations on
528 this list, we must postpone all [X]DECREF activity until
529 after the list is back in its canonical shape. Therefore
530 we must allocate an additional array, 'recycle', into which
531 we temporarily copy the items that are deleted from the
532 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000533 PyObject *recycle_on_stack[8];
534 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000536 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000537 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000538 Py_ssize_t n; /* # of elements in replacement list */
539 Py_ssize_t norig; /* # of elements in list getting replaced */
540 Py_ssize_t d; /* Change in size */
541 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000542 size_t s;
543 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545 if (v == NULL)
546 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000547 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000548 if (a == b) {
549 /* Special case "a[i:j] = a" -- copy b first */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000550 v = list_slice(b, 0, Py_Size(b));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000551 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000552 return result;
553 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000555 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000556 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000557 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000558 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000559 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000560 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000561 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000562 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 if (ilow < 0)
564 ilow = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000565 else if (ilow > Py_Size(a))
566 ilow = Py_Size(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000567
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568 if (ihigh < ilow)
569 ihigh = ilow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000570 else if (ihigh > Py_Size(a))
571 ihigh = Py_Size(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000572
Tim Peters8d9eb102004-07-31 02:24:20 +0000573 norig = ihigh - ilow;
574 assert(norig >= 0);
575 d = n - norig;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000576 if (Py_Size(a) + d == 0) {
Armin Rigo93677f02004-07-29 12:40:23 +0000577 Py_XDECREF(v_as_SF);
578 return list_clear(a);
579 }
580 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000581 /* recycle the items that we are about to remove */
582 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000583 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000584 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000585 if (recycle == NULL) {
586 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000587 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000588 }
589 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000590 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000591
Armin Rigo1dd04a02004-07-30 11:38:22 +0000592 if (d < 0) { /* Delete -d items */
593 memmove(&item[ihigh+d], &item[ihigh],
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000594 (Py_Size(a) - ihigh)*sizeof(PyObject *));
595 list_resize(a, Py_Size(a) + d);
Armin Rigo1dd04a02004-07-30 11:38:22 +0000596 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000598 else if (d > 0) { /* Insert d items */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000599 k = Py_Size(a);
Tim Peters73572222004-07-31 02:54:42 +0000600 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000601 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000602 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000603 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000604 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605 }
606 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000607 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609 item[ilow] = w;
610 }
Tim Peters73572222004-07-31 02:54:42 +0000611 for (k = norig - 1; k >= 0; --k)
612 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000613 result = 0;
614 Error:
Tim Peters73572222004-07-31 02:54:42 +0000615 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000616 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000617 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000618 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619#undef b
620}
621
Guido van Rossum234f9421993-06-17 12:35:49 +0000622int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000623PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000624{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 if (!PyList_Check(a)) {
626 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000627 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000628 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000630}
631
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000632static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000633list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000634{
635 PyObject **items;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000636 Py_ssize_t size, i, j, p, newsize;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000637
638
639 size = PyList_GET_SIZE(self);
640 if (size == 0) {
641 Py_INCREF(self);
642 return (PyObject *)self;
643 }
644
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000645 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000646 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000647 Py_INCREF(self);
648 return (PyObject *)self;
649 }
650
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000651 newsize = size * n;
652 if (newsize/n != size)
653 return PyErr_NoMemory();
654 if (list_resize(self, newsize) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000655 return NULL;
656
657 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000658 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000659 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
660 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000661 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000662 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000663 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000664 }
665 }
666 Py_INCREF(self);
667 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000668}
669
Guido van Rossum4a450d01991-04-03 19:05:18 +0000670static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000672{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 PyObject *old_value;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000674 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyErr_SetString(PyExc_IndexError,
676 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000677 return -1;
678 }
679 if (v == NULL)
680 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000682 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000683 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000684 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000685 return 0;
686}
687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000689listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000691 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000693 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000695 if (ins1(self, i, v) == 0)
696 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000697 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698}
699
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000701listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000703 if (app1(self, v) == 0)
704 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000705 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000706}
707
Barry Warsawdedf6d61998-10-09 16:37:25 +0000708static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000709listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000711 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000712 Py_ssize_t m; /* size of self */
713 Py_ssize_t n; /* guess for size of b */
714 Py_ssize_t mn; /* m + n */
715 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000716 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000717
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000718 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000719 1) lists and tuples which can use PySequence_Fast ops
720 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000721 */
722 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000723 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000724 b = PySequence_Fast(b, "argument must be iterable");
725 if (!b)
726 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000727 n = PySequence_Fast_GET_SIZE(b);
728 if (n == 0) {
729 /* short circuit when b is empty */
730 Py_DECREF(b);
731 Py_RETURN_NONE;
732 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000733 m = Py_Size(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000734 if (list_resize(self, m + n) == -1) {
735 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000736 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000737 }
738 /* note that we may still have self == b here for the
739 * situation a.extend(a), but the following code works
740 * in that case too. Just make sure to resize self
741 * before calling PySequence_Fast_ITEMS.
742 */
743 /* populate the end of self with b's items */
744 src = PySequence_Fast_ITEMS(b);
745 dest = self->ob_item + m;
746 for (i = 0; i < n; i++) {
747 PyObject *o = src[i];
748 Py_INCREF(o);
749 dest[i] = o;
750 }
751 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000752 Py_RETURN_NONE;
753 }
754
755 it = PyObject_GetIter(b);
756 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000757 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000758 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000760 /* Guess a result list size. */
Armin Rigof5b3e362006-02-11 21:32:43 +0000761 n = _PyObject_LengthHint(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000762 if (n < 0) {
Alexandre Vassalotti79a082b2007-12-04 06:20:30 +0000763 if (PyErr_Occurred()
764 && !PyErr_ExceptionMatches(PyExc_TypeError)
765 && !PyErr_ExceptionMatches(PyExc_AttributeError)) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000766 Py_DECREF(it);
767 return NULL;
768 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000769 PyErr_Clear();
770 n = 8; /* arbitrary */
771 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000772 m = Py_Size(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000773 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000774 if (mn >= m) {
775 /* Make room. */
776 if (list_resize(self, mn) == -1)
777 goto error;
778 /* Make the list sane again. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000779 Py_Size(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000780 }
781 /* Else m + n overflowed; on the chance that n lied, and there really
782 * is enough room, ignore it. If n was telling the truth, we'll
783 * eventually run out of memory during the loop.
784 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000785
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000786 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000787 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000788 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000789 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000790 if (PyErr_Occurred()) {
791 if (PyErr_ExceptionMatches(PyExc_StopIteration))
792 PyErr_Clear();
793 else
794 goto error;
795 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000796 break;
797 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000798 if (Py_Size(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000799 /* steals ref */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000800 PyList_SET_ITEM(self, Py_Size(self), item);
801 ++Py_Size(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000802 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000803 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000804 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000805 Py_DECREF(item); /* append creates a new ref */
806 if (status < 0)
807 goto error;
808 }
809 }
810
811 /* Cut back result list if initial guess was too large. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000812 if (Py_Size(self) < self->allocated)
813 list_resize(self, Py_Size(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000814
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000815 Py_DECREF(it);
816 Py_RETURN_NONE;
817
818 error:
819 Py_DECREF(it);
820 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000821}
822
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000823PyObject *
824_PyList_Extend(PyListObject *self, PyObject *b)
825{
826 return listextend(self, b);
827}
828
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000829static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000830list_inplace_concat(PyListObject *self, PyObject *other)
831{
832 PyObject *result;
833
834 result = listextend(self, other);
835 if (result == NULL)
836 return result;
837 Py_DECREF(result);
838 Py_INCREF(self);
839 return (PyObject *)self;
840}
841
842static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000843listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000844{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000845 Py_ssize_t i = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000846 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000847 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000848
Thomas Wouters89f507f2006-12-13 04:49:30 +0000849 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000850 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000851
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000852 if (Py_Size(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000853 /* Special-case most common failure cause */
854 PyErr_SetString(PyExc_IndexError, "pop from empty list");
855 return NULL;
856 }
857 if (i < 0)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000858 i += Py_Size(self);
859 if (i < 0 || i >= Py_Size(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000860 PyErr_SetString(PyExc_IndexError, "pop index out of range");
861 return NULL;
862 }
863 v = self->ob_item[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000864 if (i == Py_Size(self) - 1) {
865 status = list_resize(self, Py_Size(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000866 assert(status >= 0);
867 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000868 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000869 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000870 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
871 assert(status >= 0);
872 /* Use status, so that in a release build compilers don't
873 * complain about the unused name.
874 */
Brett Cannon651dd522004-08-08 21:21:18 +0000875 (void) status;
876
877 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000878}
879
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000880/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
881static void
882reverse_slice(PyObject **lo, PyObject **hi)
883{
884 assert(lo && hi);
885
886 --hi;
887 while (lo < hi) {
888 PyObject *t = *lo;
889 *lo = *hi;
890 *hi = t;
891 ++lo;
892 --hi;
893 }
894}
895
Tim Petersa64dc242002-08-01 02:13:36 +0000896/* Lots of code for an adaptive, stable, natural mergesort. There are many
897 * pieces to this algorithm; read listsort.txt for overviews and details.
898 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000899
Guido van Rossum3f236de1996-12-10 23:55:39 +0000900/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000901 * comparison function (any callable Python object), which must not be
902 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
903 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000904 * Returns -1 on error, 1 if x < y, 0 if x >= y.
905 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000906static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000907islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000908{
Tim Petersf2a04732002-07-11 21:46:16 +0000909 PyObject *res;
910 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000911 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000912
Tim Peters66860f62002-08-04 17:47:26 +0000913 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000914 /* Call the user's comparison function and translate the 3-way
915 * result into true or false (or error).
916 */
Tim Petersf2a04732002-07-11 21:46:16 +0000917 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000918 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000919 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000920 Py_INCREF(x);
921 Py_INCREF(y);
922 PyTuple_SET_ITEM(args, 0, x);
923 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000924 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000926 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000927 return -1;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000928 if (!PyInt_CheckExact(res)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 PyErr_Format(PyExc_TypeError,
930 "comparison function must return int, not %.200s",
931 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000933 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000934 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000935 i = PyLong_AsLong(res);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000937 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000938}
939
Tim Peters66860f62002-08-04 17:47:26 +0000940/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
941 * islt. This avoids a layer of function call in the usual case, and
942 * sorting does many comparisons.
943 * Returns -1 on error, 1 if x < y, 0 if x >= y.
944 */
945#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
946 PyObject_RichCompareBool(X, Y, Py_LT) : \
947 islt(X, Y, COMPARE))
948
949/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000950 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
951 started. It makes more sense in context <wink>. X and Y are PyObject*s.
952*/
Tim Peters66860f62002-08-04 17:47:26 +0000953#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000954 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000955
956/* binarysort is the best method for sorting small arrays: it does
957 few compares, but can do data movement quadratic in the number of
958 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000959 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000960 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000961 On entry, must have lo <= start <= hi, and that [lo, start) is already
962 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000963 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000964 Even in case of error, the output slice will be some permutation of
965 the input (nothing is lost or duplicated).
966*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000967static int
Fred Drakea2f55112000-07-09 15:16:51 +0000968binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
969 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000970{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000971 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000972 register PyObject **l, **p, **r;
973 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000974
Tim Petersa8c974c2002-07-19 03:30:57 +0000975 assert(lo <= start && start <= hi);
976 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000977 if (lo == start)
978 ++start;
979 for (; start < hi; ++start) {
980 /* set l to where *start belongs */
981 l = lo;
982 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000983 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000984 /* Invariants:
985 * pivot >= all in [lo, l).
986 * pivot < all in [r, start).
987 * The second is vacuously true at the start.
988 */
989 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000990 do {
991 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000992 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000993 r = p;
994 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000995 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000996 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000997 assert(l == r);
998 /* The invariants still hold, so pivot >= all in [lo, l) and
999 pivot < all in [l, start), so pivot belongs at l. Note
1000 that if there are elements equal to pivot, l points to the
1001 first slot after them -- that's why this sort is stable.
1002 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001003 Caution: using memmove is much slower under MSVC 5;
1004 we're not usually moving many slots. */
1005 for (p = start; p > l; --p)
1006 *p = *(p-1);
1007 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001008 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001009 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001010
1011 fail:
1012 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001013}
1014
Tim Petersa64dc242002-08-01 02:13:36 +00001015/*
1016Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1017is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001018
Tim Petersa64dc242002-08-01 02:13:36 +00001019 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001020
Tim Petersa64dc242002-08-01 02:13:36 +00001021or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001022
Tim Petersa64dc242002-08-01 02:13:36 +00001023 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001024
Tim Petersa64dc242002-08-01 02:13:36 +00001025Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1026For its intended use in a stable mergesort, the strictness of the defn of
1027"descending" is needed so that the caller can safely reverse a descending
1028sequence without violating stability (strict > ensures there are no equal
1029elements to get out of order).
1030
1031Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001032*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001033static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001034count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001035{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001036 Py_ssize_t k;
1037 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001038
Tim Petersa64dc242002-08-01 02:13:36 +00001039 assert(lo < hi);
1040 *descending = 0;
1041 ++lo;
1042 if (lo == hi)
1043 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001044
Tim Petersa64dc242002-08-01 02:13:36 +00001045 n = 2;
1046 IFLT(*lo, *(lo-1)) {
1047 *descending = 1;
1048 for (lo = lo+1; lo < hi; ++lo, ++n) {
1049 IFLT(*lo, *(lo-1))
1050 ;
1051 else
1052 break;
1053 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001054 }
Tim Petersa64dc242002-08-01 02:13:36 +00001055 else {
1056 for (lo = lo+1; lo < hi; ++lo, ++n) {
1057 IFLT(*lo, *(lo-1))
1058 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001059 }
1060 }
1061
Tim Petersa64dc242002-08-01 02:13:36 +00001062 return n;
1063fail:
1064 return -1;
1065}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001066
Tim Petersa64dc242002-08-01 02:13:36 +00001067/*
1068Locate the proper position of key in a sorted vector; if the vector contains
1069an element equal to key, return the position immediately to the left of
1070the leftmost equal element. [gallop_right() does the same except returns
1071the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001072
Tim Petersa64dc242002-08-01 02:13:36 +00001073"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001074
Tim Petersa64dc242002-08-01 02:13:36 +00001075"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1076hint is to the final result, the faster this runs.
1077
1078The return value is the int k in 0..n such that
1079
1080 a[k-1] < key <= a[k]
1081
1082pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1083key belongs at index k; or, IOW, the first k elements of a should precede
1084key, and the last n-k should follow key.
1085
1086Returns -1 on error. See listsort.txt for info on the method.
1087*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001088static Py_ssize_t
1089gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001090{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001091 Py_ssize_t ofs;
1092 Py_ssize_t lastofs;
1093 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001094
1095 assert(key && a && n > 0 && hint >= 0 && hint < n);
1096
1097 a += hint;
1098 lastofs = 0;
1099 ofs = 1;
1100 IFLT(*a, key) {
1101 /* a[hint] < key -- gallop right, until
1102 * a[hint + lastofs] < key <= a[hint + ofs]
1103 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001104 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001105 while (ofs < maxofs) {
1106 IFLT(a[ofs], key) {
1107 lastofs = ofs;
1108 ofs = (ofs << 1) + 1;
1109 if (ofs <= 0) /* int overflow */
1110 ofs = maxofs;
1111 }
1112 else /* key <= a[hint + ofs] */
1113 break;
1114 }
1115 if (ofs > maxofs)
1116 ofs = maxofs;
1117 /* Translate back to offsets relative to &a[0]. */
1118 lastofs += hint;
1119 ofs += hint;
1120 }
1121 else {
1122 /* key <= a[hint] -- gallop left, until
1123 * a[hint - ofs] < key <= a[hint - lastofs]
1124 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001125 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001126 while (ofs < maxofs) {
1127 IFLT(*(a-ofs), key)
1128 break;
1129 /* key <= a[hint - ofs] */
1130 lastofs = ofs;
1131 ofs = (ofs << 1) + 1;
1132 if (ofs <= 0) /* int overflow */
1133 ofs = maxofs;
1134 }
1135 if (ofs > maxofs)
1136 ofs = maxofs;
1137 /* Translate back to positive offsets relative to &a[0]. */
1138 k = lastofs;
1139 lastofs = hint - ofs;
1140 ofs = hint - k;
1141 }
1142 a -= hint;
1143
1144 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1145 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1146 * right of lastofs but no farther right than ofs. Do a binary
1147 * search, with invariant a[lastofs-1] < key <= a[ofs].
1148 */
1149 ++lastofs;
1150 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001151 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001152
1153 IFLT(a[m], key)
1154 lastofs = m+1; /* a[m] < key */
1155 else
1156 ofs = m; /* key <= a[m] */
1157 }
1158 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1159 return ofs;
1160
1161fail:
1162 return -1;
1163}
1164
1165/*
1166Exactly like gallop_left(), except that if key already exists in a[0:n],
1167finds the position immediately to the right of the rightmost equal value.
1168
1169The return value is the int k in 0..n such that
1170
1171 a[k-1] <= key < a[k]
1172
1173or -1 if error.
1174
1175The code duplication is massive, but this is enough different given that
1176we're sticking to "<" comparisons that it's much harder to follow if
1177written as one routine with yet another "left or right?" flag.
1178*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001179static Py_ssize_t
1180gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001181{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001182 Py_ssize_t ofs;
1183 Py_ssize_t lastofs;
1184 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001185
1186 assert(key && a && n > 0 && hint >= 0 && hint < n);
1187
1188 a += hint;
1189 lastofs = 0;
1190 ofs = 1;
1191 IFLT(key, *a) {
1192 /* key < a[hint] -- gallop left, until
1193 * a[hint - ofs] <= key < a[hint - lastofs]
1194 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001195 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001196 while (ofs < maxofs) {
1197 IFLT(key, *(a-ofs)) {
1198 lastofs = ofs;
1199 ofs = (ofs << 1) + 1;
1200 if (ofs <= 0) /* int overflow */
1201 ofs = maxofs;
1202 }
1203 else /* a[hint - ofs] <= key */
1204 break;
1205 }
1206 if (ofs > maxofs)
1207 ofs = maxofs;
1208 /* Translate back to positive offsets relative to &a[0]. */
1209 k = lastofs;
1210 lastofs = hint - ofs;
1211 ofs = hint - k;
1212 }
1213 else {
1214 /* a[hint] <= key -- gallop right, until
1215 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001216 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001217 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001218 while (ofs < maxofs) {
1219 IFLT(key, a[ofs])
1220 break;
1221 /* a[hint + ofs] <= key */
1222 lastofs = ofs;
1223 ofs = (ofs << 1) + 1;
1224 if (ofs <= 0) /* int overflow */
1225 ofs = maxofs;
1226 }
1227 if (ofs > maxofs)
1228 ofs = maxofs;
1229 /* Translate back to offsets relative to &a[0]. */
1230 lastofs += hint;
1231 ofs += hint;
1232 }
1233 a -= hint;
1234
1235 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1236 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1237 * right of lastofs but no farther right than ofs. Do a binary
1238 * search, with invariant a[lastofs-1] <= key < a[ofs].
1239 */
1240 ++lastofs;
1241 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001242 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001243
1244 IFLT(key, a[m])
1245 ofs = m; /* key < a[m] */
1246 else
1247 lastofs = m+1; /* a[m] <= key */
1248 }
1249 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1250 return ofs;
1251
1252fail:
1253 return -1;
1254}
1255
1256/* The maximum number of entries in a MergeState's pending-runs stack.
1257 * This is enough to sort arrays of size up to about
1258 * 32 * phi ** MAX_MERGE_PENDING
1259 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1260 * with 2**64 elements.
1261 */
1262#define MAX_MERGE_PENDING 85
1263
Tim Peterse05f65a2002-08-10 05:21:15 +00001264/* When we get into galloping mode, we stay there until both runs win less
1265 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001266 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001267#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001268
1269/* Avoid malloc for small temp arrays. */
1270#define MERGESTATE_TEMP_SIZE 256
1271
1272/* One MergeState exists on the stack per invocation of mergesort. It's just
1273 * a convenient way to pass state around among the helper functions.
1274 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001275struct s_slice {
1276 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001277 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001278};
1279
Tim Petersa64dc242002-08-01 02:13:36 +00001280typedef struct s_MergeState {
1281 /* The user-supplied comparison function. or NULL if none given. */
1282 PyObject *compare;
1283
Tim Peterse05f65a2002-08-10 05:21:15 +00001284 /* This controls when we get *into* galloping mode. It's initialized
1285 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1286 * random data, and lower for highly structured data.
1287 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001288 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001289
Tim Petersa64dc242002-08-01 02:13:36 +00001290 /* 'a' is temp storage to help with merges. It contains room for
1291 * alloced entries.
1292 */
1293 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001294 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001295
1296 /* A stack of n pending runs yet to be merged. Run #i starts at
1297 * address base[i] and extends for len[i] elements. It's always
1298 * true (so long as the indices are in bounds) that
1299 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001300 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001301 *
1302 * so we could cut the storage for this, but it's a minor amount,
1303 * and keeping all the info explicit simplifies the code.
1304 */
1305 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001306 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001307
1308 /* 'a' points to this when possible, rather than muck with malloc. */
1309 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1310} MergeState;
1311
1312/* Conceptually a MergeState's constructor. */
1313static void
1314merge_init(MergeState *ms, PyObject *compare)
1315{
1316 assert(ms != NULL);
1317 ms->compare = compare;
1318 ms->a = ms->temparray;
1319 ms->alloced = MERGESTATE_TEMP_SIZE;
1320 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001321 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001322}
1323
1324/* Free all the temp memory owned by the MergeState. This must be called
1325 * when you're done with a MergeState, and may be called before then if
1326 * you want to free the temp memory early.
1327 */
1328static void
1329merge_freemem(MergeState *ms)
1330{
1331 assert(ms != NULL);
1332 if (ms->a != ms->temparray)
1333 PyMem_Free(ms->a);
1334 ms->a = ms->temparray;
1335 ms->alloced = MERGESTATE_TEMP_SIZE;
1336}
1337
1338/* Ensure enough temp memory for 'need' array slots is available.
1339 * Returns 0 on success and -1 if the memory can't be gotten.
1340 */
1341static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001342merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001343{
1344 assert(ms != NULL);
1345 if (need <= ms->alloced)
1346 return 0;
1347 /* Don't realloc! That can cost cycles to copy the old data, but
1348 * we don't care what's in the block.
1349 */
1350 merge_freemem(ms);
1351 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1352 if (ms->a) {
1353 ms->alloced = need;
1354 return 0;
1355 }
1356 PyErr_NoMemory();
1357 merge_freemem(ms); /* reset to sane state */
1358 return -1;
1359}
1360#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1361 merge_getmem(MS, NEED))
1362
1363/* Merge the na elements starting at pa with the nb elements starting at pb
1364 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1365 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1366 * merge, and should have na <= nb. See listsort.txt for more info.
1367 * Return 0 if successful, -1 if error.
1368 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001369static Py_ssize_t
1370merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1371 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001372{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001373 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001374 PyObject *compare;
1375 PyObject **dest;
1376 int result = -1; /* guilty until proved innocent */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001377 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001378
1379 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1380 if (MERGE_GETMEM(ms, na) < 0)
1381 return -1;
1382 memcpy(ms->a, pa, na * sizeof(PyObject*));
1383 dest = pa;
1384 pa = ms->a;
1385
1386 *dest++ = *pb++;
1387 --nb;
1388 if (nb == 0)
1389 goto Succeed;
1390 if (na == 1)
1391 goto CopyB;
1392
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001393 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001394 compare = ms->compare;
1395 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001396 Py_ssize_t acount = 0; /* # of times A won in a row */
1397 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001398
1399 /* Do the straightforward thing until (if ever) one run
1400 * appears to win consistently.
1401 */
1402 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001403 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001404 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001405 if (k) {
1406 if (k < 0)
1407 goto Fail;
1408 *dest++ = *pb++;
1409 ++bcount;
1410 acount = 0;
1411 --nb;
1412 if (nb == 0)
1413 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001414 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001415 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001416 }
1417 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001418 *dest++ = *pa++;
1419 ++acount;
1420 bcount = 0;
1421 --na;
1422 if (na == 1)
1423 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001424 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001425 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001426 }
Tim Petersa64dc242002-08-01 02:13:36 +00001427 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001428
Tim Petersa64dc242002-08-01 02:13:36 +00001429 /* One run is winning so consistently that galloping may
1430 * be a huge win. So try that, and continue galloping until
1431 * (if ever) neither run appears to be winning consistently
1432 * anymore.
1433 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001434 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001435 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001436 assert(na > 1 && nb > 0);
1437 min_gallop -= min_gallop > 1;
1438 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001439 k = gallop_right(*pb, pa, na, 0, compare);
1440 acount = k;
1441 if (k) {
1442 if (k < 0)
1443 goto Fail;
1444 memcpy(dest, pa, k * sizeof(PyObject *));
1445 dest += k;
1446 pa += k;
1447 na -= k;
1448 if (na == 1)
1449 goto CopyB;
1450 /* na==0 is impossible now if the comparison
1451 * function is consistent, but we can't assume
1452 * that it is.
1453 */
1454 if (na == 0)
1455 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001456 }
Tim Petersa64dc242002-08-01 02:13:36 +00001457 *dest++ = *pb++;
1458 --nb;
1459 if (nb == 0)
1460 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001461
Tim Petersa64dc242002-08-01 02:13:36 +00001462 k = gallop_left(*pa, pb, nb, 0, compare);
1463 bcount = k;
1464 if (k) {
1465 if (k < 0)
1466 goto Fail;
1467 memmove(dest, pb, k * sizeof(PyObject *));
1468 dest += k;
1469 pb += k;
1470 nb -= k;
1471 if (nb == 0)
1472 goto Succeed;
1473 }
1474 *dest++ = *pa++;
1475 --na;
1476 if (na == 1)
1477 goto CopyB;
1478 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001479 ++min_gallop; /* penalize it for leaving galloping mode */
1480 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001481 }
1482Succeed:
1483 result = 0;
1484Fail:
1485 if (na)
1486 memcpy(dest, pa, na * sizeof(PyObject*));
1487 return result;
1488CopyB:
1489 assert(na == 1 && nb > 0);
1490 /* The last element of pa belongs at the end of the merge. */
1491 memmove(dest, pb, nb * sizeof(PyObject *));
1492 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001493 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001494}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001495
Tim Petersa64dc242002-08-01 02:13:36 +00001496/* Merge the na elements starting at pa with the nb elements starting at pb
1497 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1498 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1499 * merge, and should have na >= nb. See listsort.txt for more info.
1500 * Return 0 if successful, -1 if error.
1501 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001502static Py_ssize_t
1503merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001504{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001505 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001506 PyObject *compare;
1507 PyObject **dest;
1508 int result = -1; /* guilty until proved innocent */
1509 PyObject **basea;
1510 PyObject **baseb;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001511 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001512
1513 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1514 if (MERGE_GETMEM(ms, nb) < 0)
1515 return -1;
1516 dest = pb + nb - 1;
1517 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1518 basea = pa;
1519 baseb = ms->a;
1520 pb = ms->a + nb - 1;
1521 pa += na - 1;
1522
1523 *dest-- = *pa--;
1524 --na;
1525 if (na == 0)
1526 goto Succeed;
1527 if (nb == 1)
1528 goto CopyA;
1529
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001530 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001531 compare = ms->compare;
1532 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001533 Py_ssize_t acount = 0; /* # of times A won in a row */
1534 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001535
1536 /* Do the straightforward thing until (if ever) one run
1537 * appears to win consistently.
1538 */
1539 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001540 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001541 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001542 if (k) {
1543 if (k < 0)
1544 goto Fail;
1545 *dest-- = *pa--;
1546 ++acount;
1547 bcount = 0;
1548 --na;
1549 if (na == 0)
1550 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001551 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001552 break;
1553 }
1554 else {
1555 *dest-- = *pb--;
1556 ++bcount;
1557 acount = 0;
1558 --nb;
1559 if (nb == 1)
1560 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001561 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001562 break;
1563 }
1564 }
1565
1566 /* One run is winning so consistently that galloping may
1567 * be a huge win. So try that, and continue galloping until
1568 * (if ever) neither run appears to be winning consistently
1569 * anymore.
1570 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001571 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001572 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001573 assert(na > 0 && nb > 1);
1574 min_gallop -= min_gallop > 1;
1575 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001576 k = gallop_right(*pb, basea, na, na-1, compare);
1577 if (k < 0)
1578 goto Fail;
1579 k = na - k;
1580 acount = k;
1581 if (k) {
1582 dest -= k;
1583 pa -= k;
1584 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1585 na -= k;
1586 if (na == 0)
1587 goto Succeed;
1588 }
1589 *dest-- = *pb--;
1590 --nb;
1591 if (nb == 1)
1592 goto CopyA;
1593
1594 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1595 if (k < 0)
1596 goto Fail;
1597 k = nb - k;
1598 bcount = k;
1599 if (k) {
1600 dest -= k;
1601 pb -= k;
1602 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1603 nb -= k;
1604 if (nb == 1)
1605 goto CopyA;
1606 /* nb==0 is impossible now if the comparison
1607 * function is consistent, but we can't assume
1608 * that it is.
1609 */
1610 if (nb == 0)
1611 goto Succeed;
1612 }
1613 *dest-- = *pa--;
1614 --na;
1615 if (na == 0)
1616 goto Succeed;
1617 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001618 ++min_gallop; /* penalize it for leaving galloping mode */
1619 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001620 }
1621Succeed:
1622 result = 0;
1623Fail:
1624 if (nb)
1625 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1626 return result;
1627CopyA:
1628 assert(nb == 1 && na > 0);
1629 /* The first element of pb belongs at the front of the merge. */
1630 dest -= na;
1631 pa -= na;
1632 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1633 *dest = *pb;
1634 return 0;
1635}
1636
1637/* Merge the two runs at stack indices i and i+1.
1638 * Returns 0 on success, -1 on error.
1639 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001640static Py_ssize_t
1641merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001642{
1643 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001644 Py_ssize_t na, nb;
1645 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001646 PyObject *compare;
1647
1648 assert(ms != NULL);
1649 assert(ms->n >= 2);
1650 assert(i >= 0);
1651 assert(i == ms->n - 2 || i == ms->n - 3);
1652
Tim Peterse05f65a2002-08-10 05:21:15 +00001653 pa = ms->pending[i].base;
1654 na = ms->pending[i].len;
1655 pb = ms->pending[i+1].base;
1656 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001657 assert(na > 0 && nb > 0);
1658 assert(pa + na == pb);
1659
1660 /* Record the length of the combined runs; if i is the 3rd-last
1661 * run now, also slide over the last run (which isn't involved
1662 * in this merge). The current run i+1 goes away in any case.
1663 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001664 ms->pending[i].len = na + nb;
1665 if (i == ms->n - 3)
1666 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001667 --ms->n;
1668
1669 /* Where does b start in a? Elements in a before that can be
1670 * ignored (already in place).
1671 */
1672 compare = ms->compare;
1673 k = gallop_right(*pb, pa, na, 0, compare);
1674 if (k < 0)
1675 return -1;
1676 pa += k;
1677 na -= k;
1678 if (na == 0)
1679 return 0;
1680
1681 /* Where does a end in b? Elements in b after that can be
1682 * ignored (already in place).
1683 */
1684 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1685 if (nb <= 0)
1686 return nb;
1687
1688 /* Merge what remains of the runs, using a temp array with
1689 * min(na, nb) elements.
1690 */
1691 if (na <= nb)
1692 return merge_lo(ms, pa, na, pb, nb);
1693 else
1694 return merge_hi(ms, pa, na, pb, nb);
1695}
1696
1697/* Examine the stack of runs waiting to be merged, merging adjacent runs
1698 * until the stack invariants are re-established:
1699 *
1700 * 1. len[-3] > len[-2] + len[-1]
1701 * 2. len[-2] > len[-1]
1702 *
1703 * See listsort.txt for more info.
1704 *
1705 * Returns 0 on success, -1 on error.
1706 */
1707static int
1708merge_collapse(MergeState *ms)
1709{
Tim Peterse05f65a2002-08-10 05:21:15 +00001710 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001711
1712 assert(ms);
1713 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001714 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001715 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1716 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001717 --n;
1718 if (merge_at(ms, n) < 0)
1719 return -1;
1720 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001721 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001722 if (merge_at(ms, n) < 0)
1723 return -1;
1724 }
1725 else
1726 break;
1727 }
1728 return 0;
1729}
1730
1731/* Regardless of invariants, merge all runs on the stack until only one
1732 * remains. This is used at the end of the mergesort.
1733 *
1734 * Returns 0 on success, -1 on error.
1735 */
1736static int
1737merge_force_collapse(MergeState *ms)
1738{
Tim Peterse05f65a2002-08-10 05:21:15 +00001739 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001740
1741 assert(ms);
1742 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001743 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001744 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001745 --n;
1746 if (merge_at(ms, n) < 0)
1747 return -1;
1748 }
1749 return 0;
1750}
1751
1752/* Compute a good value for the minimum run length; natural runs shorter
1753 * than this are boosted artificially via binary insertion.
1754 *
1755 * If n < 64, return n (it's too small to bother with fancy stuff).
1756 * Else if n is an exact power of 2, return 32.
1757 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1758 * strictly less than, an exact power of 2.
1759 *
1760 * See listsort.txt for more info.
1761 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001762static Py_ssize_t
1763merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001764{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001765 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001766
1767 assert(n >= 0);
1768 while (n >= 64) {
1769 r |= n & 1;
1770 n >>= 1;
1771 }
1772 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001773}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001774
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001775/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001776 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001777 which is returned during the undecorate phase. By exposing only the key
1778 during comparisons, the underlying sort stability characteristics are left
1779 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001780 the key instead of a full record. */
1781
1782typedef struct {
1783 PyObject_HEAD
1784 PyObject *key;
1785 PyObject *value;
1786} sortwrapperobject;
1787
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001788PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001789static PyObject *
1790sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1791static void
1792sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001793
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001794PyTypeObject PySortWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001795 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001796 "sortwrapper", /* tp_name */
1797 sizeof(sortwrapperobject), /* tp_basicsize */
1798 0, /* tp_itemsize */
1799 /* methods */
1800 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1801 0, /* tp_print */
1802 0, /* tp_getattr */
1803 0, /* tp_setattr */
1804 0, /* tp_compare */
1805 0, /* tp_repr */
1806 0, /* tp_as_number */
1807 0, /* tp_as_sequence */
1808 0, /* tp_as_mapping */
1809 0, /* tp_hash */
1810 0, /* tp_call */
1811 0, /* tp_str */
1812 PyObject_GenericGetAttr, /* tp_getattro */
1813 0, /* tp_setattro */
1814 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001815 Py_TPFLAGS_DEFAULT, /* tp_flags */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001816 sortwrapper_doc, /* tp_doc */
1817 0, /* tp_traverse */
1818 0, /* tp_clear */
1819 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1820};
1821
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001822
1823static PyObject *
1824sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1825{
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001826 if (!PyObject_TypeCheck(b, &PySortWrapper_Type)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001827 PyErr_SetString(PyExc_TypeError,
1828 "expected a sortwrapperobject");
1829 return NULL;
1830 }
1831 return PyObject_RichCompare(a->key, b->key, op);
1832}
1833
1834static void
1835sortwrapper_dealloc(sortwrapperobject *so)
1836{
1837 Py_XDECREF(so->key);
1838 Py_XDECREF(so->value);
1839 PyObject_Del(so);
1840}
1841
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001842/* Returns a new reference to a sortwrapper.
1843 Consumes the references to the two underlying objects. */
1844
1845static PyObject *
1846build_sortwrapper(PyObject *key, PyObject *value)
1847{
1848 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001849
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001850 so = PyObject_New(sortwrapperobject, &PySortWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001851 if (so == NULL)
1852 return NULL;
1853 so->key = key;
1854 so->value = value;
1855 return (PyObject *)so;
1856}
1857
1858/* Returns a new reference to the value underlying the wrapper. */
1859static PyObject *
1860sortwrapper_getvalue(PyObject *so)
1861{
1862 PyObject *value;
1863
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001864 if (!PyObject_TypeCheck(so, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001865 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001866 "expected a sortwrapperobject");
1867 return NULL;
1868 }
1869 value = ((sortwrapperobject *)so)->value;
1870 Py_INCREF(value);
1871 return value;
1872}
1873
1874/* Wrapper for user specified cmp functions in combination with a
1875 specified key function. Makes sure the cmp function is presented
1876 with the actual key instead of the sortwrapper */
1877
1878typedef struct {
1879 PyObject_HEAD
1880 PyObject *func;
1881} cmpwrapperobject;
1882
1883static void
1884cmpwrapper_dealloc(cmpwrapperobject *co)
1885{
1886 Py_XDECREF(co->func);
1887 PyObject_Del(co);
1888}
1889
1890static PyObject *
1891cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1892{
1893 PyObject *x, *y, *xx, *yy;
1894
1895 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1896 return NULL;
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001897 if (!PyObject_TypeCheck(x, &PySortWrapper_Type) ||
1898 !PyObject_TypeCheck(y, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001899 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001900 "expected a sortwrapperobject");
1901 return NULL;
1902 }
1903 xx = ((sortwrapperobject *)x)->key;
1904 yy = ((sortwrapperobject *)y)->key;
1905 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1906}
1907
1908PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1909
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001910PyTypeObject PyCmpWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001911 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001912 "cmpwrapper", /* tp_name */
1913 sizeof(cmpwrapperobject), /* tp_basicsize */
1914 0, /* tp_itemsize */
1915 /* methods */
1916 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1917 0, /* tp_print */
1918 0, /* tp_getattr */
1919 0, /* tp_setattr */
1920 0, /* tp_compare */
1921 0, /* tp_repr */
1922 0, /* tp_as_number */
1923 0, /* tp_as_sequence */
1924 0, /* tp_as_mapping */
1925 0, /* tp_hash */
1926 (ternaryfunc)cmpwrapper_call, /* tp_call */
1927 0, /* tp_str */
1928 PyObject_GenericGetAttr, /* tp_getattro */
1929 0, /* tp_setattro */
1930 0, /* tp_as_buffer */
1931 Py_TPFLAGS_DEFAULT, /* tp_flags */
1932 cmpwrapper_doc, /* tp_doc */
1933};
1934
1935static PyObject *
1936build_cmpwrapper(PyObject *cmpfunc)
1937{
1938 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001939
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001940 co = PyObject_New(cmpwrapperobject, &PyCmpWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001941 if (co == NULL)
1942 return NULL;
1943 Py_INCREF(cmpfunc);
1944 co->func = cmpfunc;
1945 return (PyObject *)co;
1946}
1947
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001948static int
1949is_default_cmp(PyObject *cmpfunc)
1950{
1951 PyCFunctionObject *f;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001952 const char *module;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001953 if (cmpfunc == NULL || cmpfunc == Py_None)
1954 return 1;
1955 if (!PyCFunction_Check(cmpfunc))
1956 return 0;
Guido van Rossumf1624cd2006-08-24 23:43:52 +00001957 f = (PyCFunctionObject *)cmpfunc;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001958 if (f->m_self != NULL)
1959 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001960 if (!PyUnicode_Check(f->m_module))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001961 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001962 module = PyUnicode_AsString(f->m_module);
1963 if (module == NULL)
1964 return 0;
Georg Brandl1a3284e2007-12-02 09:40:06 +00001965 if (strcmp(module, "builtins") != 0)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001966 return 0;
1967 if (strcmp(f->m_ml->ml_name, "cmp") != 0)
1968 return 0;
1969 return 1;
1970}
1971
Tim Petersa64dc242002-08-01 02:13:36 +00001972/* An adaptive, stable, natural mergesort. See listsort.txt.
1973 * Returns Py_None on success, NULL on error. Even in case of error, the
1974 * list will be some permutation of its input state (nothing is lost or
1975 * duplicated).
1976 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001977static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001978listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001979{
Tim Petersa64dc242002-08-01 02:13:36 +00001980 MergeState ms;
1981 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001982 Py_ssize_t nremaining;
1983 Py_ssize_t minrun;
1984 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001985 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001986 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001987 PyObject *compare = NULL;
1988 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001989 int reverse = 0;
1990 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001991 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001992 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001993 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001994
Tim Petersa64dc242002-08-01 02:13:36 +00001995 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001996 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001997 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001998 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
1999 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002000 return NULL;
2001 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002002 if (is_default_cmp(compare))
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002003 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002004 if (keyfunc == Py_None)
2005 keyfunc = NULL;
2006 if (compare != NULL && keyfunc != NULL) {
2007 compare = build_cmpwrapper(compare);
2008 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002009 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002010 } else
2011 Py_XINCREF(compare);
2012
Tim Petersb9099c32002-11-12 22:08:10 +00002013 /* The list is temporarily made empty, so that mutations performed
2014 * by comparison functions can't affect the slice of memory we're
2015 * sorting (allowing mutations during sorting is a core-dump
2016 * factory, since ob_item may change).
2017 */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002018 saved_ob_size = Py_Size(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002019 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002020 saved_allocated = self->allocated;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002021 Py_Size(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002022 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002023 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002024
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002025 if (keyfunc != NULL) {
2026 for (i=0 ; i < saved_ob_size ; i++) {
2027 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002028 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002029 NULL);
2030 if (key == NULL) {
2031 for (i=i-1 ; i>=0 ; i--) {
2032 kvpair = saved_ob_item[i];
2033 value = sortwrapper_getvalue(kvpair);
2034 saved_ob_item[i] = value;
2035 Py_DECREF(kvpair);
2036 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002037 goto dsu_fail;
2038 }
2039 kvpair = build_sortwrapper(key, value);
2040 if (kvpair == NULL)
2041 goto dsu_fail;
2042 saved_ob_item[i] = kvpair;
2043 }
2044 }
2045
2046 /* Reverse sort stability achieved by initially reversing the list,
2047 applying a stable forward sort, then reversing the final result. */
2048 if (reverse && saved_ob_size > 1)
2049 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2050
2051 merge_init(&ms, compare);
2052
Tim Petersb9099c32002-11-12 22:08:10 +00002053 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002054 if (nremaining < 2)
2055 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002056
Tim Petersa64dc242002-08-01 02:13:36 +00002057 /* March over the array once, left to right, finding natural runs,
2058 * and extending short natural runs to minrun elements.
2059 */
Tim Petersb9099c32002-11-12 22:08:10 +00002060 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002061 hi = lo + nremaining;
2062 minrun = merge_compute_minrun(nremaining);
2063 do {
2064 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002065 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002066
Tim Petersa64dc242002-08-01 02:13:36 +00002067 /* Identify next run. */
2068 n = count_run(lo, hi, compare, &descending);
2069 if (n < 0)
2070 goto fail;
2071 if (descending)
2072 reverse_slice(lo, lo + n);
2073 /* If short, extend to min(minrun, nremaining). */
2074 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002075 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002076 nremaining : minrun;
2077 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2078 goto fail;
2079 n = force;
2080 }
2081 /* Push run onto pending-runs stack, and maybe merge. */
2082 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002083 ms.pending[ms.n].base = lo;
2084 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002085 ++ms.n;
2086 if (merge_collapse(&ms) < 0)
2087 goto fail;
2088 /* Advance to find next run. */
2089 lo += n;
2090 nremaining -= n;
2091 } while (nremaining);
2092 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002093
Tim Petersa64dc242002-08-01 02:13:36 +00002094 if (merge_force_collapse(&ms) < 0)
2095 goto fail;
2096 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002097 assert(ms.pending[0].base == saved_ob_item);
2098 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002099
2100succeed:
2101 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002102fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002103 if (keyfunc != NULL) {
2104 for (i=0 ; i < saved_ob_size ; i++) {
2105 kvpair = saved_ob_item[i];
2106 value = sortwrapper_getvalue(kvpair);
2107 saved_ob_item[i] = value;
2108 Py_DECREF(kvpair);
2109 }
2110 }
2111
Armin Rigo93677f02004-07-29 12:40:23 +00002112 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002113 /* The user mucked with the list during the sort,
2114 * and we don't already have another error to report.
2115 */
2116 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2117 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002118 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002119
2120 if (reverse && saved_ob_size > 1)
2121 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2122
2123 merge_freemem(&ms);
2124
2125dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002126 final_ob_item = self->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002127 i = Py_Size(self);
2128 Py_Size(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002129 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002130 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002131 if (final_ob_item != NULL) {
2132 /* we cannot use list_clear() for this because it does not
2133 guarantee that the list is really empty when it returns */
2134 while (--i >= 0) {
2135 Py_XDECREF(final_ob_item[i]);
2136 }
2137 PyMem_FREE(final_ob_item);
2138 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002139 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002140 Py_XINCREF(result);
2141 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002142}
Tim Peters330f9e92002-07-19 07:05:44 +00002143#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002144#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002145
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002146int
Fred Drakea2f55112000-07-09 15:16:51 +00002147PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002148{
2149 if (v == NULL || !PyList_Check(v)) {
2150 PyErr_BadInternalCall();
2151 return -1;
2152 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002153 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002154 if (v == NULL)
2155 return -1;
2156 Py_DECREF(v);
2157 return 0;
2158}
2159
Guido van Rossumb86c5492001-02-12 22:06:02 +00002160static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002161listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002162{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002163 if (Py_Size(self) > 1)
2164 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002165 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002166}
2167
Guido van Rossum84c76f51990-10-30 13:32:20 +00002168int
Fred Drakea2f55112000-07-09 15:16:51 +00002169PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002170{
Tim Peters6063e262002-08-08 01:06:39 +00002171 PyListObject *self = (PyListObject *)v;
2172
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002173 if (v == NULL || !PyList_Check(v)) {
2174 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002175 return -1;
2176 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002177 if (Py_Size(self) > 1)
2178 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002179 return 0;
2180}
2181
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002182PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002183PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002184{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002185 PyObject *w;
2186 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002187 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002188 if (v == NULL || !PyList_Check(v)) {
2189 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002190 return NULL;
2191 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002192 n = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002193 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002194 if (w == NULL)
2195 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002196 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002197 memcpy((void *)p,
2198 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002199 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002200 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002201 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002202 p++;
2203 }
2204 return w;
2205}
2206
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002207static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002208listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002209{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002210 Py_ssize_t i, start=0, stop=Py_Size(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002211 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002212
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002213 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2214 _PyEval_SliceIndex, &start,
2215 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002216 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002217 if (start < 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002218 start += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002219 if (start < 0)
2220 start = 0;
2221 }
2222 if (stop < 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002223 stop += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002224 if (stop < 0)
2225 stop = 0;
2226 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002227 for (i = start; i < stop && i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002228 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2229 if (cmp > 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002230 return PyLong_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002231 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002232 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002234 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002235 return NULL;
2236}
2237
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002239listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002240{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002241 Py_ssize_t count = 0;
2242 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002243
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002244 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002245 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2246 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002247 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002248 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002249 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002250 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002251 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002252}
2253
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002254static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002255listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002256{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002257 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002258
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002259 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002260 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2261 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002262 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002263 (PyObject *)NULL) == 0)
2264 Py_RETURN_NONE;
2265 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002266 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002267 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002268 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002269 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002270 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002271 return NULL;
2272}
2273
Jeremy Hylton8caad492000-06-23 14:18:11 +00002274static int
2275list_traverse(PyListObject *o, visitproc visit, void *arg)
2276{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002277 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002278
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002279 for (i = Py_Size(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002280 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002281 return 0;
2282}
2283
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002284static PyObject *
2285list_richcompare(PyObject *v, PyObject *w, int op)
2286{
2287 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002288 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002289
2290 if (!PyList_Check(v) || !PyList_Check(w)) {
2291 Py_INCREF(Py_NotImplemented);
2292 return Py_NotImplemented;
2293 }
2294
2295 vl = (PyListObject *)v;
2296 wl = (PyListObject *)w;
2297
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002298 if (Py_Size(vl) != Py_Size(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002299 /* Shortcut: if the lengths differ, the lists differ */
2300 PyObject *res;
2301 if (op == Py_EQ)
2302 res = Py_False;
2303 else
2304 res = Py_True;
2305 Py_INCREF(res);
2306 return res;
2307 }
2308
2309 /* Search for the first index where items are different */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002310 for (i = 0; i < Py_Size(vl) && i < Py_Size(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002311 int k = PyObject_RichCompareBool(vl->ob_item[i],
2312 wl->ob_item[i], Py_EQ);
2313 if (k < 0)
2314 return NULL;
2315 if (!k)
2316 break;
2317 }
2318
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002319 if (i >= Py_Size(vl) || i >= Py_Size(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002320 /* No more items to compare -- compare sizes */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002321 Py_ssize_t vs = Py_Size(vl);
2322 Py_ssize_t ws = Py_Size(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002323 int cmp;
2324 PyObject *res;
2325 switch (op) {
2326 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002327 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002328 case Py_EQ: cmp = vs == ws; break;
2329 case Py_NE: cmp = vs != ws; break;
2330 case Py_GT: cmp = vs > ws; break;
2331 case Py_GE: cmp = vs >= ws; break;
2332 default: return NULL; /* cannot happen */
2333 }
2334 if (cmp)
2335 res = Py_True;
2336 else
2337 res = Py_False;
2338 Py_INCREF(res);
2339 return res;
2340 }
2341
2342 /* We have an item that differs -- shortcuts for EQ/NE */
2343 if (op == Py_EQ) {
2344 Py_INCREF(Py_False);
2345 return Py_False;
2346 }
2347 if (op == Py_NE) {
2348 Py_INCREF(Py_True);
2349 return Py_True;
2350 }
2351
2352 /* Compare the final item again using the proper operator */
2353 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2354}
2355
Tim Peters6d6c1a32001-08-02 04:15:00 +00002356static int
2357list_init(PyListObject *self, PyObject *args, PyObject *kw)
2358{
2359 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002360 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002361
2362 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2363 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002364
2365 /* Verify list invariants established by PyType_GenericAlloc() */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002366 assert(0 <= Py_Size(self));
2367 assert(Py_Size(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002368 assert(self->ob_item != NULL ||
2369 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002370
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002371 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002372 if (self->ob_item != NULL) {
2373 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002374 }
2375 if (arg != NULL) {
2376 PyObject *rv = listextend(self, arg);
2377 if (rv == NULL)
2378 return -1;
2379 Py_DECREF(rv);
2380 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002381 return 0;
2382}
2383
Raymond Hettinger1021c442003-11-07 15:38:09 +00002384static PyObject *list_iter(PyObject *seq);
2385static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2386
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002387PyDoc_STRVAR(getitem_doc,
2388"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002389PyDoc_STRVAR(reversed_doc,
2390"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391PyDoc_STRVAR(append_doc,
2392"L.append(object) -- append object to end");
2393PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002394"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002395PyDoc_STRVAR(insert_doc,
2396"L.insert(index, object) -- insert object before index");
2397PyDoc_STRVAR(pop_doc,
2398"L.pop([index]) -> item -- remove and return item at index (default last)");
2399PyDoc_STRVAR(remove_doc,
2400"L.remove(value) -- remove first occurrence of value");
2401PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002402"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002403PyDoc_STRVAR(count_doc,
2404"L.count(value) -> integer -- return number of occurrences of value");
2405PyDoc_STRVAR(reverse_doc,
2406"L.reverse() -- reverse *IN PLACE*");
2407PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002408"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2409cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002410
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002411static PyObject *list_subscript(PyListObject*, PyObject*);
2412
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002413static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002414 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002415 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002416 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002417 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002418 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002419 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002420 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002421 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002422 {"count", (PyCFunction)listcount, METH_O, count_doc},
2423 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002424 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002425 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002426};
2427
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002428static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002429 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002430 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002431 (ssizeargfunc)list_repeat, /* sq_repeat */
2432 (ssizeargfunc)list_item, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002433 0, /* sq_slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002434 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002435 0, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002436 (objobjproc)list_contains, /* sq_contains */
2437 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002438 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002439};
2440
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002441PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002442"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002443"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002444
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002445static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002446list_subscript(PyListObject* self, PyObject* item)
2447{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002448 if (PyIndex_Check(item)) {
2449 Py_ssize_t i;
2450 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002451 if (i == -1 && PyErr_Occurred())
2452 return NULL;
2453 if (i < 0)
2454 i += PyList_GET_SIZE(self);
2455 return list_item(self, i);
2456 }
2457 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002458 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002459 PyObject* result;
2460 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002461 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002462
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002463 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002464 &start, &stop, &step, &slicelength) < 0) {
2465 return NULL;
2466 }
2467
2468 if (slicelength <= 0) {
2469 return PyList_New(0);
2470 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002471 else if (step == 1) {
2472 return list_slice(self, start, stop);
2473 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002474 else {
2475 result = PyList_New(slicelength);
2476 if (!result) return NULL;
2477
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002478 src = self->ob_item;
2479 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002480 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002481 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002482 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002483 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002484 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002485 }
Tim Peters3b01a122002-07-19 02:35:45 +00002486
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002487 return result;
2488 }
2489 }
2490 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002491 PyErr_Format(PyExc_TypeError,
2492 "list indices must be integers, not %.200s",
2493 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002494 return NULL;
2495 }
2496}
2497
Tim Peters3b01a122002-07-19 02:35:45 +00002498static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002499list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2500{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002501 if (PyIndex_Check(item)) {
2502 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002503 if (i == -1 && PyErr_Occurred())
2504 return -1;
2505 if (i < 0)
2506 i += PyList_GET_SIZE(self);
2507 return list_ass_item(self, i, value);
2508 }
2509 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002510 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002511
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002512 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002513 &start, &stop, &step, &slicelength) < 0) {
2514 return -1;
2515 }
2516
Thomas Woutersed03b412007-08-28 21:37:11 +00002517 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002518 return list_ass_slice(self, start, stop, value);
2519
Thomas Woutersed03b412007-08-28 21:37:11 +00002520 /* Make sure s[5:2] = [..] inserts at the right place:
2521 before 5, not before 2. */
2522 if ((step < 0 && start < stop) ||
2523 (step > 0 && start > stop))
2524 stop = start;
2525
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002526 if (value == NULL) {
2527 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002528 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002529 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002530
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002531 if (slicelength <= 0)
2532 return 0;
2533
2534 if (step < 0) {
2535 stop = start + 1;
2536 start = stop + step*(slicelength - 1) - 1;
2537 step = -step;
2538 }
2539
2540 garbage = (PyObject**)
2541 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002542 if (!garbage) {
2543 PyErr_NoMemory();
2544 return -1;
2545 }
Tim Peters3b01a122002-07-19 02:35:45 +00002546
Thomas Woutersed03b412007-08-28 21:37:11 +00002547 /* drawing pictures might help understand these for
2548 loops. Basically, we memmove the parts of the
2549 list that are *not* part of the slice: step-1
2550 items for each item that is part of the slice,
2551 and then tail end of the list that was not
2552 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002553 for (cur = start, i = 0;
2554 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002555 cur += step, i++) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002556 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002557
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002558 garbage[i] = PyList_GET_ITEM(self, cur);
2559
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002560 if (cur + step >= Py_Size(self)) {
2561 lim = Py_Size(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002562 }
2563
Tim Petersb38e2b62004-07-29 02:29:26 +00002564 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002565 self->ob_item + cur + 1,
2566 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002567 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002568 cur = start + slicelength*step;
2569 if (cur < Py_Size(self)) {
2570 memmove(self->ob_item + cur - slicelength,
2571 self->ob_item + cur,
2572 (Py_Size(self) - cur) *
2573 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002574 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002575
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002576 Py_Size(self) -= slicelength;
2577 list_resize(self, Py_Size(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002578
2579 for (i = 0; i < slicelength; i++) {
2580 Py_DECREF(garbage[i]);
2581 }
2582 PyMem_FREE(garbage);
2583
2584 return 0;
2585 }
2586 else {
2587 /* assign slice */
Thomas Woutersed03b412007-08-28 21:37:11 +00002588 PyObject *ins, *seq;
2589 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002590 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002591
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002592 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002593 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002594 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002595 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002596 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002597 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002598 seq = PySequence_Fast(value,
Thomas Woutersed03b412007-08-28 21:37:11 +00002599 "must assign iterable "
2600 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002601 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002602 if (!seq)
2603 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002604
2605 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2606 PyErr_Format(PyExc_ValueError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002607 "attempt to assign sequence of "
2608 "size %zd to extended slice of "
2609 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002610 PySequence_Fast_GET_SIZE(seq),
2611 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002612 Py_DECREF(seq);
2613 return -1;
2614 }
2615
2616 if (!slicelength) {
2617 Py_DECREF(seq);
2618 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002619 }
2620
2621 garbage = (PyObject**)
2622 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 if (!garbage) {
2624 Py_DECREF(seq);
2625 PyErr_NoMemory();
2626 return -1;
2627 }
Tim Peters3b01a122002-07-19 02:35:45 +00002628
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002629 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002630 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002631 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002632 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002633 garbage[i] = selfitems[cur];
2634 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002635 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002636 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002637 }
2638
2639 for (i = 0; i < slicelength; i++) {
2640 Py_DECREF(garbage[i]);
2641 }
Tim Peters3b01a122002-07-19 02:35:45 +00002642
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002643 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002644 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002645
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002646 return 0;
2647 }
Tim Peters3b01a122002-07-19 02:35:45 +00002648 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002649 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002650 PyErr_Format(PyExc_TypeError,
2651 "list indices must be integers, not %.200s",
2652 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002653 return -1;
2654 }
2655}
2656
2657static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002658 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002659 (binaryfunc)list_subscript,
2660 (objobjargproc)list_ass_subscript
2661};
2662
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002663PyTypeObject PyList_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002664 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002665 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002666 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002667 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002668 (destructor)list_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002669 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002670 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002671 0, /* tp_setattr */
2672 0, /* tp_compare */
2673 (reprfunc)list_repr, /* tp_repr */
2674 0, /* tp_as_number */
2675 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002676 &list_as_mapping, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002677 0, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002678 0, /* tp_call */
2679 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002680 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002681 0, /* tp_setattro */
2682 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002683 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002684 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002685 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002686 (traverseproc)list_traverse, /* tp_traverse */
2687 (inquiry)list_clear, /* tp_clear */
2688 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002689 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002690 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002691 0, /* tp_iternext */
2692 list_methods, /* tp_methods */
2693 0, /* tp_members */
2694 0, /* tp_getset */
2695 0, /* tp_base */
2696 0, /* tp_dict */
2697 0, /* tp_descr_get */
2698 0, /* tp_descr_set */
2699 0, /* tp_dictoffset */
2700 (initproc)list_init, /* tp_init */
2701 PyType_GenericAlloc, /* tp_alloc */
2702 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002703 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002704};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002705
2706
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002707/*********************** List Iterator **************************/
2708
2709typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002710 PyObject_HEAD
2711 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002712 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002713} listiterobject;
2714
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002715static PyObject *list_iter(PyObject *);
2716static void listiter_dealloc(listiterobject *);
2717static int listiter_traverse(listiterobject *, visitproc, void *);
2718static PyObject *listiter_next(listiterobject *);
2719static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002720
Armin Rigof5b3e362006-02-11 21:32:43 +00002721PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002722
2723static PyMethodDef listiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002724 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002725 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002726};
2727
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002728PyTypeObject PyListIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002729 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002730 "list_iterator", /* tp_name */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002731 sizeof(listiterobject), /* tp_basicsize */
2732 0, /* tp_itemsize */
2733 /* methods */
2734 (destructor)listiter_dealloc, /* tp_dealloc */
2735 0, /* tp_print */
2736 0, /* tp_getattr */
2737 0, /* tp_setattr */
2738 0, /* tp_compare */
2739 0, /* tp_repr */
2740 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002741 0, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002742 0, /* tp_as_mapping */
2743 0, /* tp_hash */
2744 0, /* tp_call */
2745 0, /* tp_str */
2746 PyObject_GenericGetAttr, /* tp_getattro */
2747 0, /* tp_setattro */
2748 0, /* tp_as_buffer */
2749 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2750 0, /* tp_doc */
2751 (traverseproc)listiter_traverse, /* tp_traverse */
2752 0, /* tp_clear */
2753 0, /* tp_richcompare */
2754 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002755 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002756 (iternextfunc)listiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002757 listiter_methods, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002758 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002759};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002760
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002761
2762static PyObject *
2763list_iter(PyObject *seq)
2764{
2765 listiterobject *it;
2766
2767 if (!PyList_Check(seq)) {
2768 PyErr_BadInternalCall();
2769 return NULL;
2770 }
2771 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2772 if (it == NULL)
2773 return NULL;
2774 it->it_index = 0;
2775 Py_INCREF(seq);
2776 it->it_seq = (PyListObject *)seq;
2777 _PyObject_GC_TRACK(it);
2778 return (PyObject *)it;
2779}
2780
2781static void
2782listiter_dealloc(listiterobject *it)
2783{
2784 _PyObject_GC_UNTRACK(it);
2785 Py_XDECREF(it->it_seq);
2786 PyObject_GC_Del(it);
2787}
2788
2789static int
2790listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2791{
2792 Py_VISIT(it->it_seq);
2793 return 0;
2794}
2795
2796static PyObject *
2797listiter_next(listiterobject *it)
2798{
2799 PyListObject *seq;
2800 PyObject *item;
2801
2802 assert(it != NULL);
2803 seq = it->it_seq;
2804 if (seq == NULL)
2805 return NULL;
2806 assert(PyList_Check(seq));
2807
2808 if (it->it_index < PyList_GET_SIZE(seq)) {
2809 item = PyList_GET_ITEM(seq, it->it_index);
2810 ++it->it_index;
2811 Py_INCREF(item);
2812 return item;
2813 }
2814
2815 Py_DECREF(seq);
2816 it->it_seq = NULL;
2817 return NULL;
2818}
2819
2820static PyObject *
2821listiter_len(listiterobject *it)
2822{
2823 Py_ssize_t len;
2824 if (it->it_seq) {
2825 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2826 if (len >= 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002827 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002828 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002829 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002830}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002831/*********************** List Reverse Iterator **************************/
2832
2833typedef struct {
2834 PyObject_HEAD
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002835 Py_ssize_t it_index;
Raymond Hettinger001f2282003-11-08 11:58:44 +00002836 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002837} listreviterobject;
2838
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002839static PyObject *list_reversed(PyListObject *, PyObject *);
2840static void listreviter_dealloc(listreviterobject *);
2841static int listreviter_traverse(listreviterobject *, visitproc, void *);
2842static PyObject *listreviter_next(listreviterobject *);
2843static Py_ssize_t listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002844
2845static PySequenceMethods listreviter_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002846 (lenfunc)listreviter_len, /* sq_length */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002847 0, /* sq_concat */
2848};
2849
Raymond Hettinger1021c442003-11-07 15:38:09 +00002850PyTypeObject PyListRevIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002851 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002852 "list_reverseiterator", /* tp_name */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002853 sizeof(listreviterobject), /* tp_basicsize */
2854 0, /* tp_itemsize */
2855 /* methods */
2856 (destructor)listreviter_dealloc, /* tp_dealloc */
2857 0, /* tp_print */
2858 0, /* tp_getattr */
2859 0, /* tp_setattr */
2860 0, /* tp_compare */
2861 0, /* tp_repr */
2862 0, /* tp_as_number */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002863 &listreviter_as_sequence, /* tp_as_sequence */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002864 0, /* tp_as_mapping */
2865 0, /* tp_hash */
2866 0, /* tp_call */
2867 0, /* tp_str */
2868 PyObject_GenericGetAttr, /* tp_getattro */
2869 0, /* tp_setattro */
2870 0, /* tp_as_buffer */
2871 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2872 0, /* tp_doc */
2873 (traverseproc)listreviter_traverse, /* tp_traverse */
2874 0, /* tp_clear */
2875 0, /* tp_richcompare */
2876 0, /* tp_weaklistoffset */
2877 PyObject_SelfIter, /* tp_iter */
2878 (iternextfunc)listreviter_next, /* tp_iternext */
2879 0,
2880};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002881
2882static PyObject *
2883list_reversed(PyListObject *seq, PyObject *unused)
2884{
2885 listreviterobject *it;
2886
2887 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2888 if (it == NULL)
2889 return NULL;
2890 assert(PyList_Check(seq));
2891 it->it_index = PyList_GET_SIZE(seq) - 1;
2892 Py_INCREF(seq);
2893 it->it_seq = seq;
2894 PyObject_GC_Track(it);
2895 return (PyObject *)it;
2896}
2897
2898static void
2899listreviter_dealloc(listreviterobject *it)
2900{
2901 PyObject_GC_UnTrack(it);
2902 Py_XDECREF(it->it_seq);
2903 PyObject_GC_Del(it);
2904}
2905
2906static int
2907listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2908{
2909 Py_VISIT(it->it_seq);
2910 return 0;
2911}
2912
2913static PyObject *
2914listreviter_next(listreviterobject *it)
2915{
2916 PyObject *item;
2917 Py_ssize_t index = it->it_index;
2918 PyListObject *seq = it->it_seq;
2919
2920 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2921 item = PyList_GET_ITEM(seq, index);
2922 it->it_index--;
2923 Py_INCREF(item);
2924 return item;
2925 }
2926 it->it_index = -1;
2927 if (seq != NULL) {
2928 it->it_seq = NULL;
2929 Py_DECREF(seq);
2930 }
2931 return NULL;
2932}
2933
2934static Py_ssize_t
2935listreviter_len(listreviterobject *it)
2936{
2937 Py_ssize_t len = it->it_index + 1;
2938 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2939 return 0;
2940 return len;
2941}
2942