blob: 18d3b901a2745a3440032b9ad3d563ea72298756 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* List object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
4
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00005#ifdef STDC_HEADERS
6#include <stddef.h>
7#else
8#include <sys/types.h> /* For size_t */
9#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Tim Peters8d9eb102004-07-31 02:24:20 +000011/* Ensure ob_item has room for at least newsize elements, and set
12 * ob_size to newsize. If newsize > ob_size on entry, the content
13 * of the new slots at exit is undefined heap trash; it's the caller's
14 * responsiblity to overwrite them with sane values.
15 * The number of allocated elements may grow, shrink, or stay the same.
16 * Failure is impossible if newsize <= self.allocated on entry, although
17 * that partly relies on an assumption that the system realloc() never
18 * fails when passed a number of bytes <= the number of bytes last
19 * allocated (the C standard doesn't guarantee this, but it's hard to
20 * imagine a realloc implementation where it wouldn't be true).
21 * Note that self->ob_item may change, and even if newsize is less
22 * than ob_size on entry.
23 */
Guido van Rossuma46d51d1995-01-26 22:59:43 +000024static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000025list_resize(PyListObject *self, Py_ssize_t newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000026{
Raymond Hettinger4bb95402004-02-13 11:36:39 +000027 PyObject **items;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000028 size_t new_allocated;
Martin v. Löwis18e16552006-02-15 17:27:45 +000029 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000030
Raymond Hettinger4bb95402004-02-13 11:36:39 +000031 /* Bypass realloc() when a previous overallocation is large enough
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000032 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
Raymond Hettinger4bb95402004-02-13 11:36:39 +000034 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000035 if (allocated >= newsize && newsize >= (allocated >> 1)) {
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +000036 assert(self->ob_item != NULL || newsize == 0);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000037 Py_Size(self) = newsize;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000038 return 0;
39 }
40
41 /* This over-allocates proportional to the list size, making room
Tim Peters65b8b842001-05-26 05:28:40 +000042 * for additional growth. The over-allocation is mild, but is
43 * enough to give linear-time amortized behavior over a long
44 * sequence of appends() in the presence of a poorly-performing
Raymond Hettingerab517d22004-02-14 18:34:46 +000045 * system realloc().
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
Tim Peters65b8b842001-05-26 05:28:40 +000047 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000048 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;
49 if (newsize == 0)
50 new_allocated = 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000051 items = self->ob_item;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000052 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
53 PyMem_RESIZE(items, PyObject *, new_allocated);
Raymond Hettinger4bb95402004-02-13 11:36:39 +000054 else
55 items = NULL;
56 if (items == NULL) {
57 PyErr_NoMemory();
58 return -1;
59 }
60 self->ob_item = items;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000061 Py_Size(self) = newsize;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000062 self->allocated = new_allocated;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000063 return 0;
64}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000065
Raymond Hettinger0468e412004-05-05 05:37:53 +000066/* Empty list reuse scheme to save calls to malloc and free */
67#define MAXFREELISTS 80
68static PyListObject *free_lists[MAXFREELISTS];
69static int num_free_lists = 0;
70
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +000071void
72PyList_Fini(void)
73{
74 PyListObject *op;
75
76 while (num_free_lists) {
77 num_free_lists--;
78 op = free_lists[num_free_lists];
79 assert(PyList_CheckExact(op));
80 PyObject_GC_Del(op);
81 }
82}
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000085PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000088 size_t nbytes;
Tim Peters3986d4e2004-07-29 02:28:42 +000089
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 return NULL;
93 }
Tim Peters7049d812004-01-18 20:31:02 +000094 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000095 /* Check for overflow */
Raymond Hettingerfdfe6182004-05-05 06:28:16 +000096 if (nbytes / sizeof(PyObject *) != (size_t)size)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return PyErr_NoMemory();
Raymond Hettinger0468e412004-05-05 05:37:53 +000098 if (num_free_lists) {
99 num_free_lists--;
100 op = free_lists[num_free_lists];
101 _Py_NewReference((PyObject *)op);
102 } else {
103 op = PyObject_GC_New(PyListObject, &PyList_Type);
104 if (op == NULL)
105 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 }
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000107 if (size <= 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108 op->ob_item = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000111 if (op->ob_item == NULL) {
112 Py_DECREF(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 return PyErr_NoMemory();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000114 }
Tim Peters3986d4e2004-07-29 02:28:42 +0000115 memset(op->ob_item, 0, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000117 Py_Size(op) = size;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000118 op->allocated = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000119 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000124PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 if (!PyList_Check(op)) {
127 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return -1;
129 }
130 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000131 return Py_Size(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000134static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000137PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 if (!PyList_Check(op)) {
140 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141 return NULL;
142 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000143 if (i < 0 || i >= Py_Size(op)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000144 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000145 indexerr = PyUnicode_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 "list index out of range");
147 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 return NULL;
149 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151}
152
153int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000154PyList_SetItem(register PyObject *op, register Py_ssize_t i,
Fred Drakea2f55112000-07-09 15:16:51 +0000155 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 register PyObject *olditem;
158 register PyObject **p;
159 if (!PyList_Check(op)) {
160 Py_XDECREF(newitem);
161 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000162 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000164 if (i < 0 || i >= Py_Size(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 Py_XDECREF(newitem);
166 PyErr_SetString(PyExc_IndexError,
167 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000168 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000171 olditem = *p;
172 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 return 0;
175}
176
177static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000178ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000180 Py_ssize_t i, n = Py_Size(self);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000182 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000184 return -1;
185 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000186 if (n == PY_SSIZE_T_MAX) {
Trent Micka5846642000-08-13 22:47:45 +0000187 PyErr_SetString(PyExc_OverflowError,
188 "cannot add more objects to list");
189 return -1;
190 }
Tim Petersb38e2b62004-07-29 02:29:26 +0000191
Raymond Hettingerd4ff7412004-03-15 09:01:31 +0000192 if (list_resize(self, n+1) == -1)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000193 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000194
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000195 if (where < 0) {
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000196 where += n;
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000197 if (where < 0)
198 where = 0;
199 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000200 if (where > n)
201 where = n;
202 items = self->ob_item;
203 for (i = n; --i >= where; )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 items[where] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 return 0;
208}
209
210int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000211PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 if (!PyList_Check(op)) {
214 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000215 return -1;
216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218}
219
Raymond Hettinger40a03822004-04-12 13:05:09 +0000220static int
221app1(PyListObject *self, PyObject *v)
222{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000224
225 assert (v != NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000226 if (n == PY_SSIZE_T_MAX) {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000227 PyErr_SetString(PyExc_OverflowError,
228 "cannot add more objects to list");
229 return -1;
230 }
231
232 if (list_resize(self, n+1) == -1)
233 return -1;
234
235 Py_INCREF(v);
236 PyList_SET_ITEM(self, n, v);
237 return 0;
238}
239
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240int
Fred Drakea2f55112000-07-09 15:16:51 +0000241PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242{
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000243 if (PyList_Check(op) && (newitem != NULL))
244 return app1((PyListObject *)op, newitem);
245 PyErr_BadInternalCall();
246 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
249/* Methods */
250
251static void
Fred Drakea2f55112000-07-09 15:16:51 +0000252list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254 Py_ssize_t i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000255 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000256 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000257 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000258 /* Do it backwards, for Christian Tismer.
259 There's a simple test case where somehow this reduces
260 thrashing when a *very* large list is created and
261 immediately deleted. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000262 i = Py_Size(op);
Guido van Rossumfa717011999-06-09 15:19:34 +0000263 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000265 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000266 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000267 }
Raymond Hettinger0468e412004-05-05 05:37:53 +0000268 if (num_free_lists < MAXFREELISTS && PyList_CheckExact(op))
269 free_lists[num_free_lists++] = op;
Tim Petersb38e2b62004-07-29 02:29:26 +0000270 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000271 Py_Type(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000272 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273}
274
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000276list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000278 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000279 PyObject *s, *temp;
280 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000281
282 i = Py_ReprEnter((PyObject*)v);
283 if (i != 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000284 return i > 0 ? PyUnicode_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000285 }
Tim Petersa7259592001-06-16 05:11:17 +0000286
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000287 if (Py_Size(v) == 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000288 result = PyUnicode_FromString("[]");
Tim Petersa7259592001-06-16 05:11:17 +0000289 goto Done;
290 }
291
292 pieces = PyList_New(0);
293 if (pieces == NULL)
294 goto Done;
295
296 /* Do repr() on each element. Note that this may mutate the list,
297 so must refetch the list size on each iteration. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000298 for (i = 0; i < Py_Size(v); ++i) {
Tim Petersa7259592001-06-16 05:11:17 +0000299 int status;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000300 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
301 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000302 s = PyObject_Repr(v->ob_item[i]);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000303 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000304 if (s == NULL)
305 goto Done;
306 status = PyList_Append(pieces, s);
307 Py_DECREF(s); /* append created a new ref */
308 if (status < 0)
309 goto Done;
310 }
311
312 /* Add "[]" decorations to the first and last items. */
313 assert(PyList_GET_SIZE(pieces) > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000314 s = PyUnicode_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000315 if (s == NULL)
316 goto Done;
317 temp = PyList_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000318 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000319 PyList_SET_ITEM(pieces, 0, s);
320 if (s == NULL)
321 goto Done;
322
Walter Dörwald1ab83302007-05-18 17:15:44 +0000323 s = PyUnicode_FromString("]");
Tim Petersa7259592001-06-16 05:11:17 +0000324 if (s == NULL)
325 goto Done;
326 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000327 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000328 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
329 if (temp == NULL)
330 goto Done;
331
332 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000333 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000334 if (s == NULL)
335 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000336 result = PyUnicode_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000337 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000338
339Done:
340 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000341 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000342 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
Martin v. Löwis18e16552006-02-15 17:27:45 +0000345static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000346list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000348 return Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
350
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000351static int
Fred Drakea2f55112000-07-09 15:16:51 +0000352list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000353{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000354 Py_ssize_t i;
355 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000356
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000357 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_Size(a); ++i)
Raymond Hettingeraae59992002-09-05 14:23:49 +0000358 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000359 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000360 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000361}
362
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000364list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000366 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000367 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000368 indexerr = PyUnicode_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 "list index out of range");
370 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 return NULL;
372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 return a->ob_item[i];
375}
376
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000378list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000381 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383 if (ilow < 0)
384 ilow = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000385 else if (ilow > Py_Size(a))
386 ilow = Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 if (ihigh < ilow)
388 ihigh = ilow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000389 else if (ihigh > Py_Size(a))
390 ihigh = Py_Size(a);
Raymond Hettinger99842b62004-03-08 05:56:15 +0000391 len = ihigh - ilow;
392 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 if (np == NULL)
394 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000395
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000396 src = a->ob_item + ilow;
397 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000398 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000399 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000401 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000407PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000408{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 if (!PyList_Check(a)) {
410 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000411 return NULL;
412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000414}
415
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000417list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000419 Py_ssize_t size;
420 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000421 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyListObject *np;
423 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000424 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000425 "can only concatenate list (not \"%.200s\") to list",
426 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 return NULL;
428 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429#define b ((PyListObject *)bb)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000430 size = Py_Size(a) + Py_Size(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000431 if (size < 0)
432 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000435 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000437 src = a->ob_item;
438 dest = np->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000439 for (i = 0; i < Py_Size(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000440 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000442 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000444 src = b->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000445 dest = np->ob_item + Py_Size(a);
446 for (i = 0; i < Py_Size(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000447 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000449 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452#undef b
453}
454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000457{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000458 Py_ssize_t i, j;
459 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000461 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000462 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000463 if (n < 0)
464 n = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000465 size = Py_Size(a) * n;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000466 if (n && size/n != Py_Size(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000467 return PyErr_NoMemory();
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000468 if (size == 0)
469 return PyList_New(0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000471 if (np == NULL)
472 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000473
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000474 items = np->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000475 if (Py_Size(a) == 1) {
Raymond Hettinger6624e682003-05-21 05:58:46 +0000476 elem = a->ob_item[0];
477 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000478 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000479 Py_INCREF(elem);
480 }
481 return (PyObject *) np;
482 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000483 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000484 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000485 for (i = 0; i < n; i++) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000486 for (j = 0; j < Py_Size(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000487 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000489 p++;
490 }
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000493}
494
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495static int
Armin Rigo93677f02004-07-29 12:40:23 +0000496list_clear(PyListObject *a)
497{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000498 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000499 PyObject **item = a->ob_item;
500 if (item != NULL) {
501 /* Because XDECREF can recursively invoke operations on
502 this list, we make it empty first. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000503 i = Py_Size(a);
504 Py_Size(a) = 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000505 a->ob_item = NULL;
506 a->allocated = 0;
507 while (--i >= 0) {
508 Py_XDECREF(item[i]);
509 }
510 PyMem_FREE(item);
511 }
512 /* Never fails; the return value can be ignored.
513 Note that there is no guarantee that the list is actually empty
514 at this point, because XDECREF may have populated it again! */
515 return 0;
516}
517
Tim Peters8fc4a912004-07-31 21:53:19 +0000518/* a[ilow:ihigh] = v if v != NULL.
519 * del a[ilow:ihigh] if v == NULL.
520 *
521 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
522 * guaranteed the call cannot fail.
523 */
Armin Rigo93677f02004-07-29 12:40:23 +0000524static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000525list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000527 /* Because [X]DECREF can recursively invoke list operations on
528 this list, we must postpone all [X]DECREF activity until
529 after the list is back in its canonical shape. Therefore
530 we must allocate an additional array, 'recycle', into which
531 we temporarily copy the items that are deleted from the
532 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000533 PyObject *recycle_on_stack[8];
534 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000536 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000537 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000538 Py_ssize_t n; /* # of elements in replacement list */
539 Py_ssize_t norig; /* # of elements in list getting replaced */
540 Py_ssize_t d; /* Change in size */
541 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000542 size_t s;
543 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545 if (v == NULL)
546 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000547 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000548 if (a == b) {
549 /* Special case "a[i:j] = a" -- copy b first */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000550 v = list_slice(b, 0, Py_Size(b));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000551 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000552 return result;
553 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000555 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000556 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000557 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000558 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000559 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000560 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000561 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000562 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 if (ilow < 0)
564 ilow = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000565 else if (ilow > Py_Size(a))
566 ilow = Py_Size(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000567
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568 if (ihigh < ilow)
569 ihigh = ilow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000570 else if (ihigh > Py_Size(a))
571 ihigh = Py_Size(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000572
Tim Peters8d9eb102004-07-31 02:24:20 +0000573 norig = ihigh - ilow;
574 assert(norig >= 0);
575 d = n - norig;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000576 if (Py_Size(a) + d == 0) {
Armin Rigo93677f02004-07-29 12:40:23 +0000577 Py_XDECREF(v_as_SF);
578 return list_clear(a);
579 }
580 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000581 /* recycle the items that we are about to remove */
582 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000583 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000584 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000585 if (recycle == NULL) {
586 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000587 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000588 }
589 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000590 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000591
Armin Rigo1dd04a02004-07-30 11:38:22 +0000592 if (d < 0) { /* Delete -d items */
593 memmove(&item[ihigh+d], &item[ihigh],
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000594 (Py_Size(a) - ihigh)*sizeof(PyObject *));
595 list_resize(a, Py_Size(a) + d);
Armin Rigo1dd04a02004-07-30 11:38:22 +0000596 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000598 else if (d > 0) { /* Insert d items */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000599 k = Py_Size(a);
Tim Peters73572222004-07-31 02:54:42 +0000600 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000601 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000602 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000603 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000604 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605 }
606 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000607 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609 item[ilow] = w;
610 }
Tim Peters73572222004-07-31 02:54:42 +0000611 for (k = norig - 1; k >= 0; --k)
612 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000613 result = 0;
614 Error:
Tim Peters73572222004-07-31 02:54:42 +0000615 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000616 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000617 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000618 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619#undef b
620}
621
Guido van Rossum234f9421993-06-17 12:35:49 +0000622int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000623PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000624{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 if (!PyList_Check(a)) {
626 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000627 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000628 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000630}
631
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000632static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000633list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000634{
635 PyObject **items;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000636 Py_ssize_t size, i, j, p, newsize;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000637
638
639 size = PyList_GET_SIZE(self);
640 if (size == 0) {
641 Py_INCREF(self);
642 return (PyObject *)self;
643 }
644
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000645 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000646 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000647 Py_INCREF(self);
648 return (PyObject *)self;
649 }
650
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000651 newsize = size * n;
652 if (newsize/n != size)
653 return PyErr_NoMemory();
654 if (list_resize(self, newsize) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000655 return NULL;
656
657 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000658 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000659 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
660 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000661 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000662 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000663 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000664 }
665 }
666 Py_INCREF(self);
667 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000668}
669
Guido van Rossum4a450d01991-04-03 19:05:18 +0000670static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000672{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 PyObject *old_value;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000674 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyErr_SetString(PyExc_IndexError,
676 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000677 return -1;
678 }
679 if (v == NULL)
680 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000682 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000683 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000684 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000685 return 0;
686}
687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000689listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000691 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000693 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000695 if (ins1(self, i, v) == 0)
696 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000697 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698}
699
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000701listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000703 if (app1(self, v) == 0)
704 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000705 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000706}
707
Barry Warsawdedf6d61998-10-09 16:37:25 +0000708static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000709listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000711 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000712 Py_ssize_t m; /* size of self */
713 Py_ssize_t n; /* guess for size of b */
714 Py_ssize_t mn; /* m + n */
715 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000716 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000717
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000718 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000719 1) lists and tuples which can use PySequence_Fast ops
720 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000721 */
722 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000723 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000724 b = PySequence_Fast(b, "argument must be iterable");
725 if (!b)
726 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000727 n = PySequence_Fast_GET_SIZE(b);
728 if (n == 0) {
729 /* short circuit when b is empty */
730 Py_DECREF(b);
731 Py_RETURN_NONE;
732 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000733 m = Py_Size(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000734 if (list_resize(self, m + n) == -1) {
735 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000736 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000737 }
738 /* note that we may still have self == b here for the
739 * situation a.extend(a), but the following code works
740 * in that case too. Just make sure to resize self
741 * before calling PySequence_Fast_ITEMS.
742 */
743 /* populate the end of self with b's items */
744 src = PySequence_Fast_ITEMS(b);
745 dest = self->ob_item + m;
746 for (i = 0; i < n; i++) {
747 PyObject *o = src[i];
748 Py_INCREF(o);
749 dest[i] = o;
750 }
751 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000752 Py_RETURN_NONE;
753 }
754
755 it = PyObject_GetIter(b);
756 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000757 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000758 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000760 /* Guess a result list size. */
Armin Rigof5b3e362006-02-11 21:32:43 +0000761 n = _PyObject_LengthHint(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000762 if (n < 0) {
Alexandre Vassalotti79a082b2007-12-04 06:20:30 +0000763 if (PyErr_Occurred()
764 && !PyErr_ExceptionMatches(PyExc_TypeError)
765 && !PyErr_ExceptionMatches(PyExc_AttributeError)) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000766 Py_DECREF(it);
767 return NULL;
768 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000769 PyErr_Clear();
770 n = 8; /* arbitrary */
771 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000772 m = Py_Size(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000773 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000774 if (mn >= m) {
775 /* Make room. */
776 if (list_resize(self, mn) == -1)
777 goto error;
778 /* Make the list sane again. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000779 Py_Size(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000780 }
781 /* Else m + n overflowed; on the chance that n lied, and there really
782 * is enough room, ignore it. If n was telling the truth, we'll
783 * eventually run out of memory during the loop.
784 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000785
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000786 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000787 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000788 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000789 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000790 if (PyErr_Occurred()) {
791 if (PyErr_ExceptionMatches(PyExc_StopIteration))
792 PyErr_Clear();
793 else
794 goto error;
795 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000796 break;
797 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000798 if (Py_Size(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000799 /* steals ref */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000800 PyList_SET_ITEM(self, Py_Size(self), item);
801 ++Py_Size(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000802 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000803 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000804 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000805 Py_DECREF(item); /* append creates a new ref */
806 if (status < 0)
807 goto error;
808 }
809 }
810
811 /* Cut back result list if initial guess was too large. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000812 if (Py_Size(self) < self->allocated)
813 list_resize(self, Py_Size(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000814
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000815 Py_DECREF(it);
816 Py_RETURN_NONE;
817
818 error:
819 Py_DECREF(it);
820 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000821}
822
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000823PyObject *
824_PyList_Extend(PyListObject *self, PyObject *b)
825{
826 return listextend(self, b);
827}
828
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000829static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000830list_inplace_concat(PyListObject *self, PyObject *other)
831{
832 PyObject *result;
833
834 result = listextend(self, other);
835 if (result == NULL)
836 return result;
837 Py_DECREF(result);
838 Py_INCREF(self);
839 return (PyObject *)self;
840}
841
842static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000843listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000844{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000845 Py_ssize_t i = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000846 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000847 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000848
Thomas Wouters89f507f2006-12-13 04:49:30 +0000849 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000850 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000851
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000852 if (Py_Size(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000853 /* Special-case most common failure cause */
854 PyErr_SetString(PyExc_IndexError, "pop from empty list");
855 return NULL;
856 }
857 if (i < 0)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000858 i += Py_Size(self);
859 if (i < 0 || i >= Py_Size(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000860 PyErr_SetString(PyExc_IndexError, "pop index out of range");
861 return NULL;
862 }
863 v = self->ob_item[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000864 if (i == Py_Size(self) - 1) {
865 status = list_resize(self, Py_Size(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000866 assert(status >= 0);
867 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000868 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000869 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000870 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
871 assert(status >= 0);
872 /* Use status, so that in a release build compilers don't
873 * complain about the unused name.
874 */
Brett Cannon651dd522004-08-08 21:21:18 +0000875 (void) status;
876
877 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000878}
879
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000880/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
881static void
882reverse_slice(PyObject **lo, PyObject **hi)
883{
884 assert(lo && hi);
885
886 --hi;
887 while (lo < hi) {
888 PyObject *t = *lo;
889 *lo = *hi;
890 *hi = t;
891 ++lo;
892 --hi;
893 }
894}
895
Tim Petersa64dc242002-08-01 02:13:36 +0000896/* Lots of code for an adaptive, stable, natural mergesort. There are many
897 * pieces to this algorithm; read listsort.txt for overviews and details.
898 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000899
Guido van Rossum3f236de1996-12-10 23:55:39 +0000900/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000901 * comparison function (any callable Python object), which must not be
902 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
903 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000904 * Returns -1 on error, 1 if x < y, 0 if x >= y.
905 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000906static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000907islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000908{
Tim Petersf2a04732002-07-11 21:46:16 +0000909 PyObject *res;
910 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000911 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000912
Tim Peters66860f62002-08-04 17:47:26 +0000913 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000914 /* Call the user's comparison function and translate the 3-way
915 * result into true or false (or error).
916 */
Tim Petersf2a04732002-07-11 21:46:16 +0000917 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000918 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000919 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000920 Py_INCREF(x);
921 Py_INCREF(y);
922 PyTuple_SET_ITEM(args, 0, x);
923 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000924 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000926 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000927 return -1;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000928 if (!PyLong_CheckExact(res)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 PyErr_Format(PyExc_TypeError,
930 "comparison function must return int, not %.200s",
931 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000933 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000934 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000935 i = PyLong_AsLong(res);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 Py_DECREF(res);
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000937 if (i == -1 && PyErr_Occurred()) {
938 /* Overflow in long conversion. */
939 return -1;
940 }
Tim Petersa8c974c2002-07-19 03:30:57 +0000941 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000942}
943
Tim Peters66860f62002-08-04 17:47:26 +0000944/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
945 * islt. This avoids a layer of function call in the usual case, and
946 * sorting does many comparisons.
947 * Returns -1 on error, 1 if x < y, 0 if x >= y.
948 */
949#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
950 PyObject_RichCompareBool(X, Y, Py_LT) : \
951 islt(X, Y, COMPARE))
952
953/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000954 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
955 started. It makes more sense in context <wink>. X and Y are PyObject*s.
956*/
Tim Peters66860f62002-08-04 17:47:26 +0000957#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000958 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000959
960/* binarysort is the best method for sorting small arrays: it does
961 few compares, but can do data movement quadratic in the number of
962 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000963 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000964 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000965 On entry, must have lo <= start <= hi, and that [lo, start) is already
966 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000967 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000968 Even in case of error, the output slice will be some permutation of
969 the input (nothing is lost or duplicated).
970*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000971static int
Fred Drakea2f55112000-07-09 15:16:51 +0000972binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
973 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000974{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000975 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000976 register PyObject **l, **p, **r;
977 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000978
Tim Petersa8c974c2002-07-19 03:30:57 +0000979 assert(lo <= start && start <= hi);
980 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000981 if (lo == start)
982 ++start;
983 for (; start < hi; ++start) {
984 /* set l to where *start belongs */
985 l = lo;
986 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000987 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000988 /* Invariants:
989 * pivot >= all in [lo, l).
990 * pivot < all in [r, start).
991 * The second is vacuously true at the start.
992 */
993 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000994 do {
995 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000996 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000997 r = p;
998 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000999 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001000 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001001 assert(l == r);
1002 /* The invariants still hold, so pivot >= all in [lo, l) and
1003 pivot < all in [l, start), so pivot belongs at l. Note
1004 that if there are elements equal to pivot, l points to the
1005 first slot after them -- that's why this sort is stable.
1006 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001007 Caution: using memmove is much slower under MSVC 5;
1008 we're not usually moving many slots. */
1009 for (p = start; p > l; --p)
1010 *p = *(p-1);
1011 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001012 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001013 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001014
1015 fail:
1016 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001017}
1018
Tim Petersa64dc242002-08-01 02:13:36 +00001019/*
1020Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1021is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001022
Tim Petersa64dc242002-08-01 02:13:36 +00001023 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001024
Tim Petersa64dc242002-08-01 02:13:36 +00001025or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001026
Tim Petersa64dc242002-08-01 02:13:36 +00001027 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001028
Tim Petersa64dc242002-08-01 02:13:36 +00001029Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1030For its intended use in a stable mergesort, the strictness of the defn of
1031"descending" is needed so that the caller can safely reverse a descending
1032sequence without violating stability (strict > ensures there are no equal
1033elements to get out of order).
1034
1035Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001036*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001037static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001038count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001039{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001040 Py_ssize_t k;
1041 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001042
Tim Petersa64dc242002-08-01 02:13:36 +00001043 assert(lo < hi);
1044 *descending = 0;
1045 ++lo;
1046 if (lo == hi)
1047 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001048
Tim Petersa64dc242002-08-01 02:13:36 +00001049 n = 2;
1050 IFLT(*lo, *(lo-1)) {
1051 *descending = 1;
1052 for (lo = lo+1; lo < hi; ++lo, ++n) {
1053 IFLT(*lo, *(lo-1))
1054 ;
1055 else
1056 break;
1057 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001058 }
Tim Petersa64dc242002-08-01 02:13:36 +00001059 else {
1060 for (lo = lo+1; lo < hi; ++lo, ++n) {
1061 IFLT(*lo, *(lo-1))
1062 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001063 }
1064 }
1065
Tim Petersa64dc242002-08-01 02:13:36 +00001066 return n;
1067fail:
1068 return -1;
1069}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001070
Tim Petersa64dc242002-08-01 02:13:36 +00001071/*
1072Locate the proper position of key in a sorted vector; if the vector contains
1073an element equal to key, return the position immediately to the left of
1074the leftmost equal element. [gallop_right() does the same except returns
1075the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001076
Tim Petersa64dc242002-08-01 02:13:36 +00001077"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001078
Tim Petersa64dc242002-08-01 02:13:36 +00001079"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1080hint is to the final result, the faster this runs.
1081
1082The return value is the int k in 0..n such that
1083
1084 a[k-1] < key <= a[k]
1085
1086pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1087key belongs at index k; or, IOW, the first k elements of a should precede
1088key, and the last n-k should follow key.
1089
1090Returns -1 on error. See listsort.txt for info on the method.
1091*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001092static Py_ssize_t
1093gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001094{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001095 Py_ssize_t ofs;
1096 Py_ssize_t lastofs;
1097 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001098
1099 assert(key && a && n > 0 && hint >= 0 && hint < n);
1100
1101 a += hint;
1102 lastofs = 0;
1103 ofs = 1;
1104 IFLT(*a, key) {
1105 /* a[hint] < key -- gallop right, until
1106 * a[hint + lastofs] < key <= a[hint + ofs]
1107 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001108 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001109 while (ofs < maxofs) {
1110 IFLT(a[ofs], key) {
1111 lastofs = ofs;
1112 ofs = (ofs << 1) + 1;
1113 if (ofs <= 0) /* int overflow */
1114 ofs = maxofs;
1115 }
1116 else /* key <= a[hint + ofs] */
1117 break;
1118 }
1119 if (ofs > maxofs)
1120 ofs = maxofs;
1121 /* Translate back to offsets relative to &a[0]. */
1122 lastofs += hint;
1123 ofs += hint;
1124 }
1125 else {
1126 /* key <= a[hint] -- gallop left, until
1127 * a[hint - ofs] < key <= a[hint - lastofs]
1128 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001129 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001130 while (ofs < maxofs) {
1131 IFLT(*(a-ofs), key)
1132 break;
1133 /* key <= a[hint - ofs] */
1134 lastofs = ofs;
1135 ofs = (ofs << 1) + 1;
1136 if (ofs <= 0) /* int overflow */
1137 ofs = maxofs;
1138 }
1139 if (ofs > maxofs)
1140 ofs = maxofs;
1141 /* Translate back to positive offsets relative to &a[0]. */
1142 k = lastofs;
1143 lastofs = hint - ofs;
1144 ofs = hint - k;
1145 }
1146 a -= hint;
1147
1148 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1149 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1150 * right of lastofs but no farther right than ofs. Do a binary
1151 * search, with invariant a[lastofs-1] < key <= a[ofs].
1152 */
1153 ++lastofs;
1154 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001155 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001156
1157 IFLT(a[m], key)
1158 lastofs = m+1; /* a[m] < key */
1159 else
1160 ofs = m; /* key <= a[m] */
1161 }
1162 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1163 return ofs;
1164
1165fail:
1166 return -1;
1167}
1168
1169/*
1170Exactly like gallop_left(), except that if key already exists in a[0:n],
1171finds the position immediately to the right of the rightmost equal value.
1172
1173The return value is the int k in 0..n such that
1174
1175 a[k-1] <= key < a[k]
1176
1177or -1 if error.
1178
1179The code duplication is massive, but this is enough different given that
1180we're sticking to "<" comparisons that it's much harder to follow if
1181written as one routine with yet another "left or right?" flag.
1182*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001183static Py_ssize_t
1184gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001185{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001186 Py_ssize_t ofs;
1187 Py_ssize_t lastofs;
1188 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001189
1190 assert(key && a && n > 0 && hint >= 0 && hint < n);
1191
1192 a += hint;
1193 lastofs = 0;
1194 ofs = 1;
1195 IFLT(key, *a) {
1196 /* key < a[hint] -- gallop left, until
1197 * a[hint - ofs] <= key < a[hint - lastofs]
1198 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001199 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001200 while (ofs < maxofs) {
1201 IFLT(key, *(a-ofs)) {
1202 lastofs = ofs;
1203 ofs = (ofs << 1) + 1;
1204 if (ofs <= 0) /* int overflow */
1205 ofs = maxofs;
1206 }
1207 else /* a[hint - ofs] <= key */
1208 break;
1209 }
1210 if (ofs > maxofs)
1211 ofs = maxofs;
1212 /* Translate back to positive offsets relative to &a[0]. */
1213 k = lastofs;
1214 lastofs = hint - ofs;
1215 ofs = hint - k;
1216 }
1217 else {
1218 /* a[hint] <= key -- gallop right, until
1219 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001220 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001221 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001222 while (ofs < maxofs) {
1223 IFLT(key, a[ofs])
1224 break;
1225 /* a[hint + ofs] <= key */
1226 lastofs = ofs;
1227 ofs = (ofs << 1) + 1;
1228 if (ofs <= 0) /* int overflow */
1229 ofs = maxofs;
1230 }
1231 if (ofs > maxofs)
1232 ofs = maxofs;
1233 /* Translate back to offsets relative to &a[0]. */
1234 lastofs += hint;
1235 ofs += hint;
1236 }
1237 a -= hint;
1238
1239 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1240 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1241 * right of lastofs but no farther right than ofs. Do a binary
1242 * search, with invariant a[lastofs-1] <= key < a[ofs].
1243 */
1244 ++lastofs;
1245 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001246 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001247
1248 IFLT(key, a[m])
1249 ofs = m; /* key < a[m] */
1250 else
1251 lastofs = m+1; /* a[m] <= key */
1252 }
1253 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1254 return ofs;
1255
1256fail:
1257 return -1;
1258}
1259
1260/* The maximum number of entries in a MergeState's pending-runs stack.
1261 * This is enough to sort arrays of size up to about
1262 * 32 * phi ** MAX_MERGE_PENDING
1263 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1264 * with 2**64 elements.
1265 */
1266#define MAX_MERGE_PENDING 85
1267
Tim Peterse05f65a2002-08-10 05:21:15 +00001268/* When we get into galloping mode, we stay there until both runs win less
1269 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001270 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001271#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001272
1273/* Avoid malloc for small temp arrays. */
1274#define MERGESTATE_TEMP_SIZE 256
1275
1276/* One MergeState exists on the stack per invocation of mergesort. It's just
1277 * a convenient way to pass state around among the helper functions.
1278 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001279struct s_slice {
1280 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001281 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001282};
1283
Tim Petersa64dc242002-08-01 02:13:36 +00001284typedef struct s_MergeState {
1285 /* The user-supplied comparison function. or NULL if none given. */
1286 PyObject *compare;
1287
Tim Peterse05f65a2002-08-10 05:21:15 +00001288 /* This controls when we get *into* galloping mode. It's initialized
1289 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1290 * random data, and lower for highly structured data.
1291 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001292 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001293
Tim Petersa64dc242002-08-01 02:13:36 +00001294 /* 'a' is temp storage to help with merges. It contains room for
1295 * alloced entries.
1296 */
1297 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001298 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001299
1300 /* A stack of n pending runs yet to be merged. Run #i starts at
1301 * address base[i] and extends for len[i] elements. It's always
1302 * true (so long as the indices are in bounds) that
1303 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001304 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001305 *
1306 * so we could cut the storage for this, but it's a minor amount,
1307 * and keeping all the info explicit simplifies the code.
1308 */
1309 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001310 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001311
1312 /* 'a' points to this when possible, rather than muck with malloc. */
1313 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1314} MergeState;
1315
1316/* Conceptually a MergeState's constructor. */
1317static void
1318merge_init(MergeState *ms, PyObject *compare)
1319{
1320 assert(ms != NULL);
1321 ms->compare = compare;
1322 ms->a = ms->temparray;
1323 ms->alloced = MERGESTATE_TEMP_SIZE;
1324 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001325 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001326}
1327
1328/* Free all the temp memory owned by the MergeState. This must be called
1329 * when you're done with a MergeState, and may be called before then if
1330 * you want to free the temp memory early.
1331 */
1332static void
1333merge_freemem(MergeState *ms)
1334{
1335 assert(ms != NULL);
1336 if (ms->a != ms->temparray)
1337 PyMem_Free(ms->a);
1338 ms->a = ms->temparray;
1339 ms->alloced = MERGESTATE_TEMP_SIZE;
1340}
1341
1342/* Ensure enough temp memory for 'need' array slots is available.
1343 * Returns 0 on success and -1 if the memory can't be gotten.
1344 */
1345static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001346merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001347{
1348 assert(ms != NULL);
1349 if (need <= ms->alloced)
1350 return 0;
1351 /* Don't realloc! That can cost cycles to copy the old data, but
1352 * we don't care what's in the block.
1353 */
1354 merge_freemem(ms);
1355 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1356 if (ms->a) {
1357 ms->alloced = need;
1358 return 0;
1359 }
1360 PyErr_NoMemory();
1361 merge_freemem(ms); /* reset to sane state */
1362 return -1;
1363}
1364#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1365 merge_getmem(MS, NEED))
1366
1367/* Merge the na elements starting at pa with the nb elements starting at pb
1368 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1369 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1370 * merge, and should have na <= nb. See listsort.txt for more info.
1371 * Return 0 if successful, -1 if error.
1372 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001373static Py_ssize_t
1374merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1375 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001376{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001377 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001378 PyObject *compare;
1379 PyObject **dest;
1380 int result = -1; /* guilty until proved innocent */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001381 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001382
1383 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1384 if (MERGE_GETMEM(ms, na) < 0)
1385 return -1;
1386 memcpy(ms->a, pa, na * sizeof(PyObject*));
1387 dest = pa;
1388 pa = ms->a;
1389
1390 *dest++ = *pb++;
1391 --nb;
1392 if (nb == 0)
1393 goto Succeed;
1394 if (na == 1)
1395 goto CopyB;
1396
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001397 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001398 compare = ms->compare;
1399 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001400 Py_ssize_t acount = 0; /* # of times A won in a row */
1401 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001402
1403 /* Do the straightforward thing until (if ever) one run
1404 * appears to win consistently.
1405 */
1406 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001407 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001408 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001409 if (k) {
1410 if (k < 0)
1411 goto Fail;
1412 *dest++ = *pb++;
1413 ++bcount;
1414 acount = 0;
1415 --nb;
1416 if (nb == 0)
1417 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001418 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001419 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001420 }
1421 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001422 *dest++ = *pa++;
1423 ++acount;
1424 bcount = 0;
1425 --na;
1426 if (na == 1)
1427 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001428 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001429 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001430 }
Tim Petersa64dc242002-08-01 02:13:36 +00001431 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001432
Tim Petersa64dc242002-08-01 02:13:36 +00001433 /* One run is winning so consistently that galloping may
1434 * be a huge win. So try that, and continue galloping until
1435 * (if ever) neither run appears to be winning consistently
1436 * anymore.
1437 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001438 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001439 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001440 assert(na > 1 && nb > 0);
1441 min_gallop -= min_gallop > 1;
1442 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001443 k = gallop_right(*pb, pa, na, 0, compare);
1444 acount = k;
1445 if (k) {
1446 if (k < 0)
1447 goto Fail;
1448 memcpy(dest, pa, k * sizeof(PyObject *));
1449 dest += k;
1450 pa += k;
1451 na -= k;
1452 if (na == 1)
1453 goto CopyB;
1454 /* na==0 is impossible now if the comparison
1455 * function is consistent, but we can't assume
1456 * that it is.
1457 */
1458 if (na == 0)
1459 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001460 }
Tim Petersa64dc242002-08-01 02:13:36 +00001461 *dest++ = *pb++;
1462 --nb;
1463 if (nb == 0)
1464 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001465
Tim Petersa64dc242002-08-01 02:13:36 +00001466 k = gallop_left(*pa, pb, nb, 0, compare);
1467 bcount = k;
1468 if (k) {
1469 if (k < 0)
1470 goto Fail;
1471 memmove(dest, pb, k * sizeof(PyObject *));
1472 dest += k;
1473 pb += k;
1474 nb -= k;
1475 if (nb == 0)
1476 goto Succeed;
1477 }
1478 *dest++ = *pa++;
1479 --na;
1480 if (na == 1)
1481 goto CopyB;
1482 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001483 ++min_gallop; /* penalize it for leaving galloping mode */
1484 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001485 }
1486Succeed:
1487 result = 0;
1488Fail:
1489 if (na)
1490 memcpy(dest, pa, na * sizeof(PyObject*));
1491 return result;
1492CopyB:
1493 assert(na == 1 && nb > 0);
1494 /* The last element of pa belongs at the end of the merge. */
1495 memmove(dest, pb, nb * sizeof(PyObject *));
1496 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001497 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001498}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001499
Tim Petersa64dc242002-08-01 02:13:36 +00001500/* Merge the na elements starting at pa with the nb elements starting at pb
1501 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1502 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1503 * merge, and should have na >= nb. See listsort.txt for more info.
1504 * Return 0 if successful, -1 if error.
1505 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001506static Py_ssize_t
1507merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001508{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001509 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001510 PyObject *compare;
1511 PyObject **dest;
1512 int result = -1; /* guilty until proved innocent */
1513 PyObject **basea;
1514 PyObject **baseb;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001515 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001516
1517 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1518 if (MERGE_GETMEM(ms, nb) < 0)
1519 return -1;
1520 dest = pb + nb - 1;
1521 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1522 basea = pa;
1523 baseb = ms->a;
1524 pb = ms->a + nb - 1;
1525 pa += na - 1;
1526
1527 *dest-- = *pa--;
1528 --na;
1529 if (na == 0)
1530 goto Succeed;
1531 if (nb == 1)
1532 goto CopyA;
1533
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001534 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001535 compare = ms->compare;
1536 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001537 Py_ssize_t acount = 0; /* # of times A won in a row */
1538 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001539
1540 /* Do the straightforward thing until (if ever) one run
1541 * appears to win consistently.
1542 */
1543 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001544 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001545 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001546 if (k) {
1547 if (k < 0)
1548 goto Fail;
1549 *dest-- = *pa--;
1550 ++acount;
1551 bcount = 0;
1552 --na;
1553 if (na == 0)
1554 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001555 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001556 break;
1557 }
1558 else {
1559 *dest-- = *pb--;
1560 ++bcount;
1561 acount = 0;
1562 --nb;
1563 if (nb == 1)
1564 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001565 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001566 break;
1567 }
1568 }
1569
1570 /* One run is winning so consistently that galloping may
1571 * be a huge win. So try that, and continue galloping until
1572 * (if ever) neither run appears to be winning consistently
1573 * anymore.
1574 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001575 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001576 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001577 assert(na > 0 && nb > 1);
1578 min_gallop -= min_gallop > 1;
1579 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001580 k = gallop_right(*pb, basea, na, na-1, compare);
1581 if (k < 0)
1582 goto Fail;
1583 k = na - k;
1584 acount = k;
1585 if (k) {
1586 dest -= k;
1587 pa -= k;
1588 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1589 na -= k;
1590 if (na == 0)
1591 goto Succeed;
1592 }
1593 *dest-- = *pb--;
1594 --nb;
1595 if (nb == 1)
1596 goto CopyA;
1597
1598 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1599 if (k < 0)
1600 goto Fail;
1601 k = nb - k;
1602 bcount = k;
1603 if (k) {
1604 dest -= k;
1605 pb -= k;
1606 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1607 nb -= k;
1608 if (nb == 1)
1609 goto CopyA;
1610 /* nb==0 is impossible now if the comparison
1611 * function is consistent, but we can't assume
1612 * that it is.
1613 */
1614 if (nb == 0)
1615 goto Succeed;
1616 }
1617 *dest-- = *pa--;
1618 --na;
1619 if (na == 0)
1620 goto Succeed;
1621 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001622 ++min_gallop; /* penalize it for leaving galloping mode */
1623 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001624 }
1625Succeed:
1626 result = 0;
1627Fail:
1628 if (nb)
1629 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1630 return result;
1631CopyA:
1632 assert(nb == 1 && na > 0);
1633 /* The first element of pb belongs at the front of the merge. */
1634 dest -= na;
1635 pa -= na;
1636 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1637 *dest = *pb;
1638 return 0;
1639}
1640
1641/* Merge the two runs at stack indices i and i+1.
1642 * Returns 0 on success, -1 on error.
1643 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001644static Py_ssize_t
1645merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001646{
1647 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001648 Py_ssize_t na, nb;
1649 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001650 PyObject *compare;
1651
1652 assert(ms != NULL);
1653 assert(ms->n >= 2);
1654 assert(i >= 0);
1655 assert(i == ms->n - 2 || i == ms->n - 3);
1656
Tim Peterse05f65a2002-08-10 05:21:15 +00001657 pa = ms->pending[i].base;
1658 na = ms->pending[i].len;
1659 pb = ms->pending[i+1].base;
1660 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001661 assert(na > 0 && nb > 0);
1662 assert(pa + na == pb);
1663
1664 /* Record the length of the combined runs; if i is the 3rd-last
1665 * run now, also slide over the last run (which isn't involved
1666 * in this merge). The current run i+1 goes away in any case.
1667 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001668 ms->pending[i].len = na + nb;
1669 if (i == ms->n - 3)
1670 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001671 --ms->n;
1672
1673 /* Where does b start in a? Elements in a before that can be
1674 * ignored (already in place).
1675 */
1676 compare = ms->compare;
1677 k = gallop_right(*pb, pa, na, 0, compare);
1678 if (k < 0)
1679 return -1;
1680 pa += k;
1681 na -= k;
1682 if (na == 0)
1683 return 0;
1684
1685 /* Where does a end in b? Elements in b after that can be
1686 * ignored (already in place).
1687 */
1688 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1689 if (nb <= 0)
1690 return nb;
1691
1692 /* Merge what remains of the runs, using a temp array with
1693 * min(na, nb) elements.
1694 */
1695 if (na <= nb)
1696 return merge_lo(ms, pa, na, pb, nb);
1697 else
1698 return merge_hi(ms, pa, na, pb, nb);
1699}
1700
1701/* Examine the stack of runs waiting to be merged, merging adjacent runs
1702 * until the stack invariants are re-established:
1703 *
1704 * 1. len[-3] > len[-2] + len[-1]
1705 * 2. len[-2] > len[-1]
1706 *
1707 * See listsort.txt for more info.
1708 *
1709 * Returns 0 on success, -1 on error.
1710 */
1711static int
1712merge_collapse(MergeState *ms)
1713{
Tim Peterse05f65a2002-08-10 05:21:15 +00001714 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001715
1716 assert(ms);
1717 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001718 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001719 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1720 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001721 --n;
1722 if (merge_at(ms, n) < 0)
1723 return -1;
1724 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001725 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001726 if (merge_at(ms, n) < 0)
1727 return -1;
1728 }
1729 else
1730 break;
1731 }
1732 return 0;
1733}
1734
1735/* Regardless of invariants, merge all runs on the stack until only one
1736 * remains. This is used at the end of the mergesort.
1737 *
1738 * Returns 0 on success, -1 on error.
1739 */
1740static int
1741merge_force_collapse(MergeState *ms)
1742{
Tim Peterse05f65a2002-08-10 05:21:15 +00001743 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001744
1745 assert(ms);
1746 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001747 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001748 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001749 --n;
1750 if (merge_at(ms, n) < 0)
1751 return -1;
1752 }
1753 return 0;
1754}
1755
1756/* Compute a good value for the minimum run length; natural runs shorter
1757 * than this are boosted artificially via binary insertion.
1758 *
1759 * If n < 64, return n (it's too small to bother with fancy stuff).
1760 * Else if n is an exact power of 2, return 32.
1761 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1762 * strictly less than, an exact power of 2.
1763 *
1764 * See listsort.txt for more info.
1765 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001766static Py_ssize_t
1767merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001768{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001769 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001770
1771 assert(n >= 0);
1772 while (n >= 64) {
1773 r |= n & 1;
1774 n >>= 1;
1775 }
1776 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001777}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001778
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001779/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001780 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001781 which is returned during the undecorate phase. By exposing only the key
1782 during comparisons, the underlying sort stability characteristics are left
1783 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001784 the key instead of a full record. */
1785
1786typedef struct {
1787 PyObject_HEAD
1788 PyObject *key;
1789 PyObject *value;
1790} sortwrapperobject;
1791
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001792PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001793static PyObject *
1794sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1795static void
1796sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001797
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001798PyTypeObject PySortWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001799 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001800 "sortwrapper", /* tp_name */
1801 sizeof(sortwrapperobject), /* tp_basicsize */
1802 0, /* tp_itemsize */
1803 /* methods */
1804 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1805 0, /* tp_print */
1806 0, /* tp_getattr */
1807 0, /* tp_setattr */
1808 0, /* tp_compare */
1809 0, /* tp_repr */
1810 0, /* tp_as_number */
1811 0, /* tp_as_sequence */
1812 0, /* tp_as_mapping */
1813 0, /* tp_hash */
1814 0, /* tp_call */
1815 0, /* tp_str */
1816 PyObject_GenericGetAttr, /* tp_getattro */
1817 0, /* tp_setattro */
1818 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001819 Py_TPFLAGS_DEFAULT, /* tp_flags */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001820 sortwrapper_doc, /* tp_doc */
1821 0, /* tp_traverse */
1822 0, /* tp_clear */
1823 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1824};
1825
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001826
1827static PyObject *
1828sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1829{
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001830 if (!PyObject_TypeCheck(b, &PySortWrapper_Type)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001831 PyErr_SetString(PyExc_TypeError,
1832 "expected a sortwrapperobject");
1833 return NULL;
1834 }
1835 return PyObject_RichCompare(a->key, b->key, op);
1836}
1837
1838static void
1839sortwrapper_dealloc(sortwrapperobject *so)
1840{
1841 Py_XDECREF(so->key);
1842 Py_XDECREF(so->value);
1843 PyObject_Del(so);
1844}
1845
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001846/* Returns a new reference to a sortwrapper.
1847 Consumes the references to the two underlying objects. */
1848
1849static PyObject *
1850build_sortwrapper(PyObject *key, PyObject *value)
1851{
1852 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001853
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001854 so = PyObject_New(sortwrapperobject, &PySortWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001855 if (so == NULL)
1856 return NULL;
1857 so->key = key;
1858 so->value = value;
1859 return (PyObject *)so;
1860}
1861
1862/* Returns a new reference to the value underlying the wrapper. */
1863static PyObject *
1864sortwrapper_getvalue(PyObject *so)
1865{
1866 PyObject *value;
1867
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001868 if (!PyObject_TypeCheck(so, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001869 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001870 "expected a sortwrapperobject");
1871 return NULL;
1872 }
1873 value = ((sortwrapperobject *)so)->value;
1874 Py_INCREF(value);
1875 return value;
1876}
1877
1878/* Wrapper for user specified cmp functions in combination with a
1879 specified key function. Makes sure the cmp function is presented
1880 with the actual key instead of the sortwrapper */
1881
1882typedef struct {
1883 PyObject_HEAD
1884 PyObject *func;
1885} cmpwrapperobject;
1886
1887static void
1888cmpwrapper_dealloc(cmpwrapperobject *co)
1889{
1890 Py_XDECREF(co->func);
1891 PyObject_Del(co);
1892}
1893
1894static PyObject *
1895cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1896{
1897 PyObject *x, *y, *xx, *yy;
1898
1899 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1900 return NULL;
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001901 if (!PyObject_TypeCheck(x, &PySortWrapper_Type) ||
1902 !PyObject_TypeCheck(y, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001903 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001904 "expected a sortwrapperobject");
1905 return NULL;
1906 }
1907 xx = ((sortwrapperobject *)x)->key;
1908 yy = ((sortwrapperobject *)y)->key;
1909 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1910}
1911
1912PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1913
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001914PyTypeObject PyCmpWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001915 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001916 "cmpwrapper", /* tp_name */
1917 sizeof(cmpwrapperobject), /* tp_basicsize */
1918 0, /* tp_itemsize */
1919 /* methods */
1920 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1921 0, /* tp_print */
1922 0, /* tp_getattr */
1923 0, /* tp_setattr */
1924 0, /* tp_compare */
1925 0, /* tp_repr */
1926 0, /* tp_as_number */
1927 0, /* tp_as_sequence */
1928 0, /* tp_as_mapping */
1929 0, /* tp_hash */
1930 (ternaryfunc)cmpwrapper_call, /* tp_call */
1931 0, /* tp_str */
1932 PyObject_GenericGetAttr, /* tp_getattro */
1933 0, /* tp_setattro */
1934 0, /* tp_as_buffer */
1935 Py_TPFLAGS_DEFAULT, /* tp_flags */
1936 cmpwrapper_doc, /* tp_doc */
1937};
1938
1939static PyObject *
1940build_cmpwrapper(PyObject *cmpfunc)
1941{
1942 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001943
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001944 co = PyObject_New(cmpwrapperobject, &PyCmpWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001945 if (co == NULL)
1946 return NULL;
1947 Py_INCREF(cmpfunc);
1948 co->func = cmpfunc;
1949 return (PyObject *)co;
1950}
1951
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001952static int
1953is_default_cmp(PyObject *cmpfunc)
1954{
1955 PyCFunctionObject *f;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001956 const char *module;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001957 if (cmpfunc == NULL || cmpfunc == Py_None)
1958 return 1;
1959 if (!PyCFunction_Check(cmpfunc))
1960 return 0;
Guido van Rossumf1624cd2006-08-24 23:43:52 +00001961 f = (PyCFunctionObject *)cmpfunc;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001962 if (f->m_self != NULL)
1963 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001964 if (!PyUnicode_Check(f->m_module))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001965 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001966 module = PyUnicode_AsString(f->m_module);
1967 if (module == NULL)
1968 return 0;
Georg Brandl1a3284e2007-12-02 09:40:06 +00001969 if (strcmp(module, "builtins") != 0)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001970 return 0;
1971 if (strcmp(f->m_ml->ml_name, "cmp") != 0)
1972 return 0;
1973 return 1;
1974}
1975
Tim Petersa64dc242002-08-01 02:13:36 +00001976/* An adaptive, stable, natural mergesort. See listsort.txt.
1977 * Returns Py_None on success, NULL on error. Even in case of error, the
1978 * list will be some permutation of its input state (nothing is lost or
1979 * duplicated).
1980 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001981static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001982listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001983{
Tim Petersa64dc242002-08-01 02:13:36 +00001984 MergeState ms;
1985 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001986 Py_ssize_t nremaining;
1987 Py_ssize_t minrun;
1988 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001989 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001990 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001991 PyObject *compare = NULL;
1992 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001993 int reverse = 0;
1994 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001995 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001996 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001997 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001998
Tim Petersa64dc242002-08-01 02:13:36 +00001999 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002000 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002001 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002002 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2003 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002004 return NULL;
2005 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002006 if (is_default_cmp(compare))
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002007 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002008 if (keyfunc == Py_None)
2009 keyfunc = NULL;
2010 if (compare != NULL && keyfunc != NULL) {
2011 compare = build_cmpwrapper(compare);
2012 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002013 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002014 } else
2015 Py_XINCREF(compare);
2016
Tim Petersb9099c32002-11-12 22:08:10 +00002017 /* The list is temporarily made empty, so that mutations performed
2018 * by comparison functions can't affect the slice of memory we're
2019 * sorting (allowing mutations during sorting is a core-dump
2020 * factory, since ob_item may change).
2021 */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002022 saved_ob_size = Py_Size(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002023 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002024 saved_allocated = self->allocated;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002025 Py_Size(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002026 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002027 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002028
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002029 if (keyfunc != NULL) {
2030 for (i=0 ; i < saved_ob_size ; i++) {
2031 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002032 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002033 NULL);
2034 if (key == NULL) {
2035 for (i=i-1 ; i>=0 ; i--) {
2036 kvpair = saved_ob_item[i];
2037 value = sortwrapper_getvalue(kvpair);
2038 saved_ob_item[i] = value;
2039 Py_DECREF(kvpair);
2040 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002041 goto dsu_fail;
2042 }
2043 kvpair = build_sortwrapper(key, value);
2044 if (kvpair == NULL)
2045 goto dsu_fail;
2046 saved_ob_item[i] = kvpair;
2047 }
2048 }
2049
2050 /* Reverse sort stability achieved by initially reversing the list,
2051 applying a stable forward sort, then reversing the final result. */
2052 if (reverse && saved_ob_size > 1)
2053 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2054
2055 merge_init(&ms, compare);
2056
Tim Petersb9099c32002-11-12 22:08:10 +00002057 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002058 if (nremaining < 2)
2059 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002060
Tim Petersa64dc242002-08-01 02:13:36 +00002061 /* March over the array once, left to right, finding natural runs,
2062 * and extending short natural runs to minrun elements.
2063 */
Tim Petersb9099c32002-11-12 22:08:10 +00002064 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002065 hi = lo + nremaining;
2066 minrun = merge_compute_minrun(nremaining);
2067 do {
2068 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002069 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002070
Tim Petersa64dc242002-08-01 02:13:36 +00002071 /* Identify next run. */
2072 n = count_run(lo, hi, compare, &descending);
2073 if (n < 0)
2074 goto fail;
2075 if (descending)
2076 reverse_slice(lo, lo + n);
2077 /* If short, extend to min(minrun, nremaining). */
2078 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002079 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002080 nremaining : minrun;
2081 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2082 goto fail;
2083 n = force;
2084 }
2085 /* Push run onto pending-runs stack, and maybe merge. */
2086 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002087 ms.pending[ms.n].base = lo;
2088 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002089 ++ms.n;
2090 if (merge_collapse(&ms) < 0)
2091 goto fail;
2092 /* Advance to find next run. */
2093 lo += n;
2094 nremaining -= n;
2095 } while (nremaining);
2096 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002097
Tim Petersa64dc242002-08-01 02:13:36 +00002098 if (merge_force_collapse(&ms) < 0)
2099 goto fail;
2100 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002101 assert(ms.pending[0].base == saved_ob_item);
2102 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002103
2104succeed:
2105 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002106fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002107 if (keyfunc != NULL) {
2108 for (i=0 ; i < saved_ob_size ; i++) {
2109 kvpair = saved_ob_item[i];
2110 value = sortwrapper_getvalue(kvpair);
2111 saved_ob_item[i] = value;
2112 Py_DECREF(kvpair);
2113 }
2114 }
2115
Armin Rigo93677f02004-07-29 12:40:23 +00002116 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002117 /* The user mucked with the list during the sort,
2118 * and we don't already have another error to report.
2119 */
2120 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2121 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002122 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002123
2124 if (reverse && saved_ob_size > 1)
2125 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2126
2127 merge_freemem(&ms);
2128
2129dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002130 final_ob_item = self->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002131 i = Py_Size(self);
2132 Py_Size(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002133 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002134 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002135 if (final_ob_item != NULL) {
2136 /* we cannot use list_clear() for this because it does not
2137 guarantee that the list is really empty when it returns */
2138 while (--i >= 0) {
2139 Py_XDECREF(final_ob_item[i]);
2140 }
2141 PyMem_FREE(final_ob_item);
2142 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002143 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002144 Py_XINCREF(result);
2145 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002146}
Tim Peters330f9e92002-07-19 07:05:44 +00002147#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002148#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002149
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002150int
Fred Drakea2f55112000-07-09 15:16:51 +00002151PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002152{
2153 if (v == NULL || !PyList_Check(v)) {
2154 PyErr_BadInternalCall();
2155 return -1;
2156 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002157 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002158 if (v == NULL)
2159 return -1;
2160 Py_DECREF(v);
2161 return 0;
2162}
2163
Guido van Rossumb86c5492001-02-12 22:06:02 +00002164static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002165listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002166{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002167 if (Py_Size(self) > 1)
2168 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002169 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002170}
2171
Guido van Rossum84c76f51990-10-30 13:32:20 +00002172int
Fred Drakea2f55112000-07-09 15:16:51 +00002173PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002174{
Tim Peters6063e262002-08-08 01:06:39 +00002175 PyListObject *self = (PyListObject *)v;
2176
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002177 if (v == NULL || !PyList_Check(v)) {
2178 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002179 return -1;
2180 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002181 if (Py_Size(self) > 1)
2182 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002183 return 0;
2184}
2185
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002186PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002187PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002188{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002189 PyObject *w;
2190 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002191 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002192 if (v == NULL || !PyList_Check(v)) {
2193 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002194 return NULL;
2195 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002196 n = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002197 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002198 if (w == NULL)
2199 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002200 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002201 memcpy((void *)p,
2202 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002204 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002205 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002206 p++;
2207 }
2208 return w;
2209}
2210
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002211static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002212listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002213{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002214 Py_ssize_t i, start=0, stop=Py_Size(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002215 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002216
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002217 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2218 _PyEval_SliceIndex, &start,
2219 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002220 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002221 if (start < 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002222 start += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002223 if (start < 0)
2224 start = 0;
2225 }
2226 if (stop < 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002227 stop += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002228 if (stop < 0)
2229 stop = 0;
2230 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002231 for (i = start; i < stop && i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002232 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2233 if (cmp > 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002234 return PyLong_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002235 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002236 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002237 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002239 return NULL;
2240}
2241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002242static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002243listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002244{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002245 Py_ssize_t count = 0;
2246 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002247
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002248 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002249 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2250 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002251 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002252 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002253 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002254 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002255 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002256}
2257
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002258static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002259listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002260{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002261 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002262
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002263 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002264 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2265 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002266 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002267 (PyObject *)NULL) == 0)
2268 Py_RETURN_NONE;
2269 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002270 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002271 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002272 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002273 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002274 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002275 return NULL;
2276}
2277
Jeremy Hylton8caad492000-06-23 14:18:11 +00002278static int
2279list_traverse(PyListObject *o, visitproc visit, void *arg)
2280{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002281 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002282
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002283 for (i = Py_Size(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002284 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002285 return 0;
2286}
2287
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002288static PyObject *
2289list_richcompare(PyObject *v, PyObject *w, int op)
2290{
2291 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002292 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002293
2294 if (!PyList_Check(v) || !PyList_Check(w)) {
2295 Py_INCREF(Py_NotImplemented);
2296 return Py_NotImplemented;
2297 }
2298
2299 vl = (PyListObject *)v;
2300 wl = (PyListObject *)w;
2301
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002302 if (Py_Size(vl) != Py_Size(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002303 /* Shortcut: if the lengths differ, the lists differ */
2304 PyObject *res;
2305 if (op == Py_EQ)
2306 res = Py_False;
2307 else
2308 res = Py_True;
2309 Py_INCREF(res);
2310 return res;
2311 }
2312
2313 /* Search for the first index where items are different */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002314 for (i = 0; i < Py_Size(vl) && i < Py_Size(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002315 int k = PyObject_RichCompareBool(vl->ob_item[i],
2316 wl->ob_item[i], Py_EQ);
2317 if (k < 0)
2318 return NULL;
2319 if (!k)
2320 break;
2321 }
2322
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002323 if (i >= Py_Size(vl) || i >= Py_Size(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002324 /* No more items to compare -- compare sizes */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002325 Py_ssize_t vs = Py_Size(vl);
2326 Py_ssize_t ws = Py_Size(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002327 int cmp;
2328 PyObject *res;
2329 switch (op) {
2330 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002331 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002332 case Py_EQ: cmp = vs == ws; break;
2333 case Py_NE: cmp = vs != ws; break;
2334 case Py_GT: cmp = vs > ws; break;
2335 case Py_GE: cmp = vs >= ws; break;
2336 default: return NULL; /* cannot happen */
2337 }
2338 if (cmp)
2339 res = Py_True;
2340 else
2341 res = Py_False;
2342 Py_INCREF(res);
2343 return res;
2344 }
2345
2346 /* We have an item that differs -- shortcuts for EQ/NE */
2347 if (op == Py_EQ) {
2348 Py_INCREF(Py_False);
2349 return Py_False;
2350 }
2351 if (op == Py_NE) {
2352 Py_INCREF(Py_True);
2353 return Py_True;
2354 }
2355
2356 /* Compare the final item again using the proper operator */
2357 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2358}
2359
Tim Peters6d6c1a32001-08-02 04:15:00 +00002360static int
2361list_init(PyListObject *self, PyObject *args, PyObject *kw)
2362{
2363 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002364 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002365
2366 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2367 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002368
2369 /* Verify list invariants established by PyType_GenericAlloc() */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002370 assert(0 <= Py_Size(self));
2371 assert(Py_Size(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002372 assert(self->ob_item != NULL ||
2373 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002374
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002375 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002376 if (self->ob_item != NULL) {
2377 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002378 }
2379 if (arg != NULL) {
2380 PyObject *rv = listextend(self, arg);
2381 if (rv == NULL)
2382 return -1;
2383 Py_DECREF(rv);
2384 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002385 return 0;
2386}
2387
Raymond Hettinger1021c442003-11-07 15:38:09 +00002388static PyObject *list_iter(PyObject *seq);
2389static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2390
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002391PyDoc_STRVAR(getitem_doc,
2392"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002393PyDoc_STRVAR(reversed_doc,
2394"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002395PyDoc_STRVAR(append_doc,
2396"L.append(object) -- append object to end");
2397PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002398"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002399PyDoc_STRVAR(insert_doc,
2400"L.insert(index, object) -- insert object before index");
2401PyDoc_STRVAR(pop_doc,
2402"L.pop([index]) -> item -- remove and return item at index (default last)");
2403PyDoc_STRVAR(remove_doc,
2404"L.remove(value) -- remove first occurrence of value");
2405PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002406"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407PyDoc_STRVAR(count_doc,
2408"L.count(value) -> integer -- return number of occurrences of value");
2409PyDoc_STRVAR(reverse_doc,
2410"L.reverse() -- reverse *IN PLACE*");
2411PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002412"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2413cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002414
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002415static PyObject *list_subscript(PyListObject*, PyObject*);
2416
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002417static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002418 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002419 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002420 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002421 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002422 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002423 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002424 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002425 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002426 {"count", (PyCFunction)listcount, METH_O, count_doc},
2427 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002428 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002429 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002430};
2431
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002432static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002433 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002434 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002435 (ssizeargfunc)list_repeat, /* sq_repeat */
2436 (ssizeargfunc)list_item, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002437 0, /* sq_slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002438 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002439 0, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002440 (objobjproc)list_contains, /* sq_contains */
2441 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002442 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002443};
2444
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002445PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002446"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002447"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002448
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002449static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002450list_subscript(PyListObject* self, PyObject* item)
2451{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002452 if (PyIndex_Check(item)) {
2453 Py_ssize_t i;
2454 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002455 if (i == -1 && PyErr_Occurred())
2456 return NULL;
2457 if (i < 0)
2458 i += PyList_GET_SIZE(self);
2459 return list_item(self, i);
2460 }
2461 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002462 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002463 PyObject* result;
2464 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002465 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002466
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002467 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002468 &start, &stop, &step, &slicelength) < 0) {
2469 return NULL;
2470 }
2471
2472 if (slicelength <= 0) {
2473 return PyList_New(0);
2474 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002475 else if (step == 1) {
2476 return list_slice(self, start, stop);
2477 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002478 else {
2479 result = PyList_New(slicelength);
2480 if (!result) return NULL;
2481
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002482 src = self->ob_item;
2483 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002484 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002485 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002486 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002487 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002488 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002489 }
Tim Peters3b01a122002-07-19 02:35:45 +00002490
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002491 return result;
2492 }
2493 }
2494 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002495 PyErr_Format(PyExc_TypeError,
2496 "list indices must be integers, not %.200s",
2497 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002498 return NULL;
2499 }
2500}
2501
Tim Peters3b01a122002-07-19 02:35:45 +00002502static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002503list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2504{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002505 if (PyIndex_Check(item)) {
2506 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002507 if (i == -1 && PyErr_Occurred())
2508 return -1;
2509 if (i < 0)
2510 i += PyList_GET_SIZE(self);
2511 return list_ass_item(self, i, value);
2512 }
2513 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002514 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002515
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002516 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002517 &start, &stop, &step, &slicelength) < 0) {
2518 return -1;
2519 }
2520
Thomas Woutersed03b412007-08-28 21:37:11 +00002521 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002522 return list_ass_slice(self, start, stop, value);
2523
Thomas Woutersed03b412007-08-28 21:37:11 +00002524 /* Make sure s[5:2] = [..] inserts at the right place:
2525 before 5, not before 2. */
2526 if ((step < 0 && start < stop) ||
2527 (step > 0 && start > stop))
2528 stop = start;
2529
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002530 if (value == NULL) {
2531 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002532 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002533 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002534
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002535 if (slicelength <= 0)
2536 return 0;
2537
2538 if (step < 0) {
2539 stop = start + 1;
2540 start = stop + step*(slicelength - 1) - 1;
2541 step = -step;
2542 }
2543
2544 garbage = (PyObject**)
2545 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002546 if (!garbage) {
2547 PyErr_NoMemory();
2548 return -1;
2549 }
Tim Peters3b01a122002-07-19 02:35:45 +00002550
Thomas Woutersed03b412007-08-28 21:37:11 +00002551 /* drawing pictures might help understand these for
2552 loops. Basically, we memmove the parts of the
2553 list that are *not* part of the slice: step-1
2554 items for each item that is part of the slice,
2555 and then tail end of the list that was not
2556 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002557 for (cur = start, i = 0;
2558 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002559 cur += step, i++) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002560 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002561
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002562 garbage[i] = PyList_GET_ITEM(self, cur);
2563
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002564 if (cur + step >= Py_Size(self)) {
2565 lim = Py_Size(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002566 }
2567
Tim Petersb38e2b62004-07-29 02:29:26 +00002568 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002569 self->ob_item + cur + 1,
2570 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002571 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002572 cur = start + slicelength*step;
2573 if (cur < Py_Size(self)) {
2574 memmove(self->ob_item + cur - slicelength,
2575 self->ob_item + cur,
2576 (Py_Size(self) - cur) *
2577 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002578 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002579
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002580 Py_Size(self) -= slicelength;
2581 list_resize(self, Py_Size(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002582
2583 for (i = 0; i < slicelength; i++) {
2584 Py_DECREF(garbage[i]);
2585 }
2586 PyMem_FREE(garbage);
2587
2588 return 0;
2589 }
2590 else {
2591 /* assign slice */
Thomas Woutersed03b412007-08-28 21:37:11 +00002592 PyObject *ins, *seq;
2593 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002594 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002595
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002596 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002597 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002598 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002599 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002600 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002601 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002602 seq = PySequence_Fast(value,
Thomas Woutersed03b412007-08-28 21:37:11 +00002603 "must assign iterable "
2604 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002605 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002606 if (!seq)
2607 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002608
2609 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2610 PyErr_Format(PyExc_ValueError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002611 "attempt to assign sequence of "
2612 "size %zd to extended slice of "
2613 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002614 PySequence_Fast_GET_SIZE(seq),
2615 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002616 Py_DECREF(seq);
2617 return -1;
2618 }
2619
2620 if (!slicelength) {
2621 Py_DECREF(seq);
2622 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002623 }
2624
2625 garbage = (PyObject**)
2626 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002627 if (!garbage) {
2628 Py_DECREF(seq);
2629 PyErr_NoMemory();
2630 return -1;
2631 }
Tim Peters3b01a122002-07-19 02:35:45 +00002632
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002633 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002634 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002635 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002636 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002637 garbage[i] = selfitems[cur];
2638 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002639 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002640 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002641 }
2642
2643 for (i = 0; i < slicelength; i++) {
2644 Py_DECREF(garbage[i]);
2645 }
Tim Peters3b01a122002-07-19 02:35:45 +00002646
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002647 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002648 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002649
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002650 return 0;
2651 }
Tim Peters3b01a122002-07-19 02:35:45 +00002652 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002653 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002654 PyErr_Format(PyExc_TypeError,
2655 "list indices must be integers, not %.200s",
2656 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002657 return -1;
2658 }
2659}
2660
2661static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002662 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002663 (binaryfunc)list_subscript,
2664 (objobjargproc)list_ass_subscript
2665};
2666
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002667PyTypeObject PyList_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002668 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002669 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002670 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002671 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002672 (destructor)list_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002673 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002674 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002675 0, /* tp_setattr */
2676 0, /* tp_compare */
2677 (reprfunc)list_repr, /* tp_repr */
2678 0, /* tp_as_number */
2679 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002680 &list_as_mapping, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002681 0, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002682 0, /* tp_call */
2683 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002684 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002685 0, /* tp_setattro */
2686 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002687 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002688 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002689 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002690 (traverseproc)list_traverse, /* tp_traverse */
2691 (inquiry)list_clear, /* tp_clear */
2692 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002693 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002694 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002695 0, /* tp_iternext */
2696 list_methods, /* tp_methods */
2697 0, /* tp_members */
2698 0, /* tp_getset */
2699 0, /* tp_base */
2700 0, /* tp_dict */
2701 0, /* tp_descr_get */
2702 0, /* tp_descr_set */
2703 0, /* tp_dictoffset */
2704 (initproc)list_init, /* tp_init */
2705 PyType_GenericAlloc, /* tp_alloc */
2706 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002707 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002708};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002709
2710
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002711/*********************** List Iterator **************************/
2712
2713typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002714 PyObject_HEAD
2715 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002716 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002717} listiterobject;
2718
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002719static PyObject *list_iter(PyObject *);
2720static void listiter_dealloc(listiterobject *);
2721static int listiter_traverse(listiterobject *, visitproc, void *);
2722static PyObject *listiter_next(listiterobject *);
2723static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002724
Armin Rigof5b3e362006-02-11 21:32:43 +00002725PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002726
2727static PyMethodDef listiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002728 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002729 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002730};
2731
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002732PyTypeObject PyListIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002733 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002734 "list_iterator", /* tp_name */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002735 sizeof(listiterobject), /* tp_basicsize */
2736 0, /* tp_itemsize */
2737 /* methods */
2738 (destructor)listiter_dealloc, /* tp_dealloc */
2739 0, /* tp_print */
2740 0, /* tp_getattr */
2741 0, /* tp_setattr */
2742 0, /* tp_compare */
2743 0, /* tp_repr */
2744 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002745 0, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002746 0, /* tp_as_mapping */
2747 0, /* tp_hash */
2748 0, /* tp_call */
2749 0, /* tp_str */
2750 PyObject_GenericGetAttr, /* tp_getattro */
2751 0, /* tp_setattro */
2752 0, /* tp_as_buffer */
2753 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2754 0, /* tp_doc */
2755 (traverseproc)listiter_traverse, /* tp_traverse */
2756 0, /* tp_clear */
2757 0, /* tp_richcompare */
2758 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002759 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002760 (iternextfunc)listiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002761 listiter_methods, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002762 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002763};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002764
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002765
2766static PyObject *
2767list_iter(PyObject *seq)
2768{
2769 listiterobject *it;
2770
2771 if (!PyList_Check(seq)) {
2772 PyErr_BadInternalCall();
2773 return NULL;
2774 }
2775 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2776 if (it == NULL)
2777 return NULL;
2778 it->it_index = 0;
2779 Py_INCREF(seq);
2780 it->it_seq = (PyListObject *)seq;
2781 _PyObject_GC_TRACK(it);
2782 return (PyObject *)it;
2783}
2784
2785static void
2786listiter_dealloc(listiterobject *it)
2787{
2788 _PyObject_GC_UNTRACK(it);
2789 Py_XDECREF(it->it_seq);
2790 PyObject_GC_Del(it);
2791}
2792
2793static int
2794listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2795{
2796 Py_VISIT(it->it_seq);
2797 return 0;
2798}
2799
2800static PyObject *
2801listiter_next(listiterobject *it)
2802{
2803 PyListObject *seq;
2804 PyObject *item;
2805
2806 assert(it != NULL);
2807 seq = it->it_seq;
2808 if (seq == NULL)
2809 return NULL;
2810 assert(PyList_Check(seq));
2811
2812 if (it->it_index < PyList_GET_SIZE(seq)) {
2813 item = PyList_GET_ITEM(seq, it->it_index);
2814 ++it->it_index;
2815 Py_INCREF(item);
2816 return item;
2817 }
2818
2819 Py_DECREF(seq);
2820 it->it_seq = NULL;
2821 return NULL;
2822}
2823
2824static PyObject *
2825listiter_len(listiterobject *it)
2826{
2827 Py_ssize_t len;
2828 if (it->it_seq) {
2829 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2830 if (len >= 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002831 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002832 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002833 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002834}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002835/*********************** List Reverse Iterator **************************/
2836
2837typedef struct {
2838 PyObject_HEAD
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002839 Py_ssize_t it_index;
Raymond Hettinger001f2282003-11-08 11:58:44 +00002840 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002841} listreviterobject;
2842
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002843static PyObject *list_reversed(PyListObject *, PyObject *);
2844static void listreviter_dealloc(listreviterobject *);
2845static int listreviter_traverse(listreviterobject *, visitproc, void *);
2846static PyObject *listreviter_next(listreviterobject *);
2847static Py_ssize_t listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002848
2849static PySequenceMethods listreviter_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002850 (lenfunc)listreviter_len, /* sq_length */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002851 0, /* sq_concat */
2852};
2853
Raymond Hettinger1021c442003-11-07 15:38:09 +00002854PyTypeObject PyListRevIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002855 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002856 "list_reverseiterator", /* tp_name */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002857 sizeof(listreviterobject), /* tp_basicsize */
2858 0, /* tp_itemsize */
2859 /* methods */
2860 (destructor)listreviter_dealloc, /* tp_dealloc */
2861 0, /* tp_print */
2862 0, /* tp_getattr */
2863 0, /* tp_setattr */
2864 0, /* tp_compare */
2865 0, /* tp_repr */
2866 0, /* tp_as_number */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002867 &listreviter_as_sequence, /* tp_as_sequence */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002868 0, /* tp_as_mapping */
2869 0, /* tp_hash */
2870 0, /* tp_call */
2871 0, /* tp_str */
2872 PyObject_GenericGetAttr, /* tp_getattro */
2873 0, /* tp_setattro */
2874 0, /* tp_as_buffer */
2875 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2876 0, /* tp_doc */
2877 (traverseproc)listreviter_traverse, /* tp_traverse */
2878 0, /* tp_clear */
2879 0, /* tp_richcompare */
2880 0, /* tp_weaklistoffset */
2881 PyObject_SelfIter, /* tp_iter */
2882 (iternextfunc)listreviter_next, /* tp_iternext */
2883 0,
2884};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002885
2886static PyObject *
2887list_reversed(PyListObject *seq, PyObject *unused)
2888{
2889 listreviterobject *it;
2890
2891 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2892 if (it == NULL)
2893 return NULL;
2894 assert(PyList_Check(seq));
2895 it->it_index = PyList_GET_SIZE(seq) - 1;
2896 Py_INCREF(seq);
2897 it->it_seq = seq;
2898 PyObject_GC_Track(it);
2899 return (PyObject *)it;
2900}
2901
2902static void
2903listreviter_dealloc(listreviterobject *it)
2904{
2905 PyObject_GC_UnTrack(it);
2906 Py_XDECREF(it->it_seq);
2907 PyObject_GC_Del(it);
2908}
2909
2910static int
2911listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2912{
2913 Py_VISIT(it->it_seq);
2914 return 0;
2915}
2916
2917static PyObject *
2918listreviter_next(listreviterobject *it)
2919{
2920 PyObject *item;
2921 Py_ssize_t index = it->it_index;
2922 PyListObject *seq = it->it_seq;
2923
2924 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2925 item = PyList_GET_ITEM(seq, index);
2926 it->it_index--;
2927 Py_INCREF(item);
2928 return item;
2929 }
2930 it->it_index = -1;
2931 if (seq != NULL) {
2932 it->it_seq = NULL;
2933 Py_DECREF(seq);
2934 }
2935 return NULL;
2936}
2937
2938static Py_ssize_t
2939listreviter_len(listreviterobject *it)
2940{
2941 Py_ssize_t len = it->it_index + 1;
2942 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2943 return 0;
2944 return len;
2945}
2946