blob: 235edf5d5fae1cf965cea05313c88e078bc8ec0c [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;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000466 if (size == 0)
467 return PyList_New(0);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000468 if (n && size/n != Py_Size(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000469 return PyErr_NoMemory();
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;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000636 Py_ssize_t size, i, j, p;
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
Tim Petersb38e2b62004-07-29 02:29:26 +0000651 if (list_resize(self, size*n) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000652 return NULL;
653
654 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000655 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000656 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
657 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000658 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000659 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000660 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000661 }
662 }
663 Py_INCREF(self);
664 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000665}
666
Guido van Rossum4a450d01991-04-03 19:05:18 +0000667static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000668list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000669{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 PyObject *old_value;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000671 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 PyErr_SetString(PyExc_IndexError,
673 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000674 return -1;
675 }
676 if (v == NULL)
677 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000679 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000680 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000681 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000682 return 0;
683}
684
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000686listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000687{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000688 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000690 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000691 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000692 if (ins1(self, i, v) == 0)
693 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000694 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000695}
696
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000698listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000699{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000700 if (app1(self, v) == 0)
701 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000702 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000703}
704
Barry Warsawdedf6d61998-10-09 16:37:25 +0000705static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000706listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000707{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000708 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000709 Py_ssize_t m; /* size of self */
710 Py_ssize_t n; /* guess for size of b */
711 Py_ssize_t mn; /* m + n */
712 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000713 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000714
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000715 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000716 1) lists and tuples which can use PySequence_Fast ops
717 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000718 */
719 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000720 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000721 b = PySequence_Fast(b, "argument must be iterable");
722 if (!b)
723 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000724 n = PySequence_Fast_GET_SIZE(b);
725 if (n == 0) {
726 /* short circuit when b is empty */
727 Py_DECREF(b);
728 Py_RETURN_NONE;
729 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000730 m = Py_Size(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000731 if (list_resize(self, m + n) == -1) {
732 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000733 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000734 }
735 /* note that we may still have self == b here for the
736 * situation a.extend(a), but the following code works
737 * in that case too. Just make sure to resize self
738 * before calling PySequence_Fast_ITEMS.
739 */
740 /* populate the end of self with b's items */
741 src = PySequence_Fast_ITEMS(b);
742 dest = self->ob_item + m;
743 for (i = 0; i < n; i++) {
744 PyObject *o = src[i];
745 Py_INCREF(o);
746 dest[i] = o;
747 }
748 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000749 Py_RETURN_NONE;
750 }
751
752 it = PyObject_GetIter(b);
753 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000754 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000755 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000756
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000757 /* Guess a result list size. */
Armin Rigof5b3e362006-02-11 21:32:43 +0000758 n = _PyObject_LengthHint(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000759 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000760 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
761 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
762 Py_DECREF(it);
763 return NULL;
764 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000765 PyErr_Clear();
766 n = 8; /* arbitrary */
767 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000768 m = Py_Size(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000769 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000770 if (mn >= m) {
771 /* Make room. */
772 if (list_resize(self, mn) == -1)
773 goto error;
774 /* Make the list sane again. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000775 Py_Size(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000776 }
777 /* Else m + n overflowed; on the chance that n lied, and there really
778 * is enough room, ignore it. If n was telling the truth, we'll
779 * eventually run out of memory during the loop.
780 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000781
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000782 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000783 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000784 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000785 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000786 if (PyErr_Occurred()) {
787 if (PyErr_ExceptionMatches(PyExc_StopIteration))
788 PyErr_Clear();
789 else
790 goto error;
791 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000792 break;
793 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000794 if (Py_Size(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000795 /* steals ref */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000796 PyList_SET_ITEM(self, Py_Size(self), item);
797 ++Py_Size(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000798 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000799 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000800 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000801 Py_DECREF(item); /* append creates a new ref */
802 if (status < 0)
803 goto error;
804 }
805 }
806
807 /* Cut back result list if initial guess was too large. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000808 if (Py_Size(self) < self->allocated)
809 list_resize(self, Py_Size(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000810
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000811 Py_DECREF(it);
812 Py_RETURN_NONE;
813
814 error:
815 Py_DECREF(it);
816 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000817}
818
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000819PyObject *
820_PyList_Extend(PyListObject *self, PyObject *b)
821{
822 return listextend(self, b);
823}
824
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000825static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000826list_inplace_concat(PyListObject *self, PyObject *other)
827{
828 PyObject *result;
829
830 result = listextend(self, other);
831 if (result == NULL)
832 return result;
833 Py_DECREF(result);
834 Py_INCREF(self);
835 return (PyObject *)self;
836}
837
838static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000839listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000840{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000841 Py_ssize_t i = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000842 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000843 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000844
Thomas Wouters89f507f2006-12-13 04:49:30 +0000845 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000846 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000847
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000848 if (Py_Size(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000849 /* Special-case most common failure cause */
850 PyErr_SetString(PyExc_IndexError, "pop from empty list");
851 return NULL;
852 }
853 if (i < 0)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000854 i += Py_Size(self);
855 if (i < 0 || i >= Py_Size(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000856 PyErr_SetString(PyExc_IndexError, "pop index out of range");
857 return NULL;
858 }
859 v = self->ob_item[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000860 if (i == Py_Size(self) - 1) {
861 status = list_resize(self, Py_Size(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000862 assert(status >= 0);
863 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000864 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000865 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000866 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
867 assert(status >= 0);
868 /* Use status, so that in a release build compilers don't
869 * complain about the unused name.
870 */
Brett Cannon651dd522004-08-08 21:21:18 +0000871 (void) status;
872
873 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000874}
875
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000876/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
877static void
878reverse_slice(PyObject **lo, PyObject **hi)
879{
880 assert(lo && hi);
881
882 --hi;
883 while (lo < hi) {
884 PyObject *t = *lo;
885 *lo = *hi;
886 *hi = t;
887 ++lo;
888 --hi;
889 }
890}
891
Tim Petersa64dc242002-08-01 02:13:36 +0000892/* Lots of code for an adaptive, stable, natural mergesort. There are many
893 * pieces to this algorithm; read listsort.txt for overviews and details.
894 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000895
Guido van Rossum3f236de1996-12-10 23:55:39 +0000896/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000897 * comparison function (any callable Python object), which must not be
898 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
899 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000900 * Returns -1 on error, 1 if x < y, 0 if x >= y.
901 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000902static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000903islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000904{
Tim Petersf2a04732002-07-11 21:46:16 +0000905 PyObject *res;
906 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000908
Tim Peters66860f62002-08-04 17:47:26 +0000909 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000910 /* Call the user's comparison function and translate the 3-way
911 * result into true or false (or error).
912 */
Tim Petersf2a04732002-07-11 21:46:16 +0000913 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000914 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000915 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000916 Py_INCREF(x);
917 Py_INCREF(y);
918 PyTuple_SET_ITEM(args, 0, x);
919 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000920 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000922 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000923 return -1;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000924 if (!PyInt_CheckExact(res)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925 PyErr_Format(PyExc_TypeError,
926 "comparison function must return int, not %.200s",
927 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000929 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000930 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 i = PyInt_AsLong(res);
932 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000933 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000934}
935
Tim Peters66860f62002-08-04 17:47:26 +0000936/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
937 * islt. This avoids a layer of function call in the usual case, and
938 * sorting does many comparisons.
939 * Returns -1 on error, 1 if x < y, 0 if x >= y.
940 */
941#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
942 PyObject_RichCompareBool(X, Y, Py_LT) : \
943 islt(X, Y, COMPARE))
944
945/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000946 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
947 started. It makes more sense in context <wink>. X and Y are PyObject*s.
948*/
Tim Peters66860f62002-08-04 17:47:26 +0000949#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000950 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000951
952/* binarysort is the best method for sorting small arrays: it does
953 few compares, but can do data movement quadratic in the number of
954 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000955 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000956 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000957 On entry, must have lo <= start <= hi, and that [lo, start) is already
958 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000959 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000960 Even in case of error, the output slice will be some permutation of
961 the input (nothing is lost or duplicated).
962*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000963static int
Fred Drakea2f55112000-07-09 15:16:51 +0000964binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
965 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000966{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000967 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000968 register PyObject **l, **p, **r;
969 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000970
Tim Petersa8c974c2002-07-19 03:30:57 +0000971 assert(lo <= start && start <= hi);
972 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000973 if (lo == start)
974 ++start;
975 for (; start < hi; ++start) {
976 /* set l to where *start belongs */
977 l = lo;
978 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000979 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000980 /* Invariants:
981 * pivot >= all in [lo, l).
982 * pivot < all in [r, start).
983 * The second is vacuously true at the start.
984 */
985 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000986 do {
987 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000988 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000989 r = p;
990 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000991 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000992 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000993 assert(l == r);
994 /* The invariants still hold, so pivot >= all in [lo, l) and
995 pivot < all in [l, start), so pivot belongs at l. Note
996 that if there are elements equal to pivot, l points to the
997 first slot after them -- that's why this sort is stable.
998 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000999 Caution: using memmove is much slower under MSVC 5;
1000 we're not usually moving many slots. */
1001 for (p = start; p > l; --p)
1002 *p = *(p-1);
1003 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001004 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001005 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001006
1007 fail:
1008 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001009}
1010
Tim Petersa64dc242002-08-01 02:13:36 +00001011/*
1012Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1013is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001014
Tim Petersa64dc242002-08-01 02:13:36 +00001015 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001016
Tim Petersa64dc242002-08-01 02:13:36 +00001017or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001018
Tim Petersa64dc242002-08-01 02:13:36 +00001019 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001020
Tim Petersa64dc242002-08-01 02:13:36 +00001021Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1022For its intended use in a stable mergesort, the strictness of the defn of
1023"descending" is needed so that the caller can safely reverse a descending
1024sequence without violating stability (strict > ensures there are no equal
1025elements to get out of order).
1026
1027Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001028*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001029static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001030count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001031{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001032 Py_ssize_t k;
1033 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001034
Tim Petersa64dc242002-08-01 02:13:36 +00001035 assert(lo < hi);
1036 *descending = 0;
1037 ++lo;
1038 if (lo == hi)
1039 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001040
Tim Petersa64dc242002-08-01 02:13:36 +00001041 n = 2;
1042 IFLT(*lo, *(lo-1)) {
1043 *descending = 1;
1044 for (lo = lo+1; lo < hi; ++lo, ++n) {
1045 IFLT(*lo, *(lo-1))
1046 ;
1047 else
1048 break;
1049 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001050 }
Tim Petersa64dc242002-08-01 02:13:36 +00001051 else {
1052 for (lo = lo+1; lo < hi; ++lo, ++n) {
1053 IFLT(*lo, *(lo-1))
1054 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001055 }
1056 }
1057
Tim Petersa64dc242002-08-01 02:13:36 +00001058 return n;
1059fail:
1060 return -1;
1061}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001062
Tim Petersa64dc242002-08-01 02:13:36 +00001063/*
1064Locate the proper position of key in a sorted vector; if the vector contains
1065an element equal to key, return the position immediately to the left of
1066the leftmost equal element. [gallop_right() does the same except returns
1067the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001068
Tim Petersa64dc242002-08-01 02:13:36 +00001069"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001070
Tim Petersa64dc242002-08-01 02:13:36 +00001071"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1072hint is to the final result, the faster this runs.
1073
1074The return value is the int k in 0..n such that
1075
1076 a[k-1] < key <= a[k]
1077
1078pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1079key belongs at index k; or, IOW, the first k elements of a should precede
1080key, and the last n-k should follow key.
1081
1082Returns -1 on error. See listsort.txt for info on the method.
1083*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001084static Py_ssize_t
1085gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001086{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001087 Py_ssize_t ofs;
1088 Py_ssize_t lastofs;
1089 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001090
1091 assert(key && a && n > 0 && hint >= 0 && hint < n);
1092
1093 a += hint;
1094 lastofs = 0;
1095 ofs = 1;
1096 IFLT(*a, key) {
1097 /* a[hint] < key -- gallop right, until
1098 * a[hint + lastofs] < key <= a[hint + ofs]
1099 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001100 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001101 while (ofs < maxofs) {
1102 IFLT(a[ofs], key) {
1103 lastofs = ofs;
1104 ofs = (ofs << 1) + 1;
1105 if (ofs <= 0) /* int overflow */
1106 ofs = maxofs;
1107 }
1108 else /* key <= a[hint + ofs] */
1109 break;
1110 }
1111 if (ofs > maxofs)
1112 ofs = maxofs;
1113 /* Translate back to offsets relative to &a[0]. */
1114 lastofs += hint;
1115 ofs += hint;
1116 }
1117 else {
1118 /* key <= a[hint] -- gallop left, until
1119 * a[hint - ofs] < key <= a[hint - lastofs]
1120 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001121 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001122 while (ofs < maxofs) {
1123 IFLT(*(a-ofs), key)
1124 break;
1125 /* key <= a[hint - ofs] */
1126 lastofs = ofs;
1127 ofs = (ofs << 1) + 1;
1128 if (ofs <= 0) /* int overflow */
1129 ofs = maxofs;
1130 }
1131 if (ofs > maxofs)
1132 ofs = maxofs;
1133 /* Translate back to positive offsets relative to &a[0]. */
1134 k = lastofs;
1135 lastofs = hint - ofs;
1136 ofs = hint - k;
1137 }
1138 a -= hint;
1139
1140 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1141 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1142 * right of lastofs but no farther right than ofs. Do a binary
1143 * search, with invariant a[lastofs-1] < key <= a[ofs].
1144 */
1145 ++lastofs;
1146 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001147 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001148
1149 IFLT(a[m], key)
1150 lastofs = m+1; /* a[m] < key */
1151 else
1152 ofs = m; /* key <= a[m] */
1153 }
1154 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1155 return ofs;
1156
1157fail:
1158 return -1;
1159}
1160
1161/*
1162Exactly like gallop_left(), except that if key already exists in a[0:n],
1163finds the position immediately to the right of the rightmost equal value.
1164
1165The return value is the int k in 0..n such that
1166
1167 a[k-1] <= key < a[k]
1168
1169or -1 if error.
1170
1171The code duplication is massive, but this is enough different given that
1172we're sticking to "<" comparisons that it's much harder to follow if
1173written as one routine with yet another "left or right?" flag.
1174*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001175static Py_ssize_t
1176gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001177{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001178 Py_ssize_t ofs;
1179 Py_ssize_t lastofs;
1180 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001181
1182 assert(key && a && n > 0 && hint >= 0 && hint < n);
1183
1184 a += hint;
1185 lastofs = 0;
1186 ofs = 1;
1187 IFLT(key, *a) {
1188 /* key < a[hint] -- gallop left, until
1189 * a[hint - ofs] <= key < a[hint - lastofs]
1190 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001191 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001192 while (ofs < maxofs) {
1193 IFLT(key, *(a-ofs)) {
1194 lastofs = ofs;
1195 ofs = (ofs << 1) + 1;
1196 if (ofs <= 0) /* int overflow */
1197 ofs = maxofs;
1198 }
1199 else /* a[hint - ofs] <= key */
1200 break;
1201 }
1202 if (ofs > maxofs)
1203 ofs = maxofs;
1204 /* Translate back to positive offsets relative to &a[0]. */
1205 k = lastofs;
1206 lastofs = hint - ofs;
1207 ofs = hint - k;
1208 }
1209 else {
1210 /* a[hint] <= key -- gallop right, until
1211 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001212 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001213 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001214 while (ofs < maxofs) {
1215 IFLT(key, a[ofs])
1216 break;
1217 /* a[hint + ofs] <= key */
1218 lastofs = ofs;
1219 ofs = (ofs << 1) + 1;
1220 if (ofs <= 0) /* int overflow */
1221 ofs = maxofs;
1222 }
1223 if (ofs > maxofs)
1224 ofs = maxofs;
1225 /* Translate back to offsets relative to &a[0]. */
1226 lastofs += hint;
1227 ofs += hint;
1228 }
1229 a -= hint;
1230
1231 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1232 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1233 * right of lastofs but no farther right than ofs. Do a binary
1234 * search, with invariant a[lastofs-1] <= key < a[ofs].
1235 */
1236 ++lastofs;
1237 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001238 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001239
1240 IFLT(key, a[m])
1241 ofs = m; /* key < a[m] */
1242 else
1243 lastofs = m+1; /* a[m] <= key */
1244 }
1245 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1246 return ofs;
1247
1248fail:
1249 return -1;
1250}
1251
1252/* The maximum number of entries in a MergeState's pending-runs stack.
1253 * This is enough to sort arrays of size up to about
1254 * 32 * phi ** MAX_MERGE_PENDING
1255 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1256 * with 2**64 elements.
1257 */
1258#define MAX_MERGE_PENDING 85
1259
Tim Peterse05f65a2002-08-10 05:21:15 +00001260/* When we get into galloping mode, we stay there until both runs win less
1261 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001262 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001263#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001264
1265/* Avoid malloc for small temp arrays. */
1266#define MERGESTATE_TEMP_SIZE 256
1267
1268/* One MergeState exists on the stack per invocation of mergesort. It's just
1269 * a convenient way to pass state around among the helper functions.
1270 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001271struct s_slice {
1272 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001273 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001274};
1275
Tim Petersa64dc242002-08-01 02:13:36 +00001276typedef struct s_MergeState {
1277 /* The user-supplied comparison function. or NULL if none given. */
1278 PyObject *compare;
1279
Tim Peterse05f65a2002-08-10 05:21:15 +00001280 /* This controls when we get *into* galloping mode. It's initialized
1281 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1282 * random data, and lower for highly structured data.
1283 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001284 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001285
Tim Petersa64dc242002-08-01 02:13:36 +00001286 /* 'a' is temp storage to help with merges. It contains room for
1287 * alloced entries.
1288 */
1289 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001290 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001291
1292 /* A stack of n pending runs yet to be merged. Run #i starts at
1293 * address base[i] and extends for len[i] elements. It's always
1294 * true (so long as the indices are in bounds) that
1295 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001296 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001297 *
1298 * so we could cut the storage for this, but it's a minor amount,
1299 * and keeping all the info explicit simplifies the code.
1300 */
1301 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001302 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001303
1304 /* 'a' points to this when possible, rather than muck with malloc. */
1305 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1306} MergeState;
1307
1308/* Conceptually a MergeState's constructor. */
1309static void
1310merge_init(MergeState *ms, PyObject *compare)
1311{
1312 assert(ms != NULL);
1313 ms->compare = compare;
1314 ms->a = ms->temparray;
1315 ms->alloced = MERGESTATE_TEMP_SIZE;
1316 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001317 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001318}
1319
1320/* Free all the temp memory owned by the MergeState. This must be called
1321 * when you're done with a MergeState, and may be called before then if
1322 * you want to free the temp memory early.
1323 */
1324static void
1325merge_freemem(MergeState *ms)
1326{
1327 assert(ms != NULL);
1328 if (ms->a != ms->temparray)
1329 PyMem_Free(ms->a);
1330 ms->a = ms->temparray;
1331 ms->alloced = MERGESTATE_TEMP_SIZE;
1332}
1333
1334/* Ensure enough temp memory for 'need' array slots is available.
1335 * Returns 0 on success and -1 if the memory can't be gotten.
1336 */
1337static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001338merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001339{
1340 assert(ms != NULL);
1341 if (need <= ms->alloced)
1342 return 0;
1343 /* Don't realloc! That can cost cycles to copy the old data, but
1344 * we don't care what's in the block.
1345 */
1346 merge_freemem(ms);
1347 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1348 if (ms->a) {
1349 ms->alloced = need;
1350 return 0;
1351 }
1352 PyErr_NoMemory();
1353 merge_freemem(ms); /* reset to sane state */
1354 return -1;
1355}
1356#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1357 merge_getmem(MS, NEED))
1358
1359/* Merge the na elements starting at pa with the nb elements starting at pb
1360 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1361 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1362 * merge, and should have na <= nb. See listsort.txt for more info.
1363 * Return 0 if successful, -1 if error.
1364 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001365static Py_ssize_t
1366merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1367 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001368{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001369 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001370 PyObject *compare;
1371 PyObject **dest;
1372 int result = -1; /* guilty until proved innocent */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001373 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001374
1375 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1376 if (MERGE_GETMEM(ms, na) < 0)
1377 return -1;
1378 memcpy(ms->a, pa, na * sizeof(PyObject*));
1379 dest = pa;
1380 pa = ms->a;
1381
1382 *dest++ = *pb++;
1383 --nb;
1384 if (nb == 0)
1385 goto Succeed;
1386 if (na == 1)
1387 goto CopyB;
1388
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001389 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001390 compare = ms->compare;
1391 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001392 Py_ssize_t acount = 0; /* # of times A won in a row */
1393 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001394
1395 /* Do the straightforward thing until (if ever) one run
1396 * appears to win consistently.
1397 */
1398 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001399 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001400 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001401 if (k) {
1402 if (k < 0)
1403 goto Fail;
1404 *dest++ = *pb++;
1405 ++bcount;
1406 acount = 0;
1407 --nb;
1408 if (nb == 0)
1409 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001410 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001411 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001412 }
1413 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001414 *dest++ = *pa++;
1415 ++acount;
1416 bcount = 0;
1417 --na;
1418 if (na == 1)
1419 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001420 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001421 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001422 }
Tim Petersa64dc242002-08-01 02:13:36 +00001423 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001424
Tim Petersa64dc242002-08-01 02:13:36 +00001425 /* One run is winning so consistently that galloping may
1426 * be a huge win. So try that, and continue galloping until
1427 * (if ever) neither run appears to be winning consistently
1428 * anymore.
1429 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001430 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001431 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001432 assert(na > 1 && nb > 0);
1433 min_gallop -= min_gallop > 1;
1434 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001435 k = gallop_right(*pb, pa, na, 0, compare);
1436 acount = k;
1437 if (k) {
1438 if (k < 0)
1439 goto Fail;
1440 memcpy(dest, pa, k * sizeof(PyObject *));
1441 dest += k;
1442 pa += k;
1443 na -= k;
1444 if (na == 1)
1445 goto CopyB;
1446 /* na==0 is impossible now if the comparison
1447 * function is consistent, but we can't assume
1448 * that it is.
1449 */
1450 if (na == 0)
1451 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001452 }
Tim Petersa64dc242002-08-01 02:13:36 +00001453 *dest++ = *pb++;
1454 --nb;
1455 if (nb == 0)
1456 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001457
Tim Petersa64dc242002-08-01 02:13:36 +00001458 k = gallop_left(*pa, pb, nb, 0, compare);
1459 bcount = k;
1460 if (k) {
1461 if (k < 0)
1462 goto Fail;
1463 memmove(dest, pb, k * sizeof(PyObject *));
1464 dest += k;
1465 pb += k;
1466 nb -= k;
1467 if (nb == 0)
1468 goto Succeed;
1469 }
1470 *dest++ = *pa++;
1471 --na;
1472 if (na == 1)
1473 goto CopyB;
1474 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001475 ++min_gallop; /* penalize it for leaving galloping mode */
1476 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001477 }
1478Succeed:
1479 result = 0;
1480Fail:
1481 if (na)
1482 memcpy(dest, pa, na * sizeof(PyObject*));
1483 return result;
1484CopyB:
1485 assert(na == 1 && nb > 0);
1486 /* The last element of pa belongs at the end of the merge. */
1487 memmove(dest, pb, nb * sizeof(PyObject *));
1488 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001489 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001490}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001491
Tim Petersa64dc242002-08-01 02:13:36 +00001492/* Merge the na elements starting at pa with the nb elements starting at pb
1493 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1494 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1495 * merge, and should have na >= nb. See listsort.txt for more info.
1496 * Return 0 if successful, -1 if error.
1497 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001498static Py_ssize_t
1499merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001500{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001501 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001502 PyObject *compare;
1503 PyObject **dest;
1504 int result = -1; /* guilty until proved innocent */
1505 PyObject **basea;
1506 PyObject **baseb;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001507 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001508
1509 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1510 if (MERGE_GETMEM(ms, nb) < 0)
1511 return -1;
1512 dest = pb + nb - 1;
1513 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1514 basea = pa;
1515 baseb = ms->a;
1516 pb = ms->a + nb - 1;
1517 pa += na - 1;
1518
1519 *dest-- = *pa--;
1520 --na;
1521 if (na == 0)
1522 goto Succeed;
1523 if (nb == 1)
1524 goto CopyA;
1525
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001526 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001527 compare = ms->compare;
1528 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001529 Py_ssize_t acount = 0; /* # of times A won in a row */
1530 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001531
1532 /* Do the straightforward thing until (if ever) one run
1533 * appears to win consistently.
1534 */
1535 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001536 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001537 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001538 if (k) {
1539 if (k < 0)
1540 goto Fail;
1541 *dest-- = *pa--;
1542 ++acount;
1543 bcount = 0;
1544 --na;
1545 if (na == 0)
1546 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001547 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001548 break;
1549 }
1550 else {
1551 *dest-- = *pb--;
1552 ++bcount;
1553 acount = 0;
1554 --nb;
1555 if (nb == 1)
1556 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001557 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001558 break;
1559 }
1560 }
1561
1562 /* One run is winning so consistently that galloping may
1563 * be a huge win. So try that, and continue galloping until
1564 * (if ever) neither run appears to be winning consistently
1565 * anymore.
1566 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001567 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001568 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001569 assert(na > 0 && nb > 1);
1570 min_gallop -= min_gallop > 1;
1571 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001572 k = gallop_right(*pb, basea, na, na-1, compare);
1573 if (k < 0)
1574 goto Fail;
1575 k = na - k;
1576 acount = k;
1577 if (k) {
1578 dest -= k;
1579 pa -= k;
1580 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1581 na -= k;
1582 if (na == 0)
1583 goto Succeed;
1584 }
1585 *dest-- = *pb--;
1586 --nb;
1587 if (nb == 1)
1588 goto CopyA;
1589
1590 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1591 if (k < 0)
1592 goto Fail;
1593 k = nb - k;
1594 bcount = k;
1595 if (k) {
1596 dest -= k;
1597 pb -= k;
1598 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1599 nb -= k;
1600 if (nb == 1)
1601 goto CopyA;
1602 /* nb==0 is impossible now if the comparison
1603 * function is consistent, but we can't assume
1604 * that it is.
1605 */
1606 if (nb == 0)
1607 goto Succeed;
1608 }
1609 *dest-- = *pa--;
1610 --na;
1611 if (na == 0)
1612 goto Succeed;
1613 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001614 ++min_gallop; /* penalize it for leaving galloping mode */
1615 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001616 }
1617Succeed:
1618 result = 0;
1619Fail:
1620 if (nb)
1621 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1622 return result;
1623CopyA:
1624 assert(nb == 1 && na > 0);
1625 /* The first element of pb belongs at the front of the merge. */
1626 dest -= na;
1627 pa -= na;
1628 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1629 *dest = *pb;
1630 return 0;
1631}
1632
1633/* Merge the two runs at stack indices i and i+1.
1634 * Returns 0 on success, -1 on error.
1635 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001636static Py_ssize_t
1637merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001638{
1639 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001640 Py_ssize_t na, nb;
1641 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001642 PyObject *compare;
1643
1644 assert(ms != NULL);
1645 assert(ms->n >= 2);
1646 assert(i >= 0);
1647 assert(i == ms->n - 2 || i == ms->n - 3);
1648
Tim Peterse05f65a2002-08-10 05:21:15 +00001649 pa = ms->pending[i].base;
1650 na = ms->pending[i].len;
1651 pb = ms->pending[i+1].base;
1652 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001653 assert(na > 0 && nb > 0);
1654 assert(pa + na == pb);
1655
1656 /* Record the length of the combined runs; if i is the 3rd-last
1657 * run now, also slide over the last run (which isn't involved
1658 * in this merge). The current run i+1 goes away in any case.
1659 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001660 ms->pending[i].len = na + nb;
1661 if (i == ms->n - 3)
1662 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001663 --ms->n;
1664
1665 /* Where does b start in a? Elements in a before that can be
1666 * ignored (already in place).
1667 */
1668 compare = ms->compare;
1669 k = gallop_right(*pb, pa, na, 0, compare);
1670 if (k < 0)
1671 return -1;
1672 pa += k;
1673 na -= k;
1674 if (na == 0)
1675 return 0;
1676
1677 /* Where does a end in b? Elements in b after that can be
1678 * ignored (already in place).
1679 */
1680 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1681 if (nb <= 0)
1682 return nb;
1683
1684 /* Merge what remains of the runs, using a temp array with
1685 * min(na, nb) elements.
1686 */
1687 if (na <= nb)
1688 return merge_lo(ms, pa, na, pb, nb);
1689 else
1690 return merge_hi(ms, pa, na, pb, nb);
1691}
1692
1693/* Examine the stack of runs waiting to be merged, merging adjacent runs
1694 * until the stack invariants are re-established:
1695 *
1696 * 1. len[-3] > len[-2] + len[-1]
1697 * 2. len[-2] > len[-1]
1698 *
1699 * See listsort.txt for more info.
1700 *
1701 * Returns 0 on success, -1 on error.
1702 */
1703static int
1704merge_collapse(MergeState *ms)
1705{
Tim Peterse05f65a2002-08-10 05:21:15 +00001706 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001707
1708 assert(ms);
1709 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001710 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001711 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1712 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001713 --n;
1714 if (merge_at(ms, n) < 0)
1715 return -1;
1716 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001717 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001718 if (merge_at(ms, n) < 0)
1719 return -1;
1720 }
1721 else
1722 break;
1723 }
1724 return 0;
1725}
1726
1727/* Regardless of invariants, merge all runs on the stack until only one
1728 * remains. This is used at the end of the mergesort.
1729 *
1730 * Returns 0 on success, -1 on error.
1731 */
1732static int
1733merge_force_collapse(MergeState *ms)
1734{
Tim Peterse05f65a2002-08-10 05:21:15 +00001735 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001736
1737 assert(ms);
1738 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001739 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001740 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001741 --n;
1742 if (merge_at(ms, n) < 0)
1743 return -1;
1744 }
1745 return 0;
1746}
1747
1748/* Compute a good value for the minimum run length; natural runs shorter
1749 * than this are boosted artificially via binary insertion.
1750 *
1751 * If n < 64, return n (it's too small to bother with fancy stuff).
1752 * Else if n is an exact power of 2, return 32.
1753 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1754 * strictly less than, an exact power of 2.
1755 *
1756 * See listsort.txt for more info.
1757 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001758static Py_ssize_t
1759merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001760{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001761 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001762
1763 assert(n >= 0);
1764 while (n >= 64) {
1765 r |= n & 1;
1766 n >>= 1;
1767 }
1768 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001769}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001770
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001771/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001772 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001773 which is returned during the undecorate phase. By exposing only the key
1774 during comparisons, the underlying sort stability characteristics are left
1775 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001776 the key instead of a full record. */
1777
1778typedef struct {
1779 PyObject_HEAD
1780 PyObject *key;
1781 PyObject *value;
1782} sortwrapperobject;
1783
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001784PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001785static PyObject *
1786sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1787static void
1788sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001789
1790static PyTypeObject sortwrapper_type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001791 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001792 "sortwrapper", /* tp_name */
1793 sizeof(sortwrapperobject), /* tp_basicsize */
1794 0, /* tp_itemsize */
1795 /* methods */
1796 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1797 0, /* tp_print */
1798 0, /* tp_getattr */
1799 0, /* tp_setattr */
1800 0, /* tp_compare */
1801 0, /* tp_repr */
1802 0, /* tp_as_number */
1803 0, /* tp_as_sequence */
1804 0, /* tp_as_mapping */
1805 0, /* tp_hash */
1806 0, /* tp_call */
1807 0, /* tp_str */
1808 PyObject_GenericGetAttr, /* tp_getattro */
1809 0, /* tp_setattro */
1810 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001811 Py_TPFLAGS_DEFAULT, /* tp_flags */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001812 sortwrapper_doc, /* tp_doc */
1813 0, /* tp_traverse */
1814 0, /* tp_clear */
1815 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1816};
1817
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001818
1819static PyObject *
1820sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1821{
1822 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1823 PyErr_SetString(PyExc_TypeError,
1824 "expected a sortwrapperobject");
1825 return NULL;
1826 }
1827 return PyObject_RichCompare(a->key, b->key, op);
1828}
1829
1830static void
1831sortwrapper_dealloc(sortwrapperobject *so)
1832{
1833 Py_XDECREF(so->key);
1834 Py_XDECREF(so->value);
1835 PyObject_Del(so);
1836}
1837
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001838/* Returns a new reference to a sortwrapper.
1839 Consumes the references to the two underlying objects. */
1840
1841static PyObject *
1842build_sortwrapper(PyObject *key, PyObject *value)
1843{
1844 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001845
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001846 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1847 if (so == NULL)
1848 return NULL;
1849 so->key = key;
1850 so->value = value;
1851 return (PyObject *)so;
1852}
1853
1854/* Returns a new reference to the value underlying the wrapper. */
1855static PyObject *
1856sortwrapper_getvalue(PyObject *so)
1857{
1858 PyObject *value;
1859
1860 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001861 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001862 "expected a sortwrapperobject");
1863 return NULL;
1864 }
1865 value = ((sortwrapperobject *)so)->value;
1866 Py_INCREF(value);
1867 return value;
1868}
1869
1870/* Wrapper for user specified cmp functions in combination with a
1871 specified key function. Makes sure the cmp function is presented
1872 with the actual key instead of the sortwrapper */
1873
1874typedef struct {
1875 PyObject_HEAD
1876 PyObject *func;
1877} cmpwrapperobject;
1878
1879static void
1880cmpwrapper_dealloc(cmpwrapperobject *co)
1881{
1882 Py_XDECREF(co->func);
1883 PyObject_Del(co);
1884}
1885
1886static PyObject *
1887cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1888{
1889 PyObject *x, *y, *xx, *yy;
1890
1891 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1892 return NULL;
1893 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001894 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001895 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001896 "expected a sortwrapperobject");
1897 return NULL;
1898 }
1899 xx = ((sortwrapperobject *)x)->key;
1900 yy = ((sortwrapperobject *)y)->key;
1901 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1902}
1903
1904PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1905
1906static PyTypeObject cmpwrapper_type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001907 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001908 "cmpwrapper", /* tp_name */
1909 sizeof(cmpwrapperobject), /* tp_basicsize */
1910 0, /* tp_itemsize */
1911 /* methods */
1912 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1913 0, /* tp_print */
1914 0, /* tp_getattr */
1915 0, /* tp_setattr */
1916 0, /* tp_compare */
1917 0, /* tp_repr */
1918 0, /* tp_as_number */
1919 0, /* tp_as_sequence */
1920 0, /* tp_as_mapping */
1921 0, /* tp_hash */
1922 (ternaryfunc)cmpwrapper_call, /* tp_call */
1923 0, /* tp_str */
1924 PyObject_GenericGetAttr, /* tp_getattro */
1925 0, /* tp_setattro */
1926 0, /* tp_as_buffer */
1927 Py_TPFLAGS_DEFAULT, /* tp_flags */
1928 cmpwrapper_doc, /* tp_doc */
1929};
1930
1931static PyObject *
1932build_cmpwrapper(PyObject *cmpfunc)
1933{
1934 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001935
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001936 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1937 if (co == NULL)
1938 return NULL;
1939 Py_INCREF(cmpfunc);
1940 co->func = cmpfunc;
1941 return (PyObject *)co;
1942}
1943
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001944static int
1945is_default_cmp(PyObject *cmpfunc)
1946{
1947 PyCFunctionObject *f;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001948 const char *module;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001949 if (cmpfunc == NULL || cmpfunc == Py_None)
1950 return 1;
1951 if (!PyCFunction_Check(cmpfunc))
1952 return 0;
Guido van Rossumf1624cd2006-08-24 23:43:52 +00001953 f = (PyCFunctionObject *)cmpfunc;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001954 if (f->m_self != NULL)
1955 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001956 if (!PyUnicode_Check(f->m_module))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001957 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001958 module = PyUnicode_AsString(f->m_module);
1959 if (module == NULL)
1960 return 0;
1961 if (strcmp(module, "__builtin__") != 0)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001962 return 0;
1963 if (strcmp(f->m_ml->ml_name, "cmp") != 0)
1964 return 0;
1965 return 1;
1966}
1967
Tim Petersa64dc242002-08-01 02:13:36 +00001968/* An adaptive, stable, natural mergesort. See listsort.txt.
1969 * Returns Py_None on success, NULL on error. Even in case of error, the
1970 * list will be some permutation of its input state (nothing is lost or
1971 * duplicated).
1972 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001973static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001974listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001975{
Tim Petersa64dc242002-08-01 02:13:36 +00001976 MergeState ms;
1977 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001978 Py_ssize_t nremaining;
1979 Py_ssize_t minrun;
1980 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001981 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001982 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001983 PyObject *compare = NULL;
1984 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001985 int reverse = 0;
1986 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001987 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001988 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001989 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001990
Tim Petersa64dc242002-08-01 02:13:36 +00001991 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001992 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001993 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001994 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
1995 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001996 return NULL;
1997 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001998 if (is_default_cmp(compare))
Skip Montanaro4abd5f02003-01-02 20:51:08 +00001999 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002000 if (keyfunc == Py_None)
2001 keyfunc = NULL;
2002 if (compare != NULL && keyfunc != NULL) {
2003 compare = build_cmpwrapper(compare);
2004 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002005 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002006 } else
2007 Py_XINCREF(compare);
2008
Tim Petersb9099c32002-11-12 22:08:10 +00002009 /* The list is temporarily made empty, so that mutations performed
2010 * by comparison functions can't affect the slice of memory we're
2011 * sorting (allowing mutations during sorting is a core-dump
2012 * factory, since ob_item may change).
2013 */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002014 saved_ob_size = Py_Size(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002015 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002016 saved_allocated = self->allocated;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002017 Py_Size(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002018 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002019 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002020
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002021 if (keyfunc != NULL) {
2022 for (i=0 ; i < saved_ob_size ; i++) {
2023 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002024 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002025 NULL);
2026 if (key == NULL) {
2027 for (i=i-1 ; i>=0 ; i--) {
2028 kvpair = saved_ob_item[i];
2029 value = sortwrapper_getvalue(kvpair);
2030 saved_ob_item[i] = value;
2031 Py_DECREF(kvpair);
2032 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002033 goto dsu_fail;
2034 }
2035 kvpair = build_sortwrapper(key, value);
2036 if (kvpair == NULL)
2037 goto dsu_fail;
2038 saved_ob_item[i] = kvpair;
2039 }
2040 }
2041
2042 /* Reverse sort stability achieved by initially reversing the list,
2043 applying a stable forward sort, then reversing the final result. */
2044 if (reverse && saved_ob_size > 1)
2045 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2046
2047 merge_init(&ms, compare);
2048
Tim Petersb9099c32002-11-12 22:08:10 +00002049 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002050 if (nremaining < 2)
2051 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002052
Tim Petersa64dc242002-08-01 02:13:36 +00002053 /* March over the array once, left to right, finding natural runs,
2054 * and extending short natural runs to minrun elements.
2055 */
Tim Petersb9099c32002-11-12 22:08:10 +00002056 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002057 hi = lo + nremaining;
2058 minrun = merge_compute_minrun(nremaining);
2059 do {
2060 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002061 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002062
Tim Petersa64dc242002-08-01 02:13:36 +00002063 /* Identify next run. */
2064 n = count_run(lo, hi, compare, &descending);
2065 if (n < 0)
2066 goto fail;
2067 if (descending)
2068 reverse_slice(lo, lo + n);
2069 /* If short, extend to min(minrun, nremaining). */
2070 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002071 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002072 nremaining : minrun;
2073 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2074 goto fail;
2075 n = force;
2076 }
2077 /* Push run onto pending-runs stack, and maybe merge. */
2078 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002079 ms.pending[ms.n].base = lo;
2080 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002081 ++ms.n;
2082 if (merge_collapse(&ms) < 0)
2083 goto fail;
2084 /* Advance to find next run. */
2085 lo += n;
2086 nremaining -= n;
2087 } while (nremaining);
2088 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002089
Tim Petersa64dc242002-08-01 02:13:36 +00002090 if (merge_force_collapse(&ms) < 0)
2091 goto fail;
2092 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002093 assert(ms.pending[0].base == saved_ob_item);
2094 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002095
2096succeed:
2097 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002098fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002099 if (keyfunc != NULL) {
2100 for (i=0 ; i < saved_ob_size ; i++) {
2101 kvpair = saved_ob_item[i];
2102 value = sortwrapper_getvalue(kvpair);
2103 saved_ob_item[i] = value;
2104 Py_DECREF(kvpair);
2105 }
2106 }
2107
Armin Rigo93677f02004-07-29 12:40:23 +00002108 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002109 /* The user mucked with the list during the sort,
2110 * and we don't already have another error to report.
2111 */
2112 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2113 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002114 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002115
2116 if (reverse && saved_ob_size > 1)
2117 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2118
2119 merge_freemem(&ms);
2120
2121dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002122 final_ob_item = self->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002123 i = Py_Size(self);
2124 Py_Size(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002125 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002126 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002127 if (final_ob_item != NULL) {
2128 /* we cannot use list_clear() for this because it does not
2129 guarantee that the list is really empty when it returns */
2130 while (--i >= 0) {
2131 Py_XDECREF(final_ob_item[i]);
2132 }
2133 PyMem_FREE(final_ob_item);
2134 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002135 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002136 Py_XINCREF(result);
2137 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002138}
Tim Peters330f9e92002-07-19 07:05:44 +00002139#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002140#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002141
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002142int
Fred Drakea2f55112000-07-09 15:16:51 +00002143PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002144{
2145 if (v == NULL || !PyList_Check(v)) {
2146 PyErr_BadInternalCall();
2147 return -1;
2148 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002149 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002150 if (v == NULL)
2151 return -1;
2152 Py_DECREF(v);
2153 return 0;
2154}
2155
Guido van Rossumb86c5492001-02-12 22:06:02 +00002156static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002157listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002158{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002159 if (Py_Size(self) > 1)
2160 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002161 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002162}
2163
Guido van Rossum84c76f51990-10-30 13:32:20 +00002164int
Fred Drakea2f55112000-07-09 15:16:51 +00002165PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002166{
Tim Peters6063e262002-08-08 01:06:39 +00002167 PyListObject *self = (PyListObject *)v;
2168
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002169 if (v == NULL || !PyList_Check(v)) {
2170 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002171 return -1;
2172 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002173 if (Py_Size(self) > 1)
2174 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002175 return 0;
2176}
2177
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002179PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002180{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002181 PyObject *w;
2182 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002183 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002184 if (v == NULL || !PyList_Check(v)) {
2185 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002186 return NULL;
2187 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002188 n = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002189 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002190 if (w == NULL)
2191 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002192 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002193 memcpy((void *)p,
2194 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002195 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002196 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002197 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002198 p++;
2199 }
2200 return w;
2201}
2202
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002204listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002205{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002206 Py_ssize_t i, start=0, stop=Py_Size(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002207 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002208
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002209 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2210 _PyEval_SliceIndex, &start,
2211 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002212 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002213 if (start < 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002214 start += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002215 if (start < 0)
2216 start = 0;
2217 }
2218 if (stop < 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002219 stop += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002220 if (stop < 0)
2221 stop = 0;
2222 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002223 for (i = start; i < stop && i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002224 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2225 if (cmp > 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002226 return PyInt_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002227 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002228 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002229 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002230 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002231 return NULL;
2232}
2233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002234static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002235listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002236{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002237 Py_ssize_t count = 0;
2238 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002239
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002240 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002241 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2242 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002243 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002244 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002245 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002246 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002247 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002248}
2249
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002250static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002251listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002252{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002253 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002254
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002255 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002256 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2257 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002258 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002259 (PyObject *)NULL) == 0)
2260 Py_RETURN_NONE;
2261 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002262 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002263 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002264 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002266 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002267 return NULL;
2268}
2269
Jeremy Hylton8caad492000-06-23 14:18:11 +00002270static int
2271list_traverse(PyListObject *o, visitproc visit, void *arg)
2272{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002273 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002274
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002275 for (i = Py_Size(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002276 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002277 return 0;
2278}
2279
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002280static PyObject *
2281list_richcompare(PyObject *v, PyObject *w, int op)
2282{
2283 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002284 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002285
2286 if (!PyList_Check(v) || !PyList_Check(w)) {
2287 Py_INCREF(Py_NotImplemented);
2288 return Py_NotImplemented;
2289 }
2290
2291 vl = (PyListObject *)v;
2292 wl = (PyListObject *)w;
2293
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002294 if (Py_Size(vl) != Py_Size(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002295 /* Shortcut: if the lengths differ, the lists differ */
2296 PyObject *res;
2297 if (op == Py_EQ)
2298 res = Py_False;
2299 else
2300 res = Py_True;
2301 Py_INCREF(res);
2302 return res;
2303 }
2304
2305 /* Search for the first index where items are different */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002306 for (i = 0; i < Py_Size(vl) && i < Py_Size(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002307 int k = PyObject_RichCompareBool(vl->ob_item[i],
2308 wl->ob_item[i], Py_EQ);
2309 if (k < 0)
2310 return NULL;
2311 if (!k)
2312 break;
2313 }
2314
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002315 if (i >= Py_Size(vl) || i >= Py_Size(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002316 /* No more items to compare -- compare sizes */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002317 Py_ssize_t vs = Py_Size(vl);
2318 Py_ssize_t ws = Py_Size(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002319 int cmp;
2320 PyObject *res;
2321 switch (op) {
2322 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002323 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002324 case Py_EQ: cmp = vs == ws; break;
2325 case Py_NE: cmp = vs != ws; break;
2326 case Py_GT: cmp = vs > ws; break;
2327 case Py_GE: cmp = vs >= ws; break;
2328 default: return NULL; /* cannot happen */
2329 }
2330 if (cmp)
2331 res = Py_True;
2332 else
2333 res = Py_False;
2334 Py_INCREF(res);
2335 return res;
2336 }
2337
2338 /* We have an item that differs -- shortcuts for EQ/NE */
2339 if (op == Py_EQ) {
2340 Py_INCREF(Py_False);
2341 return Py_False;
2342 }
2343 if (op == Py_NE) {
2344 Py_INCREF(Py_True);
2345 return Py_True;
2346 }
2347
2348 /* Compare the final item again using the proper operator */
2349 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2350}
2351
Tim Peters6d6c1a32001-08-02 04:15:00 +00002352static int
2353list_init(PyListObject *self, PyObject *args, PyObject *kw)
2354{
2355 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002356 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002357
2358 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2359 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002360
2361 /* Verify list invariants established by PyType_GenericAlloc() */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002362 assert(0 <= Py_Size(self));
2363 assert(Py_Size(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002364 assert(self->ob_item != NULL ||
2365 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002366
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002367 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002368 if (self->ob_item != NULL) {
2369 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002370 }
2371 if (arg != NULL) {
2372 PyObject *rv = listextend(self, arg);
2373 if (rv == NULL)
2374 return -1;
2375 Py_DECREF(rv);
2376 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002377 return 0;
2378}
2379
Raymond Hettinger1021c442003-11-07 15:38:09 +00002380static PyObject *list_iter(PyObject *seq);
2381static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2382
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002383PyDoc_STRVAR(getitem_doc,
2384"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002385PyDoc_STRVAR(reversed_doc,
2386"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002387PyDoc_STRVAR(append_doc,
2388"L.append(object) -- append object to end");
2389PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002390"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391PyDoc_STRVAR(insert_doc,
2392"L.insert(index, object) -- insert object before index");
2393PyDoc_STRVAR(pop_doc,
2394"L.pop([index]) -> item -- remove and return item at index (default last)");
2395PyDoc_STRVAR(remove_doc,
2396"L.remove(value) -- remove first occurrence of value");
2397PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002398"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002399PyDoc_STRVAR(count_doc,
2400"L.count(value) -> integer -- return number of occurrences of value");
2401PyDoc_STRVAR(reverse_doc,
2402"L.reverse() -- reverse *IN PLACE*");
2403PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002404"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2405cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002406
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002407static PyObject *list_subscript(PyListObject*, PyObject*);
2408
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002409static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002410 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002411 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002412 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002413 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002414 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002415 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002416 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002417 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002418 {"count", (PyCFunction)listcount, METH_O, count_doc},
2419 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002420 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002421 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002422};
2423
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002424static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002425 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002426 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002427 (ssizeargfunc)list_repeat, /* sq_repeat */
2428 (ssizeargfunc)list_item, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002429 0, /* sq_slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002430 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002431 0, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002432 (objobjproc)list_contains, /* sq_contains */
2433 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002434 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002435};
2436
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002437PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002438"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002439"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002440
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002441static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002442list_subscript(PyListObject* self, PyObject* item)
2443{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002444 if (PyIndex_Check(item)) {
2445 Py_ssize_t i;
2446 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002447 if (i == -1 && PyErr_Occurred())
2448 return NULL;
2449 if (i < 0)
2450 i += PyList_GET_SIZE(self);
2451 return list_item(self, i);
2452 }
2453 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002454 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002455 PyObject* result;
2456 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002457 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002458
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002459 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002460 &start, &stop, &step, &slicelength) < 0) {
2461 return NULL;
2462 }
2463
2464 if (slicelength <= 0) {
2465 return PyList_New(0);
2466 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002467 else if (step == 1) {
2468 return list_slice(self, start, stop);
2469 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002470 else {
2471 result = PyList_New(slicelength);
2472 if (!result) return NULL;
2473
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002474 src = self->ob_item;
2475 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002476 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002477 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002478 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002479 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002480 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002481 }
Tim Peters3b01a122002-07-19 02:35:45 +00002482
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002483 return result;
2484 }
2485 }
2486 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 PyErr_Format(PyExc_TypeError,
2488 "list indices must be integers, not %.200s",
2489 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002490 return NULL;
2491 }
2492}
2493
Tim Peters3b01a122002-07-19 02:35:45 +00002494static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002495list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2496{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002497 if (PyIndex_Check(item)) {
2498 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002499 if (i == -1 && PyErr_Occurred())
2500 return -1;
2501 if (i < 0)
2502 i += PyList_GET_SIZE(self);
2503 return list_ass_item(self, i, value);
2504 }
2505 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002506 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002507
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002508 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002509 &start, &stop, &step, &slicelength) < 0) {
2510 return -1;
2511 }
2512
Thomas Woutersed03b412007-08-28 21:37:11 +00002513 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002514 return list_ass_slice(self, start, stop, value);
2515
Thomas Woutersed03b412007-08-28 21:37:11 +00002516 /* Make sure s[5:2] = [..] inserts at the right place:
2517 before 5, not before 2. */
2518 if ((step < 0 && start < stop) ||
2519 (step > 0 && start > stop))
2520 stop = start;
2521
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002522 if (value == NULL) {
2523 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002524 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002525 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002526
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002527 if (slicelength <= 0)
2528 return 0;
2529
2530 if (step < 0) {
2531 stop = start + 1;
2532 start = stop + step*(slicelength - 1) - 1;
2533 step = -step;
2534 }
2535
2536 garbage = (PyObject**)
2537 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002538 if (!garbage) {
2539 PyErr_NoMemory();
2540 return -1;
2541 }
Tim Peters3b01a122002-07-19 02:35:45 +00002542
Thomas Woutersed03b412007-08-28 21:37:11 +00002543 /* drawing pictures might help understand these for
2544 loops. Basically, we memmove the parts of the
2545 list that are *not* part of the slice: step-1
2546 items for each item that is part of the slice,
2547 and then tail end of the list that was not
2548 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002549 for (cur = start, i = 0;
2550 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002551 cur += step, i++) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002552 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002553
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002554 garbage[i] = PyList_GET_ITEM(self, cur);
2555
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002556 if (cur + step >= Py_Size(self)) {
2557 lim = Py_Size(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002558 }
2559
Tim Petersb38e2b62004-07-29 02:29:26 +00002560 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002561 self->ob_item + cur + 1,
2562 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002563 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002564 cur = start + slicelength*step;
2565 if (cur < Py_Size(self)) {
2566 memmove(self->ob_item + cur - slicelength,
2567 self->ob_item + cur,
2568 (Py_Size(self) - cur) *
2569 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002570 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002571
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002572 Py_Size(self) -= slicelength;
2573 list_resize(self, Py_Size(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002574
2575 for (i = 0; i < slicelength; i++) {
2576 Py_DECREF(garbage[i]);
2577 }
2578 PyMem_FREE(garbage);
2579
2580 return 0;
2581 }
2582 else {
2583 /* assign slice */
Thomas Woutersed03b412007-08-28 21:37:11 +00002584 PyObject *ins, *seq;
2585 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002586 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002587
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002588 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002589 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002590 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002591 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002592 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002593 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002594 seq = PySequence_Fast(value,
Thomas Woutersed03b412007-08-28 21:37:11 +00002595 "must assign iterable "
2596 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002597 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002598 if (!seq)
2599 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002600
2601 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2602 PyErr_Format(PyExc_ValueError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002603 "attempt to assign sequence of "
2604 "size %zd to extended slice of "
2605 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002606 PySequence_Fast_GET_SIZE(seq),
2607 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002608 Py_DECREF(seq);
2609 return -1;
2610 }
2611
2612 if (!slicelength) {
2613 Py_DECREF(seq);
2614 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002615 }
2616
2617 garbage = (PyObject**)
2618 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002619 if (!garbage) {
2620 Py_DECREF(seq);
2621 PyErr_NoMemory();
2622 return -1;
2623 }
Tim Peters3b01a122002-07-19 02:35:45 +00002624
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002625 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002626 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002627 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002628 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002629 garbage[i] = selfitems[cur];
2630 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002631 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002632 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002633 }
2634
2635 for (i = 0; i < slicelength; i++) {
2636 Py_DECREF(garbage[i]);
2637 }
Tim Peters3b01a122002-07-19 02:35:45 +00002638
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002639 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002640 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002641
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002642 return 0;
2643 }
Tim Peters3b01a122002-07-19 02:35:45 +00002644 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002645 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002646 PyErr_Format(PyExc_TypeError,
2647 "list indices must be integers, not %.200s",
2648 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002649 return -1;
2650 }
2651}
2652
2653static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002654 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002655 (binaryfunc)list_subscript,
2656 (objobjargproc)list_ass_subscript
2657};
2658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002659PyTypeObject PyList_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002660 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002661 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002662 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002663 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002664 (destructor)list_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002665 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002666 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002667 0, /* tp_setattr */
2668 0, /* tp_compare */
2669 (reprfunc)list_repr, /* tp_repr */
2670 0, /* tp_as_number */
2671 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002672 &list_as_mapping, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002673 0, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002674 0, /* tp_call */
2675 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002676 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002677 0, /* tp_setattro */
2678 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002679 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002680 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002681 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002682 (traverseproc)list_traverse, /* tp_traverse */
2683 (inquiry)list_clear, /* tp_clear */
2684 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002685 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002686 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002687 0, /* tp_iternext */
2688 list_methods, /* tp_methods */
2689 0, /* tp_members */
2690 0, /* tp_getset */
2691 0, /* tp_base */
2692 0, /* tp_dict */
2693 0, /* tp_descr_get */
2694 0, /* tp_descr_set */
2695 0, /* tp_dictoffset */
2696 (initproc)list_init, /* tp_init */
2697 PyType_GenericAlloc, /* tp_alloc */
2698 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002699 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002700};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002701
2702
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002703/*********************** List Iterator **************************/
2704
2705typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002706 PyObject_HEAD
2707 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002708 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002709} listiterobject;
2710
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002711static PyObject *list_iter(PyObject *);
2712static void listiter_dealloc(listiterobject *);
2713static int listiter_traverse(listiterobject *, visitproc, void *);
2714static PyObject *listiter_next(listiterobject *);
2715static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002716
Armin Rigof5b3e362006-02-11 21:32:43 +00002717PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002718
2719static PyMethodDef listiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002720 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002721 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002722};
2723
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002724PyTypeObject PyListIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002725 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002726 "listiterator", /* tp_name */
2727 sizeof(listiterobject), /* tp_basicsize */
2728 0, /* tp_itemsize */
2729 /* methods */
2730 (destructor)listiter_dealloc, /* tp_dealloc */
2731 0, /* tp_print */
2732 0, /* tp_getattr */
2733 0, /* tp_setattr */
2734 0, /* tp_compare */
2735 0, /* tp_repr */
2736 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002737 0, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002738 0, /* tp_as_mapping */
2739 0, /* tp_hash */
2740 0, /* tp_call */
2741 0, /* tp_str */
2742 PyObject_GenericGetAttr, /* tp_getattro */
2743 0, /* tp_setattro */
2744 0, /* tp_as_buffer */
2745 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2746 0, /* tp_doc */
2747 (traverseproc)listiter_traverse, /* tp_traverse */
2748 0, /* tp_clear */
2749 0, /* tp_richcompare */
2750 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002751 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002752 (iternextfunc)listiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002753 listiter_methods, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002754 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002755};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002756
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002757
2758static PyObject *
2759list_iter(PyObject *seq)
2760{
2761 listiterobject *it;
2762
2763 if (!PyList_Check(seq)) {
2764 PyErr_BadInternalCall();
2765 return NULL;
2766 }
2767 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2768 if (it == NULL)
2769 return NULL;
2770 it->it_index = 0;
2771 Py_INCREF(seq);
2772 it->it_seq = (PyListObject *)seq;
2773 _PyObject_GC_TRACK(it);
2774 return (PyObject *)it;
2775}
2776
2777static void
2778listiter_dealloc(listiterobject *it)
2779{
2780 _PyObject_GC_UNTRACK(it);
2781 Py_XDECREF(it->it_seq);
2782 PyObject_GC_Del(it);
2783}
2784
2785static int
2786listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2787{
2788 Py_VISIT(it->it_seq);
2789 return 0;
2790}
2791
2792static PyObject *
2793listiter_next(listiterobject *it)
2794{
2795 PyListObject *seq;
2796 PyObject *item;
2797
2798 assert(it != NULL);
2799 seq = it->it_seq;
2800 if (seq == NULL)
2801 return NULL;
2802 assert(PyList_Check(seq));
2803
2804 if (it->it_index < PyList_GET_SIZE(seq)) {
2805 item = PyList_GET_ITEM(seq, it->it_index);
2806 ++it->it_index;
2807 Py_INCREF(item);
2808 return item;
2809 }
2810
2811 Py_DECREF(seq);
2812 it->it_seq = NULL;
2813 return NULL;
2814}
2815
2816static PyObject *
2817listiter_len(listiterobject *it)
2818{
2819 Py_ssize_t len;
2820 if (it->it_seq) {
2821 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2822 if (len >= 0)
2823 return PyInt_FromSsize_t(len);
2824 }
2825 return PyInt_FromLong(0);
2826}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002827/*********************** List Reverse Iterator **************************/
2828
2829typedef struct {
2830 PyObject_HEAD
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002831 Py_ssize_t it_index;
Raymond Hettinger001f2282003-11-08 11:58:44 +00002832 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002833} listreviterobject;
2834
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002835static PyObject *list_reversed(PyListObject *, PyObject *);
2836static void listreviter_dealloc(listreviterobject *);
2837static int listreviter_traverse(listreviterobject *, visitproc, void *);
2838static PyObject *listreviter_next(listreviterobject *);
2839static Py_ssize_t listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002840
2841static PySequenceMethods listreviter_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002842 (lenfunc)listreviter_len, /* sq_length */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002843 0, /* sq_concat */
2844};
2845
Raymond Hettinger1021c442003-11-07 15:38:09 +00002846PyTypeObject PyListRevIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002847 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger1021c442003-11-07 15:38:09 +00002848 "listreverseiterator", /* tp_name */
2849 sizeof(listreviterobject), /* tp_basicsize */
2850 0, /* tp_itemsize */
2851 /* methods */
2852 (destructor)listreviter_dealloc, /* tp_dealloc */
2853 0, /* tp_print */
2854 0, /* tp_getattr */
2855 0, /* tp_setattr */
2856 0, /* tp_compare */
2857 0, /* tp_repr */
2858 0, /* tp_as_number */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002859 &listreviter_as_sequence, /* tp_as_sequence */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002860 0, /* tp_as_mapping */
2861 0, /* tp_hash */
2862 0, /* tp_call */
2863 0, /* tp_str */
2864 PyObject_GenericGetAttr, /* tp_getattro */
2865 0, /* tp_setattro */
2866 0, /* tp_as_buffer */
2867 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2868 0, /* tp_doc */
2869 (traverseproc)listreviter_traverse, /* tp_traverse */
2870 0, /* tp_clear */
2871 0, /* tp_richcompare */
2872 0, /* tp_weaklistoffset */
2873 PyObject_SelfIter, /* tp_iter */
2874 (iternextfunc)listreviter_next, /* tp_iternext */
2875 0,
2876};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002877
2878static PyObject *
2879list_reversed(PyListObject *seq, PyObject *unused)
2880{
2881 listreviterobject *it;
2882
2883 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2884 if (it == NULL)
2885 return NULL;
2886 assert(PyList_Check(seq));
2887 it->it_index = PyList_GET_SIZE(seq) - 1;
2888 Py_INCREF(seq);
2889 it->it_seq = seq;
2890 PyObject_GC_Track(it);
2891 return (PyObject *)it;
2892}
2893
2894static void
2895listreviter_dealloc(listreviterobject *it)
2896{
2897 PyObject_GC_UnTrack(it);
2898 Py_XDECREF(it->it_seq);
2899 PyObject_GC_Del(it);
2900}
2901
2902static int
2903listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2904{
2905 Py_VISIT(it->it_seq);
2906 return 0;
2907}
2908
2909static PyObject *
2910listreviter_next(listreviterobject *it)
2911{
2912 PyObject *item;
2913 Py_ssize_t index = it->it_index;
2914 PyListObject *seq = it->it_seq;
2915
2916 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2917 item = PyList_GET_ITEM(seq, index);
2918 it->it_index--;
2919 Py_INCREF(item);
2920 return item;
2921 }
2922 it->it_index = -1;
2923 if (seq != NULL) {
2924 it->it_seq = NULL;
2925 Py_DECREF(seq);
2926 }
2927 return NULL;
2928}
2929
2930static Py_ssize_t
2931listreviter_len(listreviterobject *it)
2932{
2933 Py_ssize_t len = it->it_index + 1;
2934 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2935 return 0;
2936 return len;
2937}
2938