blob: 4bc5ca95213ef7cd6ccb437497afd5940223d53c [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* List object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
4
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00005#ifdef STDC_HEADERS
6#include <stddef.h>
7#else
8#include <sys/types.h> /* For size_t */
9#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Tim Peters8d9eb102004-07-31 02:24:20 +000011/* Ensure ob_item has room for at least newsize elements, and set
12 * ob_size to newsize. If newsize > ob_size on entry, the content
13 * of the new slots at exit is undefined heap trash; it's the caller's
14 * responsiblity to overwrite them with sane values.
15 * The number of allocated elements may grow, shrink, or stay the same.
16 * Failure is impossible if newsize <= self.allocated on entry, although
17 * that partly relies on an assumption that the system realloc() never
18 * fails when passed a number of bytes <= the number of bytes last
19 * allocated (the C standard doesn't guarantee this, but it's hard to
20 * imagine a realloc implementation where it wouldn't be true).
21 * Note that self->ob_item may change, and even if newsize is less
22 * than ob_size on entry.
23 */
Guido van Rossuma46d51d1995-01-26 22:59:43 +000024static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000025list_resize(PyListObject *self, Py_ssize_t newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000026{
Raymond Hettinger4bb95402004-02-13 11:36:39 +000027 PyObject **items;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000028 size_t new_allocated;
Martin v. Löwis18e16552006-02-15 17:27:45 +000029 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000030
Raymond Hettinger4bb95402004-02-13 11:36:39 +000031 /* Bypass realloc() when a previous overallocation is large enough
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000032 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
Raymond Hettinger4bb95402004-02-13 11:36:39 +000034 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000035 if (allocated >= newsize && newsize >= (allocated >> 1)) {
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +000036 assert(self->ob_item != NULL || newsize == 0);
Christian Heimes90aa7642007-12-19 02:45:37 +000037 Py_SIZE(self) = newsize;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000038 return 0;
39 }
40
41 /* This over-allocates proportional to the list size, making room
Tim Peters65b8b842001-05-26 05:28:40 +000042 * for additional growth. The over-allocation is mild, but is
43 * enough to give linear-time amortized behavior over a long
44 * sequence of appends() in the presence of a poorly-performing
Raymond Hettingerab517d22004-02-14 18:34:46 +000045 * system realloc().
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
Tim Peters65b8b842001-05-26 05:28:40 +000047 */
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;
Christian Heimes90aa7642007-12-19 02:45:37 +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 }
Christian Heimes90aa7642007-12-19 02:45:37 +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
Christian Heimes90aa7642007-12-19 02:45:37 +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 }
Christian Heimes90aa7642007-12-19 02:45:37 +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 }
Christian Heimes90aa7642007-12-19 02:45:37 +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{
Christian Heimes90aa7642007-12-19 02:45:37 +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. */
Christian Heimes90aa7642007-12-19 02:45:37 +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
Christian Heimes90aa7642007-12-19 02:45:37 +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
Christian Heimes90aa7642007-12-19 02:45:37 +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. */
Christian Heimes90aa7642007-12-19 02:45:37 +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{
Christian Heimes90aa7642007-12-19 02:45:37 +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
Christian Heimes90aa7642007-12-19 02:45:37 +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{
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +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)
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +0000465 size = Py_SIZE(a) * n;
466 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)
Christian Heimesaf98da12008-01-27 15:18:18 +0000469 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;
Christian Heimes90aa7642007-12-19 02:45:37 +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++) {
Christian Heimes90aa7642007-12-19 02:45:37 +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. */
Christian Heimes90aa7642007-12-19 02:45:37 +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 */
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimes90aa7642007-12-19 02:45:37 +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],
Christian Heimes90aa7642007-12-19 02:45:37 +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 */
Christian Heimes90aa7642007-12-19 02:45:37 +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;
Christian Heimesaf98da12008-01-27 15:18:18 +0000636 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000637
638
639 size = PyList_GET_SIZE(self);
Christian Heimesaf98da12008-01-27 15:18:18 +0000640 if (size == 0 || n == 1) {
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000641 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
Christian Heimesaf98da12008-01-27 15:18:18 +0000651 if (size > PY_SSIZE_T_MAX / n) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000652 return PyErr_NoMemory();
Christian Heimesaf98da12008-01-27 15:18:18 +0000653 }
654
655 if (list_resize(self, size*n) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000656 return NULL;
657
658 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000659 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000660 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
661 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000662 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000663 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000664 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000665 }
666 }
667 Py_INCREF(self);
668 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669}
670
Guido van Rossum4a450d01991-04-03 19:05:18 +0000671static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000672list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000673{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyObject *old_value;
Christian Heimes90aa7642007-12-19 02:45:37 +0000675 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 PyErr_SetString(PyExc_IndexError,
677 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000678 return -1;
679 }
680 if (v == NULL)
681 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000683 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000684 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000685 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000686 return 0;
687}
688
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000690listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000691{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000692 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000694 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000695 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000696 if (ins1(self, i, v) == 0)
697 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000698 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000699}
700
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000702listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000703{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000704 if (app1(self, v) == 0)
705 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000706 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000707}
708
Barry Warsawdedf6d61998-10-09 16:37:25 +0000709static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000710listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000711{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000712 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000713 Py_ssize_t m; /* size of self */
714 Py_ssize_t n; /* guess for size of b */
715 Py_ssize_t mn; /* m + n */
716 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000717 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000718
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000719 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000720 1) lists and tuples which can use PySequence_Fast ops
721 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000722 */
723 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000724 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000725 b = PySequence_Fast(b, "argument must be iterable");
726 if (!b)
727 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000728 n = PySequence_Fast_GET_SIZE(b);
729 if (n == 0) {
730 /* short circuit when b is empty */
731 Py_DECREF(b);
732 Py_RETURN_NONE;
733 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000734 m = Py_SIZE(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000735 if (list_resize(self, m + n) == -1) {
736 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000737 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000738 }
739 /* note that we may still have self == b here for the
740 * situation a.extend(a), but the following code works
741 * in that case too. Just make sure to resize self
742 * before calling PySequence_Fast_ITEMS.
743 */
744 /* populate the end of self with b's items */
745 src = PySequence_Fast_ITEMS(b);
746 dest = self->ob_item + m;
747 for (i = 0; i < n; i++) {
748 PyObject *o = src[i];
749 Py_INCREF(o);
750 dest[i] = o;
751 }
752 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000753 Py_RETURN_NONE;
754 }
755
756 it = PyObject_GetIter(b);
757 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000758 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000759 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000760
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000761 /* Guess a result list size. */
Christian Heimes255f53b2007-12-08 15:33:56 +0000762 n = _PyObject_LengthHint(b, 8);
Christian Heimes90aa7642007-12-19 02:45:37 +0000763 m = Py_SIZE(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000764 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000765 if (mn >= m) {
766 /* Make room. */
767 if (list_resize(self, mn) == -1)
768 goto error;
769 /* Make the list sane again. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000770 Py_SIZE(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000771 }
772 /* Else m + n overflowed; on the chance that n lied, and there really
773 * is enough room, ignore it. If n was telling the truth, we'll
774 * eventually run out of memory during the loop.
775 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000776
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000777 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000778 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000779 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000780 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000781 if (PyErr_Occurred()) {
782 if (PyErr_ExceptionMatches(PyExc_StopIteration))
783 PyErr_Clear();
784 else
785 goto error;
786 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000787 break;
788 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000789 if (Py_SIZE(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000790 /* steals ref */
Christian Heimes90aa7642007-12-19 02:45:37 +0000791 PyList_SET_ITEM(self, Py_SIZE(self), item);
792 ++Py_SIZE(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000793 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000794 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000795 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000796 Py_DECREF(item); /* append creates a new ref */
797 if (status < 0)
798 goto error;
799 }
800 }
801
802 /* Cut back result list if initial guess was too large. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000803 if (Py_SIZE(self) < self->allocated)
804 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000805
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000806 Py_DECREF(it);
807 Py_RETURN_NONE;
808
809 error:
810 Py_DECREF(it);
811 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000812}
813
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000814PyObject *
815_PyList_Extend(PyListObject *self, PyObject *b)
816{
817 return listextend(self, b);
818}
819
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000820static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000821list_inplace_concat(PyListObject *self, PyObject *other)
822{
823 PyObject *result;
824
825 result = listextend(self, other);
826 if (result == NULL)
827 return result;
828 Py_DECREF(result);
829 Py_INCREF(self);
830 return (PyObject *)self;
831}
832
833static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000834listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000835{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000836 Py_ssize_t i = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000837 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000838 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000839
Thomas Wouters89f507f2006-12-13 04:49:30 +0000840 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000841 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000842
Christian Heimes90aa7642007-12-19 02:45:37 +0000843 if (Py_SIZE(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000844 /* Special-case most common failure cause */
845 PyErr_SetString(PyExc_IndexError, "pop from empty list");
846 return NULL;
847 }
848 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000849 i += Py_SIZE(self);
850 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000851 PyErr_SetString(PyExc_IndexError, "pop index out of range");
852 return NULL;
853 }
854 v = self->ob_item[i];
Christian Heimes90aa7642007-12-19 02:45:37 +0000855 if (i == Py_SIZE(self) - 1) {
856 status = list_resize(self, Py_SIZE(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000857 assert(status >= 0);
858 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000859 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000860 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000861 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
862 assert(status >= 0);
863 /* Use status, so that in a release build compilers don't
864 * complain about the unused name.
865 */
Brett Cannon651dd522004-08-08 21:21:18 +0000866 (void) status;
867
868 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000869}
870
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000871/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
872static void
873reverse_slice(PyObject **lo, PyObject **hi)
874{
875 assert(lo && hi);
876
877 --hi;
878 while (lo < hi) {
879 PyObject *t = *lo;
880 *lo = *hi;
881 *hi = t;
882 ++lo;
883 --hi;
884 }
885}
886
Tim Petersa64dc242002-08-01 02:13:36 +0000887/* Lots of code for an adaptive, stable, natural mergesort. There are many
888 * pieces to this algorithm; read listsort.txt for overviews and details.
889 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000890
Guido van Rossum3f236de1996-12-10 23:55:39 +0000891/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000892 * comparison function (any callable Python object), which must not be
893 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
894 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000895 * Returns -1 on error, 1 if x < y, 0 if x >= y.
896 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000897static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000898islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000899{
Tim Petersf2a04732002-07-11 21:46:16 +0000900 PyObject *res;
901 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000902 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000903
Tim Peters66860f62002-08-04 17:47:26 +0000904 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000905 /* Call the user's comparison function and translate the 3-way
906 * result into true or false (or error).
907 */
Tim Petersf2a04732002-07-11 21:46:16 +0000908 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000909 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000910 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000911 Py_INCREF(x);
912 Py_INCREF(y);
913 PyTuple_SET_ITEM(args, 0, x);
914 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000915 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000917 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000918 return -1;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000919 if (!PyLong_CheckExact(res)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920 PyErr_Format(PyExc_TypeError,
921 "comparison function must return int, not %.200s",
922 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000924 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000925 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000926 i = PyLong_AsLong(res);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 Py_DECREF(res);
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000928 if (i == -1 && PyErr_Occurred()) {
929 /* Overflow in long conversion. */
930 return -1;
931 }
Tim Petersa8c974c2002-07-19 03:30:57 +0000932 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000933}
934
Tim Peters66860f62002-08-04 17:47:26 +0000935/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
936 * islt. This avoids a layer of function call in the usual case, and
937 * sorting does many comparisons.
938 * Returns -1 on error, 1 if x < y, 0 if x >= y.
939 */
940#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
941 PyObject_RichCompareBool(X, Y, Py_LT) : \
942 islt(X, Y, COMPARE))
943
944/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000945 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
946 started. It makes more sense in context <wink>. X and Y are PyObject*s.
947*/
Tim Peters66860f62002-08-04 17:47:26 +0000948#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000949 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000950
951/* binarysort is the best method for sorting small arrays: it does
952 few compares, but can do data movement quadratic in the number of
953 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000954 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000955 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000956 On entry, must have lo <= start <= hi, and that [lo, start) is already
957 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000958 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000959 Even in case of error, the output slice will be some permutation of
960 the input (nothing is lost or duplicated).
961*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000962static int
Fred Drakea2f55112000-07-09 15:16:51 +0000963binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
964 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000965{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000966 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000967 register PyObject **l, **p, **r;
968 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000969
Tim Petersa8c974c2002-07-19 03:30:57 +0000970 assert(lo <= start && start <= hi);
971 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000972 if (lo == start)
973 ++start;
974 for (; start < hi; ++start) {
975 /* set l to where *start belongs */
976 l = lo;
977 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000978 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000979 /* Invariants:
980 * pivot >= all in [lo, l).
981 * pivot < all in [r, start).
982 * The second is vacuously true at the start.
983 */
984 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000985 do {
986 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000987 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000988 r = p;
989 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000990 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000991 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000992 assert(l == r);
993 /* The invariants still hold, so pivot >= all in [lo, l) and
994 pivot < all in [l, start), so pivot belongs at l. Note
995 that if there are elements equal to pivot, l points to the
996 first slot after them -- that's why this sort is stable.
997 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000998 Caution: using memmove is much slower under MSVC 5;
999 we're not usually moving many slots. */
1000 for (p = start; p > l; --p)
1001 *p = *(p-1);
1002 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001003 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001004 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001005
1006 fail:
1007 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001008}
1009
Tim Petersa64dc242002-08-01 02:13:36 +00001010/*
1011Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1012is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001013
Tim Petersa64dc242002-08-01 02:13:36 +00001014 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001015
Tim Petersa64dc242002-08-01 02:13:36 +00001016or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001017
Tim Petersa64dc242002-08-01 02:13:36 +00001018 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001019
Tim Petersa64dc242002-08-01 02:13:36 +00001020Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1021For its intended use in a stable mergesort, the strictness of the defn of
1022"descending" is needed so that the caller can safely reverse a descending
1023sequence without violating stability (strict > ensures there are no equal
1024elements to get out of order).
1025
1026Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001027*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001028static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001029count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001030{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001031 Py_ssize_t k;
1032 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001033
Tim Petersa64dc242002-08-01 02:13:36 +00001034 assert(lo < hi);
1035 *descending = 0;
1036 ++lo;
1037 if (lo == hi)
1038 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001039
Tim Petersa64dc242002-08-01 02:13:36 +00001040 n = 2;
1041 IFLT(*lo, *(lo-1)) {
1042 *descending = 1;
1043 for (lo = lo+1; lo < hi; ++lo, ++n) {
1044 IFLT(*lo, *(lo-1))
1045 ;
1046 else
1047 break;
1048 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001049 }
Tim Petersa64dc242002-08-01 02:13:36 +00001050 else {
1051 for (lo = lo+1; lo < hi; ++lo, ++n) {
1052 IFLT(*lo, *(lo-1))
1053 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001054 }
1055 }
1056
Tim Petersa64dc242002-08-01 02:13:36 +00001057 return n;
1058fail:
1059 return -1;
1060}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001061
Tim Petersa64dc242002-08-01 02:13:36 +00001062/*
1063Locate the proper position of key in a sorted vector; if the vector contains
1064an element equal to key, return the position immediately to the left of
1065the leftmost equal element. [gallop_right() does the same except returns
1066the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001067
Tim Petersa64dc242002-08-01 02:13:36 +00001068"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001069
Tim Petersa64dc242002-08-01 02:13:36 +00001070"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1071hint is to the final result, the faster this runs.
1072
1073The return value is the int k in 0..n such that
1074
1075 a[k-1] < key <= a[k]
1076
1077pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1078key belongs at index k; or, IOW, the first k elements of a should precede
1079key, and the last n-k should follow key.
1080
1081Returns -1 on error. See listsort.txt for info on the method.
1082*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001083static Py_ssize_t
1084gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001085{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001086 Py_ssize_t ofs;
1087 Py_ssize_t lastofs;
1088 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001089
1090 assert(key && a && n > 0 && hint >= 0 && hint < n);
1091
1092 a += hint;
1093 lastofs = 0;
1094 ofs = 1;
1095 IFLT(*a, key) {
1096 /* a[hint] < key -- gallop right, until
1097 * a[hint + lastofs] < key <= a[hint + ofs]
1098 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001099 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001100 while (ofs < maxofs) {
1101 IFLT(a[ofs], key) {
1102 lastofs = ofs;
1103 ofs = (ofs << 1) + 1;
1104 if (ofs <= 0) /* int overflow */
1105 ofs = maxofs;
1106 }
1107 else /* key <= a[hint + ofs] */
1108 break;
1109 }
1110 if (ofs > maxofs)
1111 ofs = maxofs;
1112 /* Translate back to offsets relative to &a[0]. */
1113 lastofs += hint;
1114 ofs += hint;
1115 }
1116 else {
1117 /* key <= a[hint] -- gallop left, until
1118 * a[hint - ofs] < key <= a[hint - lastofs]
1119 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001120 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001121 while (ofs < maxofs) {
1122 IFLT(*(a-ofs), key)
1123 break;
1124 /* key <= a[hint - ofs] */
1125 lastofs = ofs;
1126 ofs = (ofs << 1) + 1;
1127 if (ofs <= 0) /* int overflow */
1128 ofs = maxofs;
1129 }
1130 if (ofs > maxofs)
1131 ofs = maxofs;
1132 /* Translate back to positive offsets relative to &a[0]. */
1133 k = lastofs;
1134 lastofs = hint - ofs;
1135 ofs = hint - k;
1136 }
1137 a -= hint;
1138
1139 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1140 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1141 * right of lastofs but no farther right than ofs. Do a binary
1142 * search, with invariant a[lastofs-1] < key <= a[ofs].
1143 */
1144 ++lastofs;
1145 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001146 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001147
1148 IFLT(a[m], key)
1149 lastofs = m+1; /* a[m] < key */
1150 else
1151 ofs = m; /* key <= a[m] */
1152 }
1153 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1154 return ofs;
1155
1156fail:
1157 return -1;
1158}
1159
1160/*
1161Exactly like gallop_left(), except that if key already exists in a[0:n],
1162finds the position immediately to the right of the rightmost equal value.
1163
1164The return value is the int k in 0..n such that
1165
1166 a[k-1] <= key < a[k]
1167
1168or -1 if error.
1169
1170The code duplication is massive, but this is enough different given that
1171we're sticking to "<" comparisons that it's much harder to follow if
1172written as one routine with yet another "left or right?" flag.
1173*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001174static Py_ssize_t
1175gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001176{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001177 Py_ssize_t ofs;
1178 Py_ssize_t lastofs;
1179 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001180
1181 assert(key && a && n > 0 && hint >= 0 && hint < n);
1182
1183 a += hint;
1184 lastofs = 0;
1185 ofs = 1;
1186 IFLT(key, *a) {
1187 /* key < a[hint] -- gallop left, until
1188 * a[hint - ofs] <= key < a[hint - lastofs]
1189 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001190 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001191 while (ofs < maxofs) {
1192 IFLT(key, *(a-ofs)) {
1193 lastofs = ofs;
1194 ofs = (ofs << 1) + 1;
1195 if (ofs <= 0) /* int overflow */
1196 ofs = maxofs;
1197 }
1198 else /* a[hint - ofs] <= key */
1199 break;
1200 }
1201 if (ofs > maxofs)
1202 ofs = maxofs;
1203 /* Translate back to positive offsets relative to &a[0]. */
1204 k = lastofs;
1205 lastofs = hint - ofs;
1206 ofs = hint - k;
1207 }
1208 else {
1209 /* a[hint] <= key -- gallop right, until
1210 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001211 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001212 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001213 while (ofs < maxofs) {
1214 IFLT(key, a[ofs])
1215 break;
1216 /* a[hint + ofs] <= key */
1217 lastofs = ofs;
1218 ofs = (ofs << 1) + 1;
1219 if (ofs <= 0) /* int overflow */
1220 ofs = maxofs;
1221 }
1222 if (ofs > maxofs)
1223 ofs = maxofs;
1224 /* Translate back to offsets relative to &a[0]. */
1225 lastofs += hint;
1226 ofs += hint;
1227 }
1228 a -= hint;
1229
1230 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1231 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1232 * right of lastofs but no farther right than ofs. Do a binary
1233 * search, with invariant a[lastofs-1] <= key < a[ofs].
1234 */
1235 ++lastofs;
1236 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001237 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001238
1239 IFLT(key, a[m])
1240 ofs = m; /* key < a[m] */
1241 else
1242 lastofs = m+1; /* a[m] <= key */
1243 }
1244 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1245 return ofs;
1246
1247fail:
1248 return -1;
1249}
1250
1251/* The maximum number of entries in a MergeState's pending-runs stack.
1252 * This is enough to sort arrays of size up to about
1253 * 32 * phi ** MAX_MERGE_PENDING
1254 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1255 * with 2**64 elements.
1256 */
1257#define MAX_MERGE_PENDING 85
1258
Tim Peterse05f65a2002-08-10 05:21:15 +00001259/* When we get into galloping mode, we stay there until both runs win less
1260 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001261 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001262#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001263
1264/* Avoid malloc for small temp arrays. */
1265#define MERGESTATE_TEMP_SIZE 256
1266
1267/* One MergeState exists on the stack per invocation of mergesort. It's just
1268 * a convenient way to pass state around among the helper functions.
1269 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001270struct s_slice {
1271 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001272 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001273};
1274
Tim Petersa64dc242002-08-01 02:13:36 +00001275typedef struct s_MergeState {
1276 /* The user-supplied comparison function. or NULL if none given. */
1277 PyObject *compare;
1278
Tim Peterse05f65a2002-08-10 05:21:15 +00001279 /* This controls when we get *into* galloping mode. It's initialized
1280 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1281 * random data, and lower for highly structured data.
1282 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001283 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001284
Tim Petersa64dc242002-08-01 02:13:36 +00001285 /* 'a' is temp storage to help with merges. It contains room for
1286 * alloced entries.
1287 */
1288 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001289 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001290
1291 /* A stack of n pending runs yet to be merged. Run #i starts at
1292 * address base[i] and extends for len[i] elements. It's always
1293 * true (so long as the indices are in bounds) that
1294 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001295 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001296 *
1297 * so we could cut the storage for this, but it's a minor amount,
1298 * and keeping all the info explicit simplifies the code.
1299 */
1300 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001301 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001302
1303 /* 'a' points to this when possible, rather than muck with malloc. */
1304 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1305} MergeState;
1306
1307/* Conceptually a MergeState's constructor. */
1308static void
1309merge_init(MergeState *ms, PyObject *compare)
1310{
1311 assert(ms != NULL);
1312 ms->compare = compare;
1313 ms->a = ms->temparray;
1314 ms->alloced = MERGESTATE_TEMP_SIZE;
1315 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001316 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001317}
1318
1319/* Free all the temp memory owned by the MergeState. This must be called
1320 * when you're done with a MergeState, and may be called before then if
1321 * you want to free the temp memory early.
1322 */
1323static void
1324merge_freemem(MergeState *ms)
1325{
1326 assert(ms != NULL);
1327 if (ms->a != ms->temparray)
1328 PyMem_Free(ms->a);
1329 ms->a = ms->temparray;
1330 ms->alloced = MERGESTATE_TEMP_SIZE;
1331}
1332
1333/* Ensure enough temp memory for 'need' array slots is available.
1334 * Returns 0 on success and -1 if the memory can't be gotten.
1335 */
1336static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001337merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001338{
1339 assert(ms != NULL);
1340 if (need <= ms->alloced)
1341 return 0;
1342 /* Don't realloc! That can cost cycles to copy the old data, but
1343 * we don't care what's in the block.
1344 */
1345 merge_freemem(ms);
1346 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1347 if (ms->a) {
1348 ms->alloced = need;
1349 return 0;
1350 }
1351 PyErr_NoMemory();
1352 merge_freemem(ms); /* reset to sane state */
1353 return -1;
1354}
1355#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1356 merge_getmem(MS, NEED))
1357
1358/* Merge the na elements starting at pa with the nb elements starting at pb
1359 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1360 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1361 * merge, and should have na <= nb. See listsort.txt for more info.
1362 * Return 0 if successful, -1 if error.
1363 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001364static Py_ssize_t
1365merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1366 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001367{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001368 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001369 PyObject *compare;
1370 PyObject **dest;
1371 int result = -1; /* guilty until proved innocent */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001372 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001373
1374 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1375 if (MERGE_GETMEM(ms, na) < 0)
1376 return -1;
1377 memcpy(ms->a, pa, na * sizeof(PyObject*));
1378 dest = pa;
1379 pa = ms->a;
1380
1381 *dest++ = *pb++;
1382 --nb;
1383 if (nb == 0)
1384 goto Succeed;
1385 if (na == 1)
1386 goto CopyB;
1387
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001388 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001389 compare = ms->compare;
1390 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001391 Py_ssize_t acount = 0; /* # of times A won in a row */
1392 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001393
1394 /* Do the straightforward thing until (if ever) one run
1395 * appears to win consistently.
1396 */
1397 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001398 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001399 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001400 if (k) {
1401 if (k < 0)
1402 goto Fail;
1403 *dest++ = *pb++;
1404 ++bcount;
1405 acount = 0;
1406 --nb;
1407 if (nb == 0)
1408 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001409 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001410 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001411 }
1412 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001413 *dest++ = *pa++;
1414 ++acount;
1415 bcount = 0;
1416 --na;
1417 if (na == 1)
1418 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001419 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001420 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001421 }
Tim Petersa64dc242002-08-01 02:13:36 +00001422 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001423
Tim Petersa64dc242002-08-01 02:13:36 +00001424 /* One run is winning so consistently that galloping may
1425 * be a huge win. So try that, and continue galloping until
1426 * (if ever) neither run appears to be winning consistently
1427 * anymore.
1428 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001429 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001430 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001431 assert(na > 1 && nb > 0);
1432 min_gallop -= min_gallop > 1;
1433 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001434 k = gallop_right(*pb, pa, na, 0, compare);
1435 acount = k;
1436 if (k) {
1437 if (k < 0)
1438 goto Fail;
1439 memcpy(dest, pa, k * sizeof(PyObject *));
1440 dest += k;
1441 pa += k;
1442 na -= k;
1443 if (na == 1)
1444 goto CopyB;
1445 /* na==0 is impossible now if the comparison
1446 * function is consistent, but we can't assume
1447 * that it is.
1448 */
1449 if (na == 0)
1450 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001451 }
Tim Petersa64dc242002-08-01 02:13:36 +00001452 *dest++ = *pb++;
1453 --nb;
1454 if (nb == 0)
1455 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001456
Tim Petersa64dc242002-08-01 02:13:36 +00001457 k = gallop_left(*pa, pb, nb, 0, compare);
1458 bcount = k;
1459 if (k) {
1460 if (k < 0)
1461 goto Fail;
1462 memmove(dest, pb, k * sizeof(PyObject *));
1463 dest += k;
1464 pb += k;
1465 nb -= k;
1466 if (nb == 0)
1467 goto Succeed;
1468 }
1469 *dest++ = *pa++;
1470 --na;
1471 if (na == 1)
1472 goto CopyB;
1473 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001474 ++min_gallop; /* penalize it for leaving galloping mode */
1475 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001476 }
1477Succeed:
1478 result = 0;
1479Fail:
1480 if (na)
1481 memcpy(dest, pa, na * sizeof(PyObject*));
1482 return result;
1483CopyB:
1484 assert(na == 1 && nb > 0);
1485 /* The last element of pa belongs at the end of the merge. */
1486 memmove(dest, pb, nb * sizeof(PyObject *));
1487 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001488 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001489}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001490
Tim Petersa64dc242002-08-01 02:13:36 +00001491/* Merge the na elements starting at pa with the nb elements starting at pb
1492 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1493 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1494 * merge, and should have na >= nb. See listsort.txt for more info.
1495 * Return 0 if successful, -1 if error.
1496 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001497static Py_ssize_t
1498merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001499{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001500 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001501 PyObject *compare;
1502 PyObject **dest;
1503 int result = -1; /* guilty until proved innocent */
1504 PyObject **basea;
1505 PyObject **baseb;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001506 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001507
1508 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1509 if (MERGE_GETMEM(ms, nb) < 0)
1510 return -1;
1511 dest = pb + nb - 1;
1512 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1513 basea = pa;
1514 baseb = ms->a;
1515 pb = ms->a + nb - 1;
1516 pa += na - 1;
1517
1518 *dest-- = *pa--;
1519 --na;
1520 if (na == 0)
1521 goto Succeed;
1522 if (nb == 1)
1523 goto CopyA;
1524
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001525 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001526 compare = ms->compare;
1527 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001528 Py_ssize_t acount = 0; /* # of times A won in a row */
1529 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001530
1531 /* Do the straightforward thing until (if ever) one run
1532 * appears to win consistently.
1533 */
1534 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001535 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001536 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001537 if (k) {
1538 if (k < 0)
1539 goto Fail;
1540 *dest-- = *pa--;
1541 ++acount;
1542 bcount = 0;
1543 --na;
1544 if (na == 0)
1545 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001546 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001547 break;
1548 }
1549 else {
1550 *dest-- = *pb--;
1551 ++bcount;
1552 acount = 0;
1553 --nb;
1554 if (nb == 1)
1555 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001556 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001557 break;
1558 }
1559 }
1560
1561 /* One run is winning so consistently that galloping may
1562 * be a huge win. So try that, and continue galloping until
1563 * (if ever) neither run appears to be winning consistently
1564 * anymore.
1565 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001566 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001567 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001568 assert(na > 0 && nb > 1);
1569 min_gallop -= min_gallop > 1;
1570 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001571 k = gallop_right(*pb, basea, na, na-1, compare);
1572 if (k < 0)
1573 goto Fail;
1574 k = na - k;
1575 acount = k;
1576 if (k) {
1577 dest -= k;
1578 pa -= k;
1579 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1580 na -= k;
1581 if (na == 0)
1582 goto Succeed;
1583 }
1584 *dest-- = *pb--;
1585 --nb;
1586 if (nb == 1)
1587 goto CopyA;
1588
1589 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1590 if (k < 0)
1591 goto Fail;
1592 k = nb - k;
1593 bcount = k;
1594 if (k) {
1595 dest -= k;
1596 pb -= k;
1597 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1598 nb -= k;
1599 if (nb == 1)
1600 goto CopyA;
1601 /* nb==0 is impossible now if the comparison
1602 * function is consistent, but we can't assume
1603 * that it is.
1604 */
1605 if (nb == 0)
1606 goto Succeed;
1607 }
1608 *dest-- = *pa--;
1609 --na;
1610 if (na == 0)
1611 goto Succeed;
1612 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001613 ++min_gallop; /* penalize it for leaving galloping mode */
1614 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001615 }
1616Succeed:
1617 result = 0;
1618Fail:
1619 if (nb)
1620 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1621 return result;
1622CopyA:
1623 assert(nb == 1 && na > 0);
1624 /* The first element of pb belongs at the front of the merge. */
1625 dest -= na;
1626 pa -= na;
1627 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1628 *dest = *pb;
1629 return 0;
1630}
1631
1632/* Merge the two runs at stack indices i and i+1.
1633 * Returns 0 on success, -1 on error.
1634 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001635static Py_ssize_t
1636merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001637{
1638 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001639 Py_ssize_t na, nb;
1640 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001641 PyObject *compare;
1642
1643 assert(ms != NULL);
1644 assert(ms->n >= 2);
1645 assert(i >= 0);
1646 assert(i == ms->n - 2 || i == ms->n - 3);
1647
Tim Peterse05f65a2002-08-10 05:21:15 +00001648 pa = ms->pending[i].base;
1649 na = ms->pending[i].len;
1650 pb = ms->pending[i+1].base;
1651 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001652 assert(na > 0 && nb > 0);
1653 assert(pa + na == pb);
1654
1655 /* Record the length of the combined runs; if i is the 3rd-last
1656 * run now, also slide over the last run (which isn't involved
1657 * in this merge). The current run i+1 goes away in any case.
1658 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001659 ms->pending[i].len = na + nb;
1660 if (i == ms->n - 3)
1661 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001662 --ms->n;
1663
1664 /* Where does b start in a? Elements in a before that can be
1665 * ignored (already in place).
1666 */
1667 compare = ms->compare;
1668 k = gallop_right(*pb, pa, na, 0, compare);
1669 if (k < 0)
1670 return -1;
1671 pa += k;
1672 na -= k;
1673 if (na == 0)
1674 return 0;
1675
1676 /* Where does a end in b? Elements in b after that can be
1677 * ignored (already in place).
1678 */
1679 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1680 if (nb <= 0)
1681 return nb;
1682
1683 /* Merge what remains of the runs, using a temp array with
1684 * min(na, nb) elements.
1685 */
1686 if (na <= nb)
1687 return merge_lo(ms, pa, na, pb, nb);
1688 else
1689 return merge_hi(ms, pa, na, pb, nb);
1690}
1691
1692/* Examine the stack of runs waiting to be merged, merging adjacent runs
1693 * until the stack invariants are re-established:
1694 *
1695 * 1. len[-3] > len[-2] + len[-1]
1696 * 2. len[-2] > len[-1]
1697 *
1698 * See listsort.txt for more info.
1699 *
1700 * Returns 0 on success, -1 on error.
1701 */
1702static int
1703merge_collapse(MergeState *ms)
1704{
Tim Peterse05f65a2002-08-10 05:21:15 +00001705 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001706
1707 assert(ms);
1708 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001709 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001710 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1711 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001712 --n;
1713 if (merge_at(ms, n) < 0)
1714 return -1;
1715 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001716 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001717 if (merge_at(ms, n) < 0)
1718 return -1;
1719 }
1720 else
1721 break;
1722 }
1723 return 0;
1724}
1725
1726/* Regardless of invariants, merge all runs on the stack until only one
1727 * remains. This is used at the end of the mergesort.
1728 *
1729 * Returns 0 on success, -1 on error.
1730 */
1731static int
1732merge_force_collapse(MergeState *ms)
1733{
Tim Peterse05f65a2002-08-10 05:21:15 +00001734 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001735
1736 assert(ms);
1737 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001738 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001739 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001740 --n;
1741 if (merge_at(ms, n) < 0)
1742 return -1;
1743 }
1744 return 0;
1745}
1746
1747/* Compute a good value for the minimum run length; natural runs shorter
1748 * than this are boosted artificially via binary insertion.
1749 *
1750 * If n < 64, return n (it's too small to bother with fancy stuff).
1751 * Else if n is an exact power of 2, return 32.
1752 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1753 * strictly less than, an exact power of 2.
1754 *
1755 * See listsort.txt for more info.
1756 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001757static Py_ssize_t
1758merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001759{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001760 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001761
1762 assert(n >= 0);
1763 while (n >= 64) {
1764 r |= n & 1;
1765 n >>= 1;
1766 }
1767 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001768}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001769
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001770/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001771 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001772 which is returned during the undecorate phase. By exposing only the key
1773 during comparisons, the underlying sort stability characteristics are left
1774 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001775 the key instead of a full record. */
1776
1777typedef struct {
1778 PyObject_HEAD
1779 PyObject *key;
1780 PyObject *value;
1781} sortwrapperobject;
1782
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001783PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001784static PyObject *
1785sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1786static void
1787sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001788
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001789PyTypeObject PySortWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001790 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001791 "sortwrapper", /* tp_name */
1792 sizeof(sortwrapperobject), /* tp_basicsize */
1793 0, /* tp_itemsize */
1794 /* methods */
1795 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1796 0, /* tp_print */
1797 0, /* tp_getattr */
1798 0, /* tp_setattr */
1799 0, /* tp_compare */
1800 0, /* tp_repr */
1801 0, /* tp_as_number */
1802 0, /* tp_as_sequence */
1803 0, /* tp_as_mapping */
1804 0, /* tp_hash */
1805 0, /* tp_call */
1806 0, /* tp_str */
1807 PyObject_GenericGetAttr, /* tp_getattro */
1808 0, /* tp_setattro */
1809 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001810 Py_TPFLAGS_DEFAULT, /* tp_flags */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001811 sortwrapper_doc, /* tp_doc */
1812 0, /* tp_traverse */
1813 0, /* tp_clear */
1814 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1815};
1816
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001817
1818static PyObject *
1819sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1820{
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001821 if (!PyObject_TypeCheck(b, &PySortWrapper_Type)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001822 PyErr_SetString(PyExc_TypeError,
1823 "expected a sortwrapperobject");
1824 return NULL;
1825 }
1826 return PyObject_RichCompare(a->key, b->key, op);
1827}
1828
1829static void
1830sortwrapper_dealloc(sortwrapperobject *so)
1831{
1832 Py_XDECREF(so->key);
1833 Py_XDECREF(so->value);
1834 PyObject_Del(so);
1835}
1836
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001837/* Returns a new reference to a sortwrapper.
1838 Consumes the references to the two underlying objects. */
1839
1840static PyObject *
1841build_sortwrapper(PyObject *key, PyObject *value)
1842{
1843 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001844
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001845 so = PyObject_New(sortwrapperobject, &PySortWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001846 if (so == NULL)
1847 return NULL;
1848 so->key = key;
1849 so->value = value;
1850 return (PyObject *)so;
1851}
1852
1853/* Returns a new reference to the value underlying the wrapper. */
1854static PyObject *
1855sortwrapper_getvalue(PyObject *so)
1856{
1857 PyObject *value;
1858
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001859 if (!PyObject_TypeCheck(so, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001860 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001861 "expected a sortwrapperobject");
1862 return NULL;
1863 }
1864 value = ((sortwrapperobject *)so)->value;
1865 Py_INCREF(value);
1866 return value;
1867}
1868
1869/* Wrapper for user specified cmp functions in combination with a
1870 specified key function. Makes sure the cmp function is presented
1871 with the actual key instead of the sortwrapper */
1872
1873typedef struct {
1874 PyObject_HEAD
1875 PyObject *func;
1876} cmpwrapperobject;
1877
1878static void
1879cmpwrapper_dealloc(cmpwrapperobject *co)
1880{
1881 Py_XDECREF(co->func);
1882 PyObject_Del(co);
1883}
1884
1885static PyObject *
1886cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1887{
1888 PyObject *x, *y, *xx, *yy;
1889
1890 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1891 return NULL;
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001892 if (!PyObject_TypeCheck(x, &PySortWrapper_Type) ||
1893 !PyObject_TypeCheck(y, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001894 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001895 "expected a sortwrapperobject");
1896 return NULL;
1897 }
1898 xx = ((sortwrapperobject *)x)->key;
1899 yy = ((sortwrapperobject *)y)->key;
1900 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1901}
1902
1903PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1904
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001905PyTypeObject PyCmpWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001906 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001907 "cmpwrapper", /* tp_name */
1908 sizeof(cmpwrapperobject), /* tp_basicsize */
1909 0, /* tp_itemsize */
1910 /* methods */
1911 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1912 0, /* tp_print */
1913 0, /* tp_getattr */
1914 0, /* tp_setattr */
1915 0, /* tp_compare */
1916 0, /* tp_repr */
1917 0, /* tp_as_number */
1918 0, /* tp_as_sequence */
1919 0, /* tp_as_mapping */
1920 0, /* tp_hash */
1921 (ternaryfunc)cmpwrapper_call, /* tp_call */
1922 0, /* tp_str */
1923 PyObject_GenericGetAttr, /* tp_getattro */
1924 0, /* tp_setattro */
1925 0, /* tp_as_buffer */
1926 Py_TPFLAGS_DEFAULT, /* tp_flags */
1927 cmpwrapper_doc, /* tp_doc */
1928};
1929
1930static PyObject *
1931build_cmpwrapper(PyObject *cmpfunc)
1932{
1933 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001934
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001935 co = PyObject_New(cmpwrapperobject, &PyCmpWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001936 if (co == NULL)
1937 return NULL;
1938 Py_INCREF(cmpfunc);
1939 co->func = cmpfunc;
1940 return (PyObject *)co;
1941}
1942
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001943static int
1944is_default_cmp(PyObject *cmpfunc)
1945{
1946 PyCFunctionObject *f;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001947 const char *module;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001948 if (cmpfunc == NULL || cmpfunc == Py_None)
1949 return 1;
1950 if (!PyCFunction_Check(cmpfunc))
1951 return 0;
Guido van Rossumf1624cd2006-08-24 23:43:52 +00001952 f = (PyCFunctionObject *)cmpfunc;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001953 if (f->m_self != NULL)
1954 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001955 if (!PyUnicode_Check(f->m_module))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001956 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001957 module = PyUnicode_AsString(f->m_module);
1958 if (module == NULL)
1959 return 0;
Georg Brandl1a3284e2007-12-02 09:40:06 +00001960 if (strcmp(module, "builtins") != 0)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001961 return 0;
1962 if (strcmp(f->m_ml->ml_name, "cmp") != 0)
1963 return 0;
1964 return 1;
1965}
1966
Tim Petersa64dc242002-08-01 02:13:36 +00001967/* An adaptive, stable, natural mergesort. See listsort.txt.
1968 * Returns Py_None on success, NULL on error. Even in case of error, the
1969 * list will be some permutation of its input state (nothing is lost or
1970 * duplicated).
1971 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001972static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001973listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001974{
Tim Petersa64dc242002-08-01 02:13:36 +00001975 MergeState ms;
1976 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001977 Py_ssize_t nremaining;
1978 Py_ssize_t minrun;
1979 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001980 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001981 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001982 PyObject *compare = NULL;
1983 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001984 int reverse = 0;
1985 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001986 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001987 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001988 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001989
Tim Petersa64dc242002-08-01 02:13:36 +00001990 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001991 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001992 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001993 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
1994 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001995 return NULL;
1996 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001997 if (is_default_cmp(compare))
Skip Montanaro4abd5f02003-01-02 20:51:08 +00001998 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001999 if (keyfunc == Py_None)
2000 keyfunc = NULL;
2001 if (compare != NULL && keyfunc != NULL) {
2002 compare = build_cmpwrapper(compare);
2003 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002004 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002005 } else
2006 Py_XINCREF(compare);
2007
Tim Petersb9099c32002-11-12 22:08:10 +00002008 /* The list is temporarily made empty, so that mutations performed
2009 * by comparison functions can't affect the slice of memory we're
2010 * sorting (allowing mutations during sorting is a core-dump
2011 * factory, since ob_item may change).
2012 */
Christian Heimes90aa7642007-12-19 02:45:37 +00002013 saved_ob_size = Py_SIZE(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002014 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002015 saved_allocated = self->allocated;
Christian Heimes90aa7642007-12-19 02:45:37 +00002016 Py_SIZE(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002017 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002018 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002019
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002020 if (keyfunc != NULL) {
2021 for (i=0 ; i < saved_ob_size ; i++) {
2022 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002023 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002024 NULL);
2025 if (key == NULL) {
2026 for (i=i-1 ; i>=0 ; i--) {
2027 kvpair = saved_ob_item[i];
2028 value = sortwrapper_getvalue(kvpair);
2029 saved_ob_item[i] = value;
2030 Py_DECREF(kvpair);
2031 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002032 goto dsu_fail;
2033 }
2034 kvpair = build_sortwrapper(key, value);
2035 if (kvpair == NULL)
2036 goto dsu_fail;
2037 saved_ob_item[i] = kvpair;
2038 }
2039 }
2040
2041 /* Reverse sort stability achieved by initially reversing the list,
2042 applying a stable forward sort, then reversing the final result. */
2043 if (reverse && saved_ob_size > 1)
2044 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2045
2046 merge_init(&ms, compare);
2047
Tim Petersb9099c32002-11-12 22:08:10 +00002048 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002049 if (nremaining < 2)
2050 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002051
Tim Petersa64dc242002-08-01 02:13:36 +00002052 /* March over the array once, left to right, finding natural runs,
2053 * and extending short natural runs to minrun elements.
2054 */
Tim Petersb9099c32002-11-12 22:08:10 +00002055 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002056 hi = lo + nremaining;
2057 minrun = merge_compute_minrun(nremaining);
2058 do {
2059 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002060 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002061
Tim Petersa64dc242002-08-01 02:13:36 +00002062 /* Identify next run. */
2063 n = count_run(lo, hi, compare, &descending);
2064 if (n < 0)
2065 goto fail;
2066 if (descending)
2067 reverse_slice(lo, lo + n);
2068 /* If short, extend to min(minrun, nremaining). */
2069 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002070 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002071 nremaining : minrun;
2072 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2073 goto fail;
2074 n = force;
2075 }
2076 /* Push run onto pending-runs stack, and maybe merge. */
2077 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002078 ms.pending[ms.n].base = lo;
2079 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002080 ++ms.n;
2081 if (merge_collapse(&ms) < 0)
2082 goto fail;
2083 /* Advance to find next run. */
2084 lo += n;
2085 nremaining -= n;
2086 } while (nremaining);
2087 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002088
Tim Petersa64dc242002-08-01 02:13:36 +00002089 if (merge_force_collapse(&ms) < 0)
2090 goto fail;
2091 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002092 assert(ms.pending[0].base == saved_ob_item);
2093 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002094
2095succeed:
2096 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002097fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002098 if (keyfunc != NULL) {
2099 for (i=0 ; i < saved_ob_size ; i++) {
2100 kvpair = saved_ob_item[i];
2101 value = sortwrapper_getvalue(kvpair);
2102 saved_ob_item[i] = value;
2103 Py_DECREF(kvpair);
2104 }
2105 }
2106
Armin Rigo93677f02004-07-29 12:40:23 +00002107 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002108 /* The user mucked with the list during the sort,
2109 * and we don't already have another error to report.
2110 */
2111 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2112 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002113 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002114
2115 if (reverse && saved_ob_size > 1)
2116 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2117
2118 merge_freemem(&ms);
2119
2120dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002121 final_ob_item = self->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +00002122 i = Py_SIZE(self);
2123 Py_SIZE(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002124 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002125 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002126 if (final_ob_item != NULL) {
2127 /* we cannot use list_clear() for this because it does not
2128 guarantee that the list is really empty when it returns */
2129 while (--i >= 0) {
2130 Py_XDECREF(final_ob_item[i]);
2131 }
2132 PyMem_FREE(final_ob_item);
2133 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002134 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002135 Py_XINCREF(result);
2136 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002137}
Tim Peters330f9e92002-07-19 07:05:44 +00002138#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002139#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002140
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002141int
Fred Drakea2f55112000-07-09 15:16:51 +00002142PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002143{
2144 if (v == NULL || !PyList_Check(v)) {
2145 PyErr_BadInternalCall();
2146 return -1;
2147 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002148 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002149 if (v == NULL)
2150 return -1;
2151 Py_DECREF(v);
2152 return 0;
2153}
2154
Guido van Rossumb86c5492001-02-12 22:06:02 +00002155static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002156listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002157{
Christian Heimes90aa7642007-12-19 02:45:37 +00002158 if (Py_SIZE(self) > 1)
2159 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002160 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002161}
2162
Guido van Rossum84c76f51990-10-30 13:32:20 +00002163int
Fred Drakea2f55112000-07-09 15:16:51 +00002164PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002165{
Tim Peters6063e262002-08-08 01:06:39 +00002166 PyListObject *self = (PyListObject *)v;
2167
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002168 if (v == NULL || !PyList_Check(v)) {
2169 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002170 return -1;
2171 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002172 if (Py_SIZE(self) > 1)
2173 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002174 return 0;
2175}
2176
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002177PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002178PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002179{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002180 PyObject *w;
Christian Heimes2c181612007-12-17 20:04:13 +00002181 PyObject **p, **q;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002182 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002183 if (v == NULL || !PyList_Check(v)) {
2184 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002185 return NULL;
2186 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002187 n = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002188 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002189 if (w == NULL)
2190 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002191 p = ((PyTupleObject *)w)->ob_item;
Christian Heimes2c181612007-12-17 20:04:13 +00002192 q = ((PyListObject *)v)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002193 while (--n >= 0) {
Christian Heimes2c181612007-12-17 20:04:13 +00002194 Py_INCREF(*q);
2195 *p = *q;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002196 p++;
Christian Heimes2c181612007-12-17 20:04:13 +00002197 q++;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002198 }
2199 return w;
2200}
2201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002202static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002203listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002204{
Christian Heimes90aa7642007-12-19 02:45:37 +00002205 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002206 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002207
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002208 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2209 _PyEval_SliceIndex, &start,
2210 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002211 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002212 if (start < 0) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002213 start += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002214 if (start < 0)
2215 start = 0;
2216 }
2217 if (stop < 0) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002218 stop += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002219 if (stop < 0)
2220 stop = 0;
2221 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002222 for (i = start; i < stop && i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002223 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2224 if (cmp > 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002225 return PyLong_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002226 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002227 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002228 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002229 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002230 return NULL;
2231}
2232
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002233static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002234listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002235{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002236 Py_ssize_t count = 0;
2237 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002238
Christian Heimes90aa7642007-12-19 02:45:37 +00002239 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002240 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2241 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002242 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002243 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002244 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002245 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002246 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002247}
2248
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002249static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002250listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002251{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002252 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002253
Christian Heimes90aa7642007-12-19 02:45:37 +00002254 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002255 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2256 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002257 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002258 (PyObject *)NULL) == 0)
2259 Py_RETURN_NONE;
2260 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002261 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002262 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002263 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002264 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002265 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002266 return NULL;
2267}
2268
Jeremy Hylton8caad492000-06-23 14:18:11 +00002269static int
2270list_traverse(PyListObject *o, visitproc visit, void *arg)
2271{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002272 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002273
Christian Heimes90aa7642007-12-19 02:45:37 +00002274 for (i = Py_SIZE(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002275 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002276 return 0;
2277}
2278
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002279static PyObject *
2280list_richcompare(PyObject *v, PyObject *w, int op)
2281{
2282 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002283 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002284
2285 if (!PyList_Check(v) || !PyList_Check(w)) {
2286 Py_INCREF(Py_NotImplemented);
2287 return Py_NotImplemented;
2288 }
2289
2290 vl = (PyListObject *)v;
2291 wl = (PyListObject *)w;
2292
Christian Heimes90aa7642007-12-19 02:45:37 +00002293 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002294 /* Shortcut: if the lengths differ, the lists differ */
2295 PyObject *res;
2296 if (op == Py_EQ)
2297 res = Py_False;
2298 else
2299 res = Py_True;
2300 Py_INCREF(res);
2301 return res;
2302 }
2303
2304 /* Search for the first index where items are different */
Christian Heimes90aa7642007-12-19 02:45:37 +00002305 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002306 int k = PyObject_RichCompareBool(vl->ob_item[i],
2307 wl->ob_item[i], Py_EQ);
2308 if (k < 0)
2309 return NULL;
2310 if (!k)
2311 break;
2312 }
2313
Christian Heimes90aa7642007-12-19 02:45:37 +00002314 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002315 /* No more items to compare -- compare sizes */
Christian Heimes90aa7642007-12-19 02:45:37 +00002316 Py_ssize_t vs = Py_SIZE(vl);
2317 Py_ssize_t ws = Py_SIZE(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002318 int cmp;
2319 PyObject *res;
2320 switch (op) {
2321 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002322 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002323 case Py_EQ: cmp = vs == ws; break;
2324 case Py_NE: cmp = vs != ws; break;
2325 case Py_GT: cmp = vs > ws; break;
2326 case Py_GE: cmp = vs >= ws; break;
2327 default: return NULL; /* cannot happen */
2328 }
2329 if (cmp)
2330 res = Py_True;
2331 else
2332 res = Py_False;
2333 Py_INCREF(res);
2334 return res;
2335 }
2336
2337 /* We have an item that differs -- shortcuts for EQ/NE */
2338 if (op == Py_EQ) {
2339 Py_INCREF(Py_False);
2340 return Py_False;
2341 }
2342 if (op == Py_NE) {
2343 Py_INCREF(Py_True);
2344 return Py_True;
2345 }
2346
2347 /* Compare the final item again using the proper operator */
2348 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2349}
2350
Tim Peters6d6c1a32001-08-02 04:15:00 +00002351static int
2352list_init(PyListObject *self, PyObject *args, PyObject *kw)
2353{
2354 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002355 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002356
2357 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2358 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002359
2360 /* Verify list invariants established by PyType_GenericAlloc() */
Christian Heimes90aa7642007-12-19 02:45:37 +00002361 assert(0 <= Py_SIZE(self));
2362 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002363 assert(self->ob_item != NULL ||
2364 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002365
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002366 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002367 if (self->ob_item != NULL) {
2368 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002369 }
2370 if (arg != NULL) {
2371 PyObject *rv = listextend(self, arg);
2372 if (rv == NULL)
2373 return -1;
2374 Py_DECREF(rv);
2375 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002376 return 0;
2377}
2378
Raymond Hettinger1021c442003-11-07 15:38:09 +00002379static PyObject *list_iter(PyObject *seq);
2380static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2381
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002382PyDoc_STRVAR(getitem_doc,
2383"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002384PyDoc_STRVAR(reversed_doc,
2385"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002386PyDoc_STRVAR(append_doc,
2387"L.append(object) -- append object to end");
2388PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002389"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002390PyDoc_STRVAR(insert_doc,
2391"L.insert(index, object) -- insert object before index");
2392PyDoc_STRVAR(pop_doc,
2393"L.pop([index]) -> item -- remove and return item at index (default last)");
2394PyDoc_STRVAR(remove_doc,
2395"L.remove(value) -- remove first occurrence of value");
2396PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002397"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002398PyDoc_STRVAR(count_doc,
2399"L.count(value) -> integer -- return number of occurrences of value");
2400PyDoc_STRVAR(reverse_doc,
2401"L.reverse() -- reverse *IN PLACE*");
2402PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002403"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2404cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002405
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002406static PyObject *list_subscript(PyListObject*, PyObject*);
2407
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002408static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002409 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002410 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002411 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002412 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002413 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002414 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002415 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002416 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002417 {"count", (PyCFunction)listcount, METH_O, count_doc},
2418 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002419 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002420 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002421};
2422
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002423static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002424 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002425 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002426 (ssizeargfunc)list_repeat, /* sq_repeat */
2427 (ssizeargfunc)list_item, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002428 0, /* sq_slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002429 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002430 0, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002431 (objobjproc)list_contains, /* sq_contains */
2432 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002433 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002434};
2435
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002436PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002437"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002438"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002439
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002440static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002441list_subscript(PyListObject* self, PyObject* item)
2442{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002443 if (PyIndex_Check(item)) {
2444 Py_ssize_t i;
2445 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002446 if (i == -1 && PyErr_Occurred())
2447 return NULL;
2448 if (i < 0)
2449 i += PyList_GET_SIZE(self);
2450 return list_item(self, i);
2451 }
2452 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002453 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002454 PyObject* result;
2455 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002456 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002457
Christian Heimes90aa7642007-12-19 02:45:37 +00002458 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002459 &start, &stop, &step, &slicelength) < 0) {
2460 return NULL;
2461 }
2462
2463 if (slicelength <= 0) {
2464 return PyList_New(0);
2465 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002466 else if (step == 1) {
2467 return list_slice(self, start, stop);
2468 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002469 else {
2470 result = PyList_New(slicelength);
2471 if (!result) return NULL;
2472
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002473 src = self->ob_item;
2474 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002475 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002476 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002477 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002478 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002479 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002480 }
Tim Peters3b01a122002-07-19 02:35:45 +00002481
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002482 return result;
2483 }
2484 }
2485 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002486 PyErr_Format(PyExc_TypeError,
2487 "list indices must be integers, not %.200s",
2488 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002489 return NULL;
2490 }
2491}
2492
Tim Peters3b01a122002-07-19 02:35:45 +00002493static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002494list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2495{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002496 if (PyIndex_Check(item)) {
2497 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002498 if (i == -1 && PyErr_Occurred())
2499 return -1;
2500 if (i < 0)
2501 i += PyList_GET_SIZE(self);
2502 return list_ass_item(self, i, value);
2503 }
2504 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002505 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002506
Christian Heimes90aa7642007-12-19 02:45:37 +00002507 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002508 &start, &stop, &step, &slicelength) < 0) {
2509 return -1;
2510 }
2511
Thomas Woutersed03b412007-08-28 21:37:11 +00002512 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002513 return list_ass_slice(self, start, stop, value);
2514
Thomas Woutersed03b412007-08-28 21:37:11 +00002515 /* Make sure s[5:2] = [..] inserts at the right place:
2516 before 5, not before 2. */
2517 if ((step < 0 && start < stop) ||
2518 (step > 0 && start > stop))
2519 stop = start;
2520
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002521 if (value == NULL) {
2522 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002523 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002524 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002525
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002526 if (slicelength <= 0)
2527 return 0;
2528
2529 if (step < 0) {
2530 stop = start + 1;
2531 start = stop + step*(slicelength - 1) - 1;
2532 step = -step;
2533 }
2534
2535 garbage = (PyObject**)
2536 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002537 if (!garbage) {
2538 PyErr_NoMemory();
2539 return -1;
2540 }
Tim Peters3b01a122002-07-19 02:35:45 +00002541
Thomas Woutersed03b412007-08-28 21:37:11 +00002542 /* drawing pictures might help understand these for
2543 loops. Basically, we memmove the parts of the
2544 list that are *not* part of the slice: step-1
2545 items for each item that is part of the slice,
2546 and then tail end of the list that was not
2547 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002548 for (cur = start, i = 0;
2549 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002550 cur += step, i++) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002551 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002552
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002553 garbage[i] = PyList_GET_ITEM(self, cur);
2554
Christian Heimes90aa7642007-12-19 02:45:37 +00002555 if (cur + step >= Py_SIZE(self)) {
2556 lim = Py_SIZE(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002557 }
2558
Tim Petersb38e2b62004-07-29 02:29:26 +00002559 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002560 self->ob_item + cur + 1,
2561 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002562 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002563 cur = start + slicelength*step;
Christian Heimes90aa7642007-12-19 02:45:37 +00002564 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002565 memmove(self->ob_item + cur - slicelength,
2566 self->ob_item + cur,
Christian Heimes90aa7642007-12-19 02:45:37 +00002567 (Py_SIZE(self) - cur) *
Thomas Woutersed03b412007-08-28 21:37:11 +00002568 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002569 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002570
Christian Heimes90aa7642007-12-19 02:45:37 +00002571 Py_SIZE(self) -= slicelength;
2572 list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002573
2574 for (i = 0; i < slicelength; i++) {
2575 Py_DECREF(garbage[i]);
2576 }
2577 PyMem_FREE(garbage);
2578
2579 return 0;
2580 }
2581 else {
2582 /* assign slice */
Thomas Woutersed03b412007-08-28 21:37:11 +00002583 PyObject *ins, *seq;
2584 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002585 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002586
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002587 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002588 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002589 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002590 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002591 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002592 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002593 seq = PySequence_Fast(value,
Thomas Woutersed03b412007-08-28 21:37:11 +00002594 "must assign iterable "
2595 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002596 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002597 if (!seq)
2598 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002599
2600 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2601 PyErr_Format(PyExc_ValueError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002602 "attempt to assign sequence of "
2603 "size %zd to extended slice of "
2604 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002605 PySequence_Fast_GET_SIZE(seq),
2606 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002607 Py_DECREF(seq);
2608 return -1;
2609 }
2610
2611 if (!slicelength) {
2612 Py_DECREF(seq);
2613 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002614 }
2615
2616 garbage = (PyObject**)
2617 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002618 if (!garbage) {
2619 Py_DECREF(seq);
2620 PyErr_NoMemory();
2621 return -1;
2622 }
Tim Peters3b01a122002-07-19 02:35:45 +00002623
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002624 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002625 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002626 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002627 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002628 garbage[i] = selfitems[cur];
2629 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002630 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002631 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002632 }
2633
2634 for (i = 0; i < slicelength; i++) {
2635 Py_DECREF(garbage[i]);
2636 }
Tim Peters3b01a122002-07-19 02:35:45 +00002637
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002638 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002639 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002640
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002641 return 0;
2642 }
Tim Peters3b01a122002-07-19 02:35:45 +00002643 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002644 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 PyErr_Format(PyExc_TypeError,
2646 "list indices must be integers, not %.200s",
2647 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002648 return -1;
2649 }
2650}
2651
2652static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002653 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002654 (binaryfunc)list_subscript,
2655 (objobjargproc)list_ass_subscript
2656};
2657
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002658PyTypeObject PyList_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002659 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002660 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002661 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002662 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002663 (destructor)list_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002664 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002665 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002666 0, /* tp_setattr */
2667 0, /* tp_compare */
2668 (reprfunc)list_repr, /* tp_repr */
2669 0, /* tp_as_number */
2670 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002671 &list_as_mapping, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002672 0, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002673 0, /* tp_call */
2674 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002675 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002676 0, /* tp_setattro */
2677 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002678 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002679 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002680 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002681 (traverseproc)list_traverse, /* tp_traverse */
2682 (inquiry)list_clear, /* tp_clear */
2683 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002684 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002685 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002686 0, /* tp_iternext */
2687 list_methods, /* tp_methods */
2688 0, /* tp_members */
2689 0, /* tp_getset */
2690 0, /* tp_base */
2691 0, /* tp_dict */
2692 0, /* tp_descr_get */
2693 0, /* tp_descr_set */
2694 0, /* tp_dictoffset */
2695 (initproc)list_init, /* tp_init */
2696 PyType_GenericAlloc, /* tp_alloc */
2697 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002698 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002699};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002700
2701
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002702/*********************** List Iterator **************************/
2703
2704typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002705 PyObject_HEAD
2706 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002707 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002708} listiterobject;
2709
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002710static PyObject *list_iter(PyObject *);
2711static void listiter_dealloc(listiterobject *);
2712static int listiter_traverse(listiterobject *, visitproc, void *);
2713static PyObject *listiter_next(listiterobject *);
2714static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002715
Armin Rigof5b3e362006-02-11 21:32:43 +00002716PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002717
2718static PyMethodDef listiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002719 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002720 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002721};
2722
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002723PyTypeObject PyListIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002724 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002725 "list_iterator", /* tp_name */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002726 sizeof(listiterobject), /* tp_basicsize */
2727 0, /* tp_itemsize */
2728 /* methods */
2729 (destructor)listiter_dealloc, /* tp_dealloc */
2730 0, /* tp_print */
2731 0, /* tp_getattr */
2732 0, /* tp_setattr */
2733 0, /* tp_compare */
2734 0, /* tp_repr */
2735 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002736 0, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002737 0, /* tp_as_mapping */
2738 0, /* tp_hash */
2739 0, /* tp_call */
2740 0, /* tp_str */
2741 PyObject_GenericGetAttr, /* tp_getattro */
2742 0, /* tp_setattro */
2743 0, /* tp_as_buffer */
2744 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2745 0, /* tp_doc */
2746 (traverseproc)listiter_traverse, /* tp_traverse */
2747 0, /* tp_clear */
2748 0, /* tp_richcompare */
2749 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002750 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002751 (iternextfunc)listiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002752 listiter_methods, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002753 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002754};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002755
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002756
2757static PyObject *
2758list_iter(PyObject *seq)
2759{
2760 listiterobject *it;
2761
2762 if (!PyList_Check(seq)) {
2763 PyErr_BadInternalCall();
2764 return NULL;
2765 }
2766 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2767 if (it == NULL)
2768 return NULL;
2769 it->it_index = 0;
2770 Py_INCREF(seq);
2771 it->it_seq = (PyListObject *)seq;
2772 _PyObject_GC_TRACK(it);
2773 return (PyObject *)it;
2774}
2775
2776static void
2777listiter_dealloc(listiterobject *it)
2778{
2779 _PyObject_GC_UNTRACK(it);
2780 Py_XDECREF(it->it_seq);
2781 PyObject_GC_Del(it);
2782}
2783
2784static int
2785listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2786{
2787 Py_VISIT(it->it_seq);
2788 return 0;
2789}
2790
2791static PyObject *
2792listiter_next(listiterobject *it)
2793{
2794 PyListObject *seq;
2795 PyObject *item;
2796
2797 assert(it != NULL);
2798 seq = it->it_seq;
2799 if (seq == NULL)
2800 return NULL;
2801 assert(PyList_Check(seq));
2802
2803 if (it->it_index < PyList_GET_SIZE(seq)) {
2804 item = PyList_GET_ITEM(seq, it->it_index);
2805 ++it->it_index;
2806 Py_INCREF(item);
2807 return item;
2808 }
2809
2810 Py_DECREF(seq);
2811 it->it_seq = NULL;
2812 return NULL;
2813}
2814
2815static PyObject *
2816listiter_len(listiterobject *it)
2817{
2818 Py_ssize_t len;
2819 if (it->it_seq) {
2820 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2821 if (len >= 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002822 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002823 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002824 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002825}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002826/*********************** List Reverse Iterator **************************/
2827
2828typedef struct {
2829 PyObject_HEAD
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002830 Py_ssize_t it_index;
Raymond Hettinger001f2282003-11-08 11:58:44 +00002831 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002832} listreviterobject;
2833
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002834static PyObject *list_reversed(PyListObject *, PyObject *);
2835static void listreviter_dealloc(listreviterobject *);
2836static int listreviter_traverse(listreviterobject *, visitproc, void *);
2837static PyObject *listreviter_next(listreviterobject *);
2838static Py_ssize_t listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002839
2840static PySequenceMethods listreviter_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002841 (lenfunc)listreviter_len, /* sq_length */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002842 0, /* sq_concat */
2843};
2844
Raymond Hettinger1021c442003-11-07 15:38:09 +00002845PyTypeObject PyListRevIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002846 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002847 "list_reverseiterator", /* tp_name */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002848 sizeof(listreviterobject), /* tp_basicsize */
2849 0, /* tp_itemsize */
2850 /* methods */
2851 (destructor)listreviter_dealloc, /* tp_dealloc */
2852 0, /* tp_print */
2853 0, /* tp_getattr */
2854 0, /* tp_setattr */
2855 0, /* tp_compare */
2856 0, /* tp_repr */
2857 0, /* tp_as_number */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002858 &listreviter_as_sequence, /* tp_as_sequence */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002859 0, /* tp_as_mapping */
2860 0, /* tp_hash */
2861 0, /* tp_call */
2862 0, /* tp_str */
2863 PyObject_GenericGetAttr, /* tp_getattro */
2864 0, /* tp_setattro */
2865 0, /* tp_as_buffer */
2866 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2867 0, /* tp_doc */
2868 (traverseproc)listreviter_traverse, /* tp_traverse */
2869 0, /* tp_clear */
2870 0, /* tp_richcompare */
2871 0, /* tp_weaklistoffset */
2872 PyObject_SelfIter, /* tp_iter */
2873 (iternextfunc)listreviter_next, /* tp_iternext */
2874 0,
2875};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002876
2877static PyObject *
2878list_reversed(PyListObject *seq, PyObject *unused)
2879{
2880 listreviterobject *it;
2881
2882 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2883 if (it == NULL)
2884 return NULL;
2885 assert(PyList_Check(seq));
2886 it->it_index = PyList_GET_SIZE(seq) - 1;
2887 Py_INCREF(seq);
2888 it->it_seq = seq;
2889 PyObject_GC_Track(it);
2890 return (PyObject *)it;
2891}
2892
2893static void
2894listreviter_dealloc(listreviterobject *it)
2895{
2896 PyObject_GC_UnTrack(it);
2897 Py_XDECREF(it->it_seq);
2898 PyObject_GC_Del(it);
2899}
2900
2901static int
2902listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2903{
2904 Py_VISIT(it->it_seq);
2905 return 0;
2906}
2907
2908static PyObject *
2909listreviter_next(listreviterobject *it)
2910{
2911 PyObject *item;
2912 Py_ssize_t index = it->it_index;
2913 PyListObject *seq = it->it_seq;
2914
2915 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2916 item = PyList_GET_ITEM(seq, index);
2917 it->it_index--;
2918 Py_INCREF(item);
2919 return item;
2920 }
2921 it->it_index = -1;
2922 if (seq != NULL) {
2923 it->it_seq = NULL;
2924 Py_DECREF(seq);
2925 }
2926 return NULL;
2927}
2928
2929static Py_ssize_t
2930listreviter_len(listreviterobject *it)
2931{
2932 Py_ssize_t len = it->it_index + 1;
2933 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2934 return 0;
2935 return len;
2936}
2937