blob: b62bba543b0e7f7be08971fe739cfe22595456e9 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* List object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
4
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00005#ifdef STDC_HEADERS
6#include <stddef.h>
7#else
8#include <sys/types.h> /* For size_t */
9#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Tim Peters8d9eb102004-07-31 02:24:20 +000011/* Ensure ob_item has room for at least newsize elements, and set
12 * ob_size to newsize. If newsize > ob_size on entry, the content
13 * of the new slots at exit is undefined heap trash; it's the caller's
14 * responsiblity to overwrite them with sane values.
15 * The number of allocated elements may grow, shrink, or stay the same.
16 * Failure is impossible if newsize <= self.allocated on entry, although
17 * that partly relies on an assumption that the system realloc() never
18 * fails when passed a number of bytes <= the number of bytes last
19 * allocated (the C standard doesn't guarantee this, but it's hard to
20 * imagine a realloc implementation where it wouldn't be true).
21 * Note that self->ob_item may change, and even if newsize is less
22 * than ob_size on entry.
23 */
Guido van Rossuma46d51d1995-01-26 22:59:43 +000024static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000025list_resize(PyListObject *self, Py_ssize_t newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000026{
Raymond Hettinger4bb95402004-02-13 11:36:39 +000027 PyObject **items;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000028 size_t new_allocated;
Martin v. Löwis18e16552006-02-15 17:27:45 +000029 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000030
Raymond Hettinger4bb95402004-02-13 11:36:39 +000031 /* Bypass realloc() when a previous overallocation is large enough
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000032 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
Raymond Hettinger4bb95402004-02-13 11:36:39 +000034 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000035 if (allocated >= newsize && newsize >= (allocated >> 1)) {
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +000036 assert(self->ob_item != NULL || newsize == 0);
Christian Heimes90aa7642007-12-19 02:45:37 +000037 Py_SIZE(self) = newsize;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000038 return 0;
39 }
40
41 /* This over-allocates proportional to the list size, making room
Tim Peters65b8b842001-05-26 05:28:40 +000042 * for additional growth. The over-allocation is mild, but is
43 * enough to give linear-time amortized behavior over a long
44 * sequence of appends() in the presence of a poorly-performing
Raymond Hettingerab517d22004-02-14 18:34:46 +000045 * system realloc().
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
Tim Peters65b8b842001-05-26 05:28:40 +000047 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000048 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;
49 if (newsize == 0)
50 new_allocated = 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000051 items = self->ob_item;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000052 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
53 PyMem_RESIZE(items, PyObject *, new_allocated);
Raymond Hettinger4bb95402004-02-13 11:36:39 +000054 else
55 items = NULL;
56 if (items == NULL) {
57 PyErr_NoMemory();
58 return -1;
59 }
60 self->ob_item = items;
Christian Heimes90aa7642007-12-19 02:45:37 +000061 Py_SIZE(self) = newsize;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000062 self->allocated = new_allocated;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000063 return 0;
64}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000065
Raymond Hettinger0468e412004-05-05 05:37:53 +000066/* Empty list reuse scheme to save calls to malloc and free */
67#define MAXFREELISTS 80
68static PyListObject *free_lists[MAXFREELISTS];
69static int num_free_lists = 0;
70
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +000071void
72PyList_Fini(void)
73{
74 PyListObject *op;
75
76 while (num_free_lists) {
77 num_free_lists--;
78 op = free_lists[num_free_lists];
79 assert(PyList_CheckExact(op));
80 PyObject_GC_Del(op);
81 }
82}
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000085PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000088 size_t nbytes;
Tim Peters3986d4e2004-07-29 02:28:42 +000089
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 return NULL;
93 }
Tim Peters7049d812004-01-18 20:31:02 +000094 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000095 /* Check for overflow */
Raymond Hettingerfdfe6182004-05-05 06:28:16 +000096 if (nbytes / sizeof(PyObject *) != (size_t)size)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return PyErr_NoMemory();
Raymond Hettinger0468e412004-05-05 05:37:53 +000098 if (num_free_lists) {
99 num_free_lists--;
100 op = free_lists[num_free_lists];
101 _Py_NewReference((PyObject *)op);
102 } else {
103 op = PyObject_GC_New(PyListObject, &PyList_Type);
104 if (op == NULL)
105 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 }
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000107 if (size <= 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108 op->ob_item = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000111 if (op->ob_item == NULL) {
112 Py_DECREF(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 return PyErr_NoMemory();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000114 }
Tim Peters3986d4e2004-07-29 02:28:42 +0000115 memset(op->ob_item, 0, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000117 Py_SIZE(op) = size;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000118 op->allocated = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000119 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000124PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 if (!PyList_Check(op)) {
127 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return -1;
129 }
130 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000131 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000134static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000137PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 if (!PyList_Check(op)) {
140 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141 return NULL;
142 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000143 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000144 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000145 indexerr = PyUnicode_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 "list index out of range");
147 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 return NULL;
149 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151}
152
153int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000154PyList_SetItem(register PyObject *op, register Py_ssize_t i,
Fred Drakea2f55112000-07-09 15:16:51 +0000155 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 register PyObject *olditem;
158 register PyObject **p;
159 if (!PyList_Check(op)) {
160 Py_XDECREF(newitem);
161 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000162 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000164 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 Py_XDECREF(newitem);
166 PyErr_SetString(PyExc_IndexError,
167 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000168 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000171 olditem = *p;
172 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 return 0;
175}
176
177static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000178ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
Christian Heimes90aa7642007-12-19 02:45:37 +0000180 Py_ssize_t i, n = Py_SIZE(self);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000182 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000184 return -1;
185 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000186 if (n == PY_SSIZE_T_MAX) {
Trent Micka5846642000-08-13 22:47:45 +0000187 PyErr_SetString(PyExc_OverflowError,
188 "cannot add more objects to list");
189 return -1;
190 }
Tim Petersb38e2b62004-07-29 02:29:26 +0000191
Raymond Hettingerd4ff7412004-03-15 09:01:31 +0000192 if (list_resize(self, n+1) == -1)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000193 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000194
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000195 if (where < 0) {
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000196 where += n;
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000197 if (where < 0)
198 where = 0;
199 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000200 if (where > n)
201 where = n;
202 items = self->ob_item;
203 for (i = n; --i >= where; )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 items[where] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 return 0;
208}
209
210int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000211PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 if (!PyList_Check(op)) {
214 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000215 return -1;
216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218}
219
Raymond Hettinger40a03822004-04-12 13:05:09 +0000220static int
221app1(PyListObject *self, PyObject *v)
222{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000224
225 assert (v != NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000226 if (n == PY_SSIZE_T_MAX) {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000227 PyErr_SetString(PyExc_OverflowError,
228 "cannot add more objects to list");
229 return -1;
230 }
231
232 if (list_resize(self, n+1) == -1)
233 return -1;
234
235 Py_INCREF(v);
236 PyList_SET_ITEM(self, n, v);
237 return 0;
238}
239
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240int
Fred Drakea2f55112000-07-09 15:16:51 +0000241PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242{
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000243 if (PyList_Check(op) && (newitem != NULL))
244 return app1((PyListObject *)op, newitem);
245 PyErr_BadInternalCall();
246 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
249/* Methods */
250
251static void
Fred Drakea2f55112000-07-09 15:16:51 +0000252list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254 Py_ssize_t i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000255 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000256 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000257 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000258 /* Do it backwards, for Christian Tismer.
259 There's a simple test case where somehow this reduces
260 thrashing when a *very* large list is created and
261 immediately deleted. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000262 i = Py_SIZE(op);
Guido van Rossumfa717011999-06-09 15:19:34 +0000263 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000265 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000266 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000267 }
Raymond Hettinger0468e412004-05-05 05:37:53 +0000268 if (num_free_lists < MAXFREELISTS && PyList_CheckExact(op))
269 free_lists[num_free_lists++] = op;
Tim Petersb38e2b62004-07-29 02:29:26 +0000270 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000271 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000272 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273}
274
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000276list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000278 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000279 PyObject *s, *temp;
280 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000281
282 i = Py_ReprEnter((PyObject*)v);
283 if (i != 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000284 return i > 0 ? PyUnicode_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000285 }
Tim Petersa7259592001-06-16 05:11:17 +0000286
Christian Heimes90aa7642007-12-19 02:45:37 +0000287 if (Py_SIZE(v) == 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000288 result = PyUnicode_FromString("[]");
Tim Petersa7259592001-06-16 05:11:17 +0000289 goto Done;
290 }
291
292 pieces = PyList_New(0);
293 if (pieces == NULL)
294 goto Done;
295
296 /* Do repr() on each element. Note that this may mutate the list,
297 so must refetch the list size on each iteration. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000298 for (i = 0; i < Py_SIZE(v); ++i) {
Tim Petersa7259592001-06-16 05:11:17 +0000299 int status;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000300 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
301 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000302 s = PyObject_Repr(v->ob_item[i]);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000303 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000304 if (s == NULL)
305 goto Done;
306 status = PyList_Append(pieces, s);
307 Py_DECREF(s); /* append created a new ref */
308 if (status < 0)
309 goto Done;
310 }
311
312 /* Add "[]" decorations to the first and last items. */
313 assert(PyList_GET_SIZE(pieces) > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000314 s = PyUnicode_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000315 if (s == NULL)
316 goto Done;
317 temp = PyList_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000318 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000319 PyList_SET_ITEM(pieces, 0, s);
320 if (s == NULL)
321 goto Done;
322
Walter Dörwald1ab83302007-05-18 17:15:44 +0000323 s = PyUnicode_FromString("]");
Tim Petersa7259592001-06-16 05:11:17 +0000324 if (s == NULL)
325 goto Done;
326 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000327 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000328 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
329 if (temp == NULL)
330 goto Done;
331
332 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000333 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000334 if (s == NULL)
335 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000336 result = PyUnicode_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000337 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000338
339Done:
340 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000341 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000342 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
Martin v. Löwis18e16552006-02-15 17:27:45 +0000345static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000346list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347{
Christian Heimes90aa7642007-12-19 02:45:37 +0000348 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
350
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000351static int
Fred Drakea2f55112000-07-09 15:16:51 +0000352list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000353{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000354 Py_ssize_t i;
355 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000356
Christian Heimes90aa7642007-12-19 02:45:37 +0000357 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
Raymond Hettingeraae59992002-09-05 14:23:49 +0000358 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000359 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000360 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000361}
362
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000364list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365{
Christian Heimes90aa7642007-12-19 02:45:37 +0000366 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000367 if (indexerr == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000368 indexerr = PyUnicode_FromString(
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 "list index out of range");
370 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 return NULL;
372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 return a->ob_item[i];
375}
376
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000378list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000381 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383 if (ilow < 0)
384 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000385 else if (ilow > Py_SIZE(a))
386 ilow = Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 if (ihigh < ilow)
388 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000389 else if (ihigh > Py_SIZE(a))
390 ihigh = Py_SIZE(a);
Raymond Hettinger99842b62004-03-08 05:56:15 +0000391 len = ihigh - ilow;
392 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 if (np == NULL)
394 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000395
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000396 src = a->ob_item + ilow;
397 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000398 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000399 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000401 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000407PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000408{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 if (!PyList_Check(a)) {
410 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000411 return NULL;
412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000414}
415
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000417list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000419 Py_ssize_t size;
420 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000421 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyListObject *np;
423 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000424 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000425 "can only concatenate list (not \"%.200s\") to list",
426 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 return NULL;
428 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429#define b ((PyListObject *)bb)
Christian Heimes90aa7642007-12-19 02:45:37 +0000430 size = Py_SIZE(a) + Py_SIZE(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000431 if (size < 0)
432 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000435 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000437 src = a->ob_item;
438 dest = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000439 for (i = 0; i < Py_SIZE(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000440 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000442 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000444 src = b->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000445 dest = np->ob_item + Py_SIZE(a);
446 for (i = 0; i < Py_SIZE(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000447 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000449 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452#undef b
453}
454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000457{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000458 Py_ssize_t i, j;
459 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000461 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000462 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000463 if (n < 0)
464 n = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000465 size = Py_SIZE(a) * n;
466 if (n && size/n != Py_SIZE(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000467 return PyErr_NoMemory();
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000468 if (size == 0)
469 return PyList_New(0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000471 if (np == NULL)
472 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000473
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000474 items = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000475 if (Py_SIZE(a) == 1) {
Raymond Hettinger6624e682003-05-21 05:58:46 +0000476 elem = a->ob_item[0];
477 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000478 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000479 Py_INCREF(elem);
480 }
481 return (PyObject *) np;
482 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000483 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000484 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000485 for (i = 0; i < n; i++) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000486 for (j = 0; j < Py_SIZE(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000487 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000489 p++;
490 }
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000493}
494
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495static int
Armin Rigo93677f02004-07-29 12:40:23 +0000496list_clear(PyListObject *a)
497{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000498 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000499 PyObject **item = a->ob_item;
500 if (item != NULL) {
501 /* Because XDECREF can recursively invoke operations on
502 this list, we make it empty first. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000503 i = Py_SIZE(a);
504 Py_SIZE(a) = 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000505 a->ob_item = NULL;
506 a->allocated = 0;
507 while (--i >= 0) {
508 Py_XDECREF(item[i]);
509 }
510 PyMem_FREE(item);
511 }
512 /* Never fails; the return value can be ignored.
513 Note that there is no guarantee that the list is actually empty
514 at this point, because XDECREF may have populated it again! */
515 return 0;
516}
517
Tim Peters8fc4a912004-07-31 21:53:19 +0000518/* a[ilow:ihigh] = v if v != NULL.
519 * del a[ilow:ihigh] if v == NULL.
520 *
521 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
522 * guaranteed the call cannot fail.
523 */
Armin Rigo93677f02004-07-29 12:40:23 +0000524static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000525list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000527 /* Because [X]DECREF can recursively invoke list operations on
528 this list, we must postpone all [X]DECREF activity until
529 after the list is back in its canonical shape. Therefore
530 we must allocate an additional array, 'recycle', into which
531 we temporarily copy the items that are deleted from the
532 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000533 PyObject *recycle_on_stack[8];
534 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000536 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000537 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000538 Py_ssize_t n; /* # of elements in replacement list */
539 Py_ssize_t norig; /* # of elements in list getting replaced */
540 Py_ssize_t d; /* Change in size */
541 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000542 size_t s;
543 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545 if (v == NULL)
546 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000547 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000548 if (a == b) {
549 /* Special case "a[i:j] = a" -- copy b first */
Christian Heimes90aa7642007-12-19 02:45:37 +0000550 v = list_slice(b, 0, Py_SIZE(b));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000551 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000552 return result;
553 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000555 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000556 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000557 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000558 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000559 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000560 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000561 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000562 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 if (ilow < 0)
564 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000565 else if (ilow > Py_SIZE(a))
566 ilow = Py_SIZE(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000567
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568 if (ihigh < ilow)
569 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000570 else if (ihigh > Py_SIZE(a))
571 ihigh = Py_SIZE(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000572
Tim Peters8d9eb102004-07-31 02:24:20 +0000573 norig = ihigh - ilow;
574 assert(norig >= 0);
575 d = n - norig;
Christian Heimes90aa7642007-12-19 02:45:37 +0000576 if (Py_SIZE(a) + d == 0) {
Armin Rigo93677f02004-07-29 12:40:23 +0000577 Py_XDECREF(v_as_SF);
578 return list_clear(a);
579 }
580 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000581 /* recycle the items that we are about to remove */
582 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000583 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000584 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000585 if (recycle == NULL) {
586 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000587 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000588 }
589 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000590 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000591
Armin Rigo1dd04a02004-07-30 11:38:22 +0000592 if (d < 0) { /* Delete -d items */
593 memmove(&item[ihigh+d], &item[ihigh],
Christian Heimes90aa7642007-12-19 02:45:37 +0000594 (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
595 list_resize(a, Py_SIZE(a) + d);
Armin Rigo1dd04a02004-07-30 11:38:22 +0000596 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000598 else if (d > 0) { /* Insert d items */
Christian Heimes90aa7642007-12-19 02:45:37 +0000599 k = Py_SIZE(a);
Tim Peters73572222004-07-31 02:54:42 +0000600 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000601 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000602 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000603 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000604 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605 }
606 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000607 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609 item[ilow] = w;
610 }
Tim Peters73572222004-07-31 02:54:42 +0000611 for (k = norig - 1; k >= 0; --k)
612 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000613 result = 0;
614 Error:
Tim Peters73572222004-07-31 02:54:42 +0000615 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000616 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000617 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000618 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619#undef b
620}
621
Guido van Rossum234f9421993-06-17 12:35:49 +0000622int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000623PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000624{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 if (!PyList_Check(a)) {
626 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000627 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000628 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000630}
631
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000632static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000633list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000634{
635 PyObject **items;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000636 Py_ssize_t size, i, j, p, newsize;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000637
638
639 size = PyList_GET_SIZE(self);
640 if (size == 0) {
641 Py_INCREF(self);
642 return (PyObject *)self;
643 }
644
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000645 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000646 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000647 Py_INCREF(self);
648 return (PyObject *)self;
649 }
650
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000651 newsize = size * n;
652 if (newsize/n != size)
653 return PyErr_NoMemory();
654 if (list_resize(self, newsize) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000655 return NULL;
656
657 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000658 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000659 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
660 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000661 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000662 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000663 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000664 }
665 }
666 Py_INCREF(self);
667 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000668}
669
Guido van Rossum4a450d01991-04-03 19:05:18 +0000670static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000672{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 PyObject *old_value;
Christian Heimes90aa7642007-12-19 02:45:37 +0000674 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyErr_SetString(PyExc_IndexError,
676 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000677 return -1;
678 }
679 if (v == NULL)
680 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000682 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000683 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000684 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000685 return 0;
686}
687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000689listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000691 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000693 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000695 if (ins1(self, i, v) == 0)
696 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000697 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698}
699
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000701listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000703 if (app1(self, v) == 0)
704 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000705 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000706}
707
Barry Warsawdedf6d61998-10-09 16:37:25 +0000708static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000709listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000711 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000712 Py_ssize_t m; /* size of self */
713 Py_ssize_t n; /* guess for size of b */
714 Py_ssize_t mn; /* m + n */
715 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000716 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000717
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000718 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000719 1) lists and tuples which can use PySequence_Fast ops
720 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000721 */
722 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000723 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000724 b = PySequence_Fast(b, "argument must be iterable");
725 if (!b)
726 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000727 n = PySequence_Fast_GET_SIZE(b);
728 if (n == 0) {
729 /* short circuit when b is empty */
730 Py_DECREF(b);
731 Py_RETURN_NONE;
732 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000733 m = Py_SIZE(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000734 if (list_resize(self, m + n) == -1) {
735 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000736 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000737 }
738 /* note that we may still have self == b here for the
739 * situation a.extend(a), but the following code works
740 * in that case too. Just make sure to resize self
741 * before calling PySequence_Fast_ITEMS.
742 */
743 /* populate the end of self with b's items */
744 src = PySequence_Fast_ITEMS(b);
745 dest = self->ob_item + m;
746 for (i = 0; i < n; i++) {
747 PyObject *o = src[i];
748 Py_INCREF(o);
749 dest[i] = o;
750 }
751 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000752 Py_RETURN_NONE;
753 }
754
755 it = PyObject_GetIter(b);
756 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000757 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000758 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000760 /* Guess a result list size. */
Christian Heimes255f53b2007-12-08 15:33:56 +0000761 n = _PyObject_LengthHint(b, 8);
Christian Heimes90aa7642007-12-19 02:45:37 +0000762 m = Py_SIZE(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000763 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000764 if (mn >= m) {
765 /* Make room. */
766 if (list_resize(self, mn) == -1)
767 goto error;
768 /* Make the list sane again. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000769 Py_SIZE(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000770 }
771 /* Else m + n overflowed; on the chance that n lied, and there really
772 * is enough room, ignore it. If n was telling the truth, we'll
773 * eventually run out of memory during the loop.
774 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000775
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000776 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000777 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000778 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000779 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000780 if (PyErr_Occurred()) {
781 if (PyErr_ExceptionMatches(PyExc_StopIteration))
782 PyErr_Clear();
783 else
784 goto error;
785 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000786 break;
787 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000788 if (Py_SIZE(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000789 /* steals ref */
Christian Heimes90aa7642007-12-19 02:45:37 +0000790 PyList_SET_ITEM(self, Py_SIZE(self), item);
791 ++Py_SIZE(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000792 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000793 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000794 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000795 Py_DECREF(item); /* append creates a new ref */
796 if (status < 0)
797 goto error;
798 }
799 }
800
801 /* Cut back result list if initial guess was too large. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000802 if (Py_SIZE(self) < self->allocated)
803 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000804
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000805 Py_DECREF(it);
806 Py_RETURN_NONE;
807
808 error:
809 Py_DECREF(it);
810 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000811}
812
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000813PyObject *
814_PyList_Extend(PyListObject *self, PyObject *b)
815{
816 return listextend(self, b);
817}
818
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000819static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000820list_inplace_concat(PyListObject *self, PyObject *other)
821{
822 PyObject *result;
823
824 result = listextend(self, other);
825 if (result == NULL)
826 return result;
827 Py_DECREF(result);
828 Py_INCREF(self);
829 return (PyObject *)self;
830}
831
832static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000833listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000834{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000835 Py_ssize_t i = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000836 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000837 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000838
Thomas Wouters89f507f2006-12-13 04:49:30 +0000839 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000840 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000841
Christian Heimes90aa7642007-12-19 02:45:37 +0000842 if (Py_SIZE(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000843 /* Special-case most common failure cause */
844 PyErr_SetString(PyExc_IndexError, "pop from empty list");
845 return NULL;
846 }
847 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000848 i += Py_SIZE(self);
849 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000850 PyErr_SetString(PyExc_IndexError, "pop index out of range");
851 return NULL;
852 }
853 v = self->ob_item[i];
Christian Heimes90aa7642007-12-19 02:45:37 +0000854 if (i == Py_SIZE(self) - 1) {
855 status = list_resize(self, Py_SIZE(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000856 assert(status >= 0);
857 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000858 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000859 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000860 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
861 assert(status >= 0);
862 /* Use status, so that in a release build compilers don't
863 * complain about the unused name.
864 */
Brett Cannon651dd522004-08-08 21:21:18 +0000865 (void) status;
866
867 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000868}
869
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000870/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
871static void
872reverse_slice(PyObject **lo, PyObject **hi)
873{
874 assert(lo && hi);
875
876 --hi;
877 while (lo < hi) {
878 PyObject *t = *lo;
879 *lo = *hi;
880 *hi = t;
881 ++lo;
882 --hi;
883 }
884}
885
Tim Petersa64dc242002-08-01 02:13:36 +0000886/* Lots of code for an adaptive, stable, natural mergesort. There are many
887 * pieces to this algorithm; read listsort.txt for overviews and details.
888 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000889
Guido van Rossum3f236de1996-12-10 23:55:39 +0000890/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000891 * comparison function (any callable Python object), which must not be
892 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
893 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000894 * Returns -1 on error, 1 if x < y, 0 if x >= y.
895 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000896static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000897islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000898{
Tim Petersf2a04732002-07-11 21:46:16 +0000899 PyObject *res;
900 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000901 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000902
Tim Peters66860f62002-08-04 17:47:26 +0000903 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000904 /* Call the user's comparison function and translate the 3-way
905 * result into true or false (or error).
906 */
Tim Petersf2a04732002-07-11 21:46:16 +0000907 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000908 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000909 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000910 Py_INCREF(x);
911 Py_INCREF(y);
912 PyTuple_SET_ITEM(args, 0, x);
913 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000914 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000916 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000917 return -1;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000918 if (!PyLong_CheckExact(res)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 PyErr_Format(PyExc_TypeError,
920 "comparison function must return int, not %.200s",
921 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000923 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000924 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000925 i = PyLong_AsLong(res);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 Py_DECREF(res);
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000927 if (i == -1 && PyErr_Occurred()) {
928 /* Overflow in long conversion. */
929 return -1;
930 }
Tim Petersa8c974c2002-07-19 03:30:57 +0000931 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000932}
933
Tim Peters66860f62002-08-04 17:47:26 +0000934/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
935 * islt. This avoids a layer of function call in the usual case, and
936 * sorting does many comparisons.
937 * Returns -1 on error, 1 if x < y, 0 if x >= y.
938 */
939#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
940 PyObject_RichCompareBool(X, Y, Py_LT) : \
941 islt(X, Y, COMPARE))
942
943/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000944 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
945 started. It makes more sense in context <wink>. X and Y are PyObject*s.
946*/
Tim Peters66860f62002-08-04 17:47:26 +0000947#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000948 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000949
950/* binarysort is the best method for sorting small arrays: it does
951 few compares, but can do data movement quadratic in the number of
952 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000953 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000954 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000955 On entry, must have lo <= start <= hi, and that [lo, start) is already
956 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000957 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000958 Even in case of error, the output slice will be some permutation of
959 the input (nothing is lost or duplicated).
960*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000961static int
Fred Drakea2f55112000-07-09 15:16:51 +0000962binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
963 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000964{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000965 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000966 register PyObject **l, **p, **r;
967 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000968
Tim Petersa8c974c2002-07-19 03:30:57 +0000969 assert(lo <= start && start <= hi);
970 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000971 if (lo == start)
972 ++start;
973 for (; start < hi; ++start) {
974 /* set l to where *start belongs */
975 l = lo;
976 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000977 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000978 /* Invariants:
979 * pivot >= all in [lo, l).
980 * pivot < all in [r, start).
981 * The second is vacuously true at the start.
982 */
983 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000984 do {
985 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000986 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000987 r = p;
988 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000989 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000990 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000991 assert(l == r);
992 /* The invariants still hold, so pivot >= all in [lo, l) and
993 pivot < all in [l, start), so pivot belongs at l. Note
994 that if there are elements equal to pivot, l points to the
995 first slot after them -- that's why this sort is stable.
996 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000997 Caution: using memmove is much slower under MSVC 5;
998 we're not usually moving many slots. */
999 for (p = start; p > l; --p)
1000 *p = *(p-1);
1001 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001002 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001003 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001004
1005 fail:
1006 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001007}
1008
Tim Petersa64dc242002-08-01 02:13:36 +00001009/*
1010Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1011is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001012
Tim Petersa64dc242002-08-01 02:13:36 +00001013 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001014
Tim Petersa64dc242002-08-01 02:13:36 +00001015or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001016
Tim Petersa64dc242002-08-01 02:13:36 +00001017 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001018
Tim Petersa64dc242002-08-01 02:13:36 +00001019Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1020For its intended use in a stable mergesort, the strictness of the defn of
1021"descending" is needed so that the caller can safely reverse a descending
1022sequence without violating stability (strict > ensures there are no equal
1023elements to get out of order).
1024
1025Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001026*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001027static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001028count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001029{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001030 Py_ssize_t k;
1031 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001032
Tim Petersa64dc242002-08-01 02:13:36 +00001033 assert(lo < hi);
1034 *descending = 0;
1035 ++lo;
1036 if (lo == hi)
1037 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001038
Tim Petersa64dc242002-08-01 02:13:36 +00001039 n = 2;
1040 IFLT(*lo, *(lo-1)) {
1041 *descending = 1;
1042 for (lo = lo+1; lo < hi; ++lo, ++n) {
1043 IFLT(*lo, *(lo-1))
1044 ;
1045 else
1046 break;
1047 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001048 }
Tim Petersa64dc242002-08-01 02:13:36 +00001049 else {
1050 for (lo = lo+1; lo < hi; ++lo, ++n) {
1051 IFLT(*lo, *(lo-1))
1052 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001053 }
1054 }
1055
Tim Petersa64dc242002-08-01 02:13:36 +00001056 return n;
1057fail:
1058 return -1;
1059}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001060
Tim Petersa64dc242002-08-01 02:13:36 +00001061/*
1062Locate the proper position of key in a sorted vector; if the vector contains
1063an element equal to key, return the position immediately to the left of
1064the leftmost equal element. [gallop_right() does the same except returns
1065the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001066
Tim Petersa64dc242002-08-01 02:13:36 +00001067"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001068
Tim Petersa64dc242002-08-01 02:13:36 +00001069"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1070hint is to the final result, the faster this runs.
1071
1072The return value is the int k in 0..n such that
1073
1074 a[k-1] < key <= a[k]
1075
1076pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1077key belongs at index k; or, IOW, the first k elements of a should precede
1078key, and the last n-k should follow key.
1079
1080Returns -1 on error. See listsort.txt for info on the method.
1081*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001082static Py_ssize_t
1083gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001084{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001085 Py_ssize_t ofs;
1086 Py_ssize_t lastofs;
1087 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001088
1089 assert(key && a && n > 0 && hint >= 0 && hint < n);
1090
1091 a += hint;
1092 lastofs = 0;
1093 ofs = 1;
1094 IFLT(*a, key) {
1095 /* a[hint] < key -- gallop right, until
1096 * a[hint + lastofs] < key <= a[hint + ofs]
1097 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001098 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001099 while (ofs < maxofs) {
1100 IFLT(a[ofs], key) {
1101 lastofs = ofs;
1102 ofs = (ofs << 1) + 1;
1103 if (ofs <= 0) /* int overflow */
1104 ofs = maxofs;
1105 }
1106 else /* key <= a[hint + ofs] */
1107 break;
1108 }
1109 if (ofs > maxofs)
1110 ofs = maxofs;
1111 /* Translate back to offsets relative to &a[0]. */
1112 lastofs += hint;
1113 ofs += hint;
1114 }
1115 else {
1116 /* key <= a[hint] -- gallop left, until
1117 * a[hint - ofs] < key <= a[hint - lastofs]
1118 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001119 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001120 while (ofs < maxofs) {
1121 IFLT(*(a-ofs), key)
1122 break;
1123 /* key <= a[hint - ofs] */
1124 lastofs = ofs;
1125 ofs = (ofs << 1) + 1;
1126 if (ofs <= 0) /* int overflow */
1127 ofs = maxofs;
1128 }
1129 if (ofs > maxofs)
1130 ofs = maxofs;
1131 /* Translate back to positive offsets relative to &a[0]. */
1132 k = lastofs;
1133 lastofs = hint - ofs;
1134 ofs = hint - k;
1135 }
1136 a -= hint;
1137
1138 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1139 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1140 * right of lastofs but no farther right than ofs. Do a binary
1141 * search, with invariant a[lastofs-1] < key <= a[ofs].
1142 */
1143 ++lastofs;
1144 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001145 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001146
1147 IFLT(a[m], key)
1148 lastofs = m+1; /* a[m] < key */
1149 else
1150 ofs = m; /* key <= a[m] */
1151 }
1152 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1153 return ofs;
1154
1155fail:
1156 return -1;
1157}
1158
1159/*
1160Exactly like gallop_left(), except that if key already exists in a[0:n],
1161finds the position immediately to the right of the rightmost equal value.
1162
1163The return value is the int k in 0..n such that
1164
1165 a[k-1] <= key < a[k]
1166
1167or -1 if error.
1168
1169The code duplication is massive, but this is enough different given that
1170we're sticking to "<" comparisons that it's much harder to follow if
1171written as one routine with yet another "left or right?" flag.
1172*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001173static Py_ssize_t
1174gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001175{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001176 Py_ssize_t ofs;
1177 Py_ssize_t lastofs;
1178 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001179
1180 assert(key && a && n > 0 && hint >= 0 && hint < n);
1181
1182 a += hint;
1183 lastofs = 0;
1184 ofs = 1;
1185 IFLT(key, *a) {
1186 /* key < a[hint] -- gallop left, until
1187 * a[hint - ofs] <= key < a[hint - lastofs]
1188 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001189 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001190 while (ofs < maxofs) {
1191 IFLT(key, *(a-ofs)) {
1192 lastofs = ofs;
1193 ofs = (ofs << 1) + 1;
1194 if (ofs <= 0) /* int overflow */
1195 ofs = maxofs;
1196 }
1197 else /* a[hint - ofs] <= key */
1198 break;
1199 }
1200 if (ofs > maxofs)
1201 ofs = maxofs;
1202 /* Translate back to positive offsets relative to &a[0]. */
1203 k = lastofs;
1204 lastofs = hint - ofs;
1205 ofs = hint - k;
1206 }
1207 else {
1208 /* a[hint] <= key -- gallop right, until
1209 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001210 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001211 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001212 while (ofs < maxofs) {
1213 IFLT(key, a[ofs])
1214 break;
1215 /* a[hint + ofs] <= key */
1216 lastofs = ofs;
1217 ofs = (ofs << 1) + 1;
1218 if (ofs <= 0) /* int overflow */
1219 ofs = maxofs;
1220 }
1221 if (ofs > maxofs)
1222 ofs = maxofs;
1223 /* Translate back to offsets relative to &a[0]. */
1224 lastofs += hint;
1225 ofs += hint;
1226 }
1227 a -= hint;
1228
1229 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1230 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1231 * right of lastofs but no farther right than ofs. Do a binary
1232 * search, with invariant a[lastofs-1] <= key < a[ofs].
1233 */
1234 ++lastofs;
1235 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001236 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001237
1238 IFLT(key, a[m])
1239 ofs = m; /* key < a[m] */
1240 else
1241 lastofs = m+1; /* a[m] <= key */
1242 }
1243 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1244 return ofs;
1245
1246fail:
1247 return -1;
1248}
1249
1250/* The maximum number of entries in a MergeState's pending-runs stack.
1251 * This is enough to sort arrays of size up to about
1252 * 32 * phi ** MAX_MERGE_PENDING
1253 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1254 * with 2**64 elements.
1255 */
1256#define MAX_MERGE_PENDING 85
1257
Tim Peterse05f65a2002-08-10 05:21:15 +00001258/* When we get into galloping mode, we stay there until both runs win less
1259 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001260 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001261#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001262
1263/* Avoid malloc for small temp arrays. */
1264#define MERGESTATE_TEMP_SIZE 256
1265
1266/* One MergeState exists on the stack per invocation of mergesort. It's just
1267 * a convenient way to pass state around among the helper functions.
1268 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001269struct s_slice {
1270 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001271 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001272};
1273
Tim Petersa64dc242002-08-01 02:13:36 +00001274typedef struct s_MergeState {
1275 /* The user-supplied comparison function. or NULL if none given. */
1276 PyObject *compare;
1277
Tim Peterse05f65a2002-08-10 05:21:15 +00001278 /* This controls when we get *into* galloping mode. It's initialized
1279 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1280 * random data, and lower for highly structured data.
1281 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001282 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001283
Tim Petersa64dc242002-08-01 02:13:36 +00001284 /* 'a' is temp storage to help with merges. It contains room for
1285 * alloced entries.
1286 */
1287 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001288 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001289
1290 /* A stack of n pending runs yet to be merged. Run #i starts at
1291 * address base[i] and extends for len[i] elements. It's always
1292 * true (so long as the indices are in bounds) that
1293 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001294 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001295 *
1296 * so we could cut the storage for this, but it's a minor amount,
1297 * and keeping all the info explicit simplifies the code.
1298 */
1299 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001300 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001301
1302 /* 'a' points to this when possible, rather than muck with malloc. */
1303 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1304} MergeState;
1305
1306/* Conceptually a MergeState's constructor. */
1307static void
1308merge_init(MergeState *ms, PyObject *compare)
1309{
1310 assert(ms != NULL);
1311 ms->compare = compare;
1312 ms->a = ms->temparray;
1313 ms->alloced = MERGESTATE_TEMP_SIZE;
1314 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001315 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001316}
1317
1318/* Free all the temp memory owned by the MergeState. This must be called
1319 * when you're done with a MergeState, and may be called before then if
1320 * you want to free the temp memory early.
1321 */
1322static void
1323merge_freemem(MergeState *ms)
1324{
1325 assert(ms != NULL);
1326 if (ms->a != ms->temparray)
1327 PyMem_Free(ms->a);
1328 ms->a = ms->temparray;
1329 ms->alloced = MERGESTATE_TEMP_SIZE;
1330}
1331
1332/* Ensure enough temp memory for 'need' array slots is available.
1333 * Returns 0 on success and -1 if the memory can't be gotten.
1334 */
1335static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001336merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001337{
1338 assert(ms != NULL);
1339 if (need <= ms->alloced)
1340 return 0;
1341 /* Don't realloc! That can cost cycles to copy the old data, but
1342 * we don't care what's in the block.
1343 */
1344 merge_freemem(ms);
1345 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1346 if (ms->a) {
1347 ms->alloced = need;
1348 return 0;
1349 }
1350 PyErr_NoMemory();
1351 merge_freemem(ms); /* reset to sane state */
1352 return -1;
1353}
1354#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1355 merge_getmem(MS, NEED))
1356
1357/* Merge the na elements starting at pa with the nb elements starting at pb
1358 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1359 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1360 * merge, and should have na <= nb. See listsort.txt for more info.
1361 * Return 0 if successful, -1 if error.
1362 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001363static Py_ssize_t
1364merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1365 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001366{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001367 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001368 PyObject *compare;
1369 PyObject **dest;
1370 int result = -1; /* guilty until proved innocent */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001371 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001372
1373 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1374 if (MERGE_GETMEM(ms, na) < 0)
1375 return -1;
1376 memcpy(ms->a, pa, na * sizeof(PyObject*));
1377 dest = pa;
1378 pa = ms->a;
1379
1380 *dest++ = *pb++;
1381 --nb;
1382 if (nb == 0)
1383 goto Succeed;
1384 if (na == 1)
1385 goto CopyB;
1386
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001387 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001388 compare = ms->compare;
1389 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001390 Py_ssize_t acount = 0; /* # of times A won in a row */
1391 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001392
1393 /* Do the straightforward thing until (if ever) one run
1394 * appears to win consistently.
1395 */
1396 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001397 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001398 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001399 if (k) {
1400 if (k < 0)
1401 goto Fail;
1402 *dest++ = *pb++;
1403 ++bcount;
1404 acount = 0;
1405 --nb;
1406 if (nb == 0)
1407 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001408 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001409 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001410 }
1411 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001412 *dest++ = *pa++;
1413 ++acount;
1414 bcount = 0;
1415 --na;
1416 if (na == 1)
1417 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001418 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001419 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001420 }
Tim Petersa64dc242002-08-01 02:13:36 +00001421 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001422
Tim Petersa64dc242002-08-01 02:13:36 +00001423 /* One run is winning so consistently that galloping may
1424 * be a huge win. So try that, and continue galloping until
1425 * (if ever) neither run appears to be winning consistently
1426 * anymore.
1427 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001428 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001429 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001430 assert(na > 1 && nb > 0);
1431 min_gallop -= min_gallop > 1;
1432 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001433 k = gallop_right(*pb, pa, na, 0, compare);
1434 acount = k;
1435 if (k) {
1436 if (k < 0)
1437 goto Fail;
1438 memcpy(dest, pa, k * sizeof(PyObject *));
1439 dest += k;
1440 pa += k;
1441 na -= k;
1442 if (na == 1)
1443 goto CopyB;
1444 /* na==0 is impossible now if the comparison
1445 * function is consistent, but we can't assume
1446 * that it is.
1447 */
1448 if (na == 0)
1449 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001450 }
Tim Petersa64dc242002-08-01 02:13:36 +00001451 *dest++ = *pb++;
1452 --nb;
1453 if (nb == 0)
1454 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001455
Tim Petersa64dc242002-08-01 02:13:36 +00001456 k = gallop_left(*pa, pb, nb, 0, compare);
1457 bcount = k;
1458 if (k) {
1459 if (k < 0)
1460 goto Fail;
1461 memmove(dest, pb, k * sizeof(PyObject *));
1462 dest += k;
1463 pb += k;
1464 nb -= k;
1465 if (nb == 0)
1466 goto Succeed;
1467 }
1468 *dest++ = *pa++;
1469 --na;
1470 if (na == 1)
1471 goto CopyB;
1472 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001473 ++min_gallop; /* penalize it for leaving galloping mode */
1474 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001475 }
1476Succeed:
1477 result = 0;
1478Fail:
1479 if (na)
1480 memcpy(dest, pa, na * sizeof(PyObject*));
1481 return result;
1482CopyB:
1483 assert(na == 1 && nb > 0);
1484 /* The last element of pa belongs at the end of the merge. */
1485 memmove(dest, pb, nb * sizeof(PyObject *));
1486 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001487 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001488}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001489
Tim Petersa64dc242002-08-01 02:13:36 +00001490/* Merge the na elements starting at pa with the nb elements starting at pb
1491 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1492 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1493 * merge, and should have na >= nb. See listsort.txt for more info.
1494 * Return 0 if successful, -1 if error.
1495 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001496static Py_ssize_t
1497merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001498{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001499 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001500 PyObject *compare;
1501 PyObject **dest;
1502 int result = -1; /* guilty until proved innocent */
1503 PyObject **basea;
1504 PyObject **baseb;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001505 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001506
1507 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1508 if (MERGE_GETMEM(ms, nb) < 0)
1509 return -1;
1510 dest = pb + nb - 1;
1511 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1512 basea = pa;
1513 baseb = ms->a;
1514 pb = ms->a + nb - 1;
1515 pa += na - 1;
1516
1517 *dest-- = *pa--;
1518 --na;
1519 if (na == 0)
1520 goto Succeed;
1521 if (nb == 1)
1522 goto CopyA;
1523
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001524 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001525 compare = ms->compare;
1526 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001527 Py_ssize_t acount = 0; /* # of times A won in a row */
1528 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001529
1530 /* Do the straightforward thing until (if ever) one run
1531 * appears to win consistently.
1532 */
1533 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001534 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001535 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001536 if (k) {
1537 if (k < 0)
1538 goto Fail;
1539 *dest-- = *pa--;
1540 ++acount;
1541 bcount = 0;
1542 --na;
1543 if (na == 0)
1544 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001545 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001546 break;
1547 }
1548 else {
1549 *dest-- = *pb--;
1550 ++bcount;
1551 acount = 0;
1552 --nb;
1553 if (nb == 1)
1554 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001555 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001556 break;
1557 }
1558 }
1559
1560 /* One run is winning so consistently that galloping may
1561 * be a huge win. So try that, and continue galloping until
1562 * (if ever) neither run appears to be winning consistently
1563 * anymore.
1564 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001565 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001566 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001567 assert(na > 0 && nb > 1);
1568 min_gallop -= min_gallop > 1;
1569 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001570 k = gallop_right(*pb, basea, na, na-1, compare);
1571 if (k < 0)
1572 goto Fail;
1573 k = na - k;
1574 acount = k;
1575 if (k) {
1576 dest -= k;
1577 pa -= k;
1578 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1579 na -= k;
1580 if (na == 0)
1581 goto Succeed;
1582 }
1583 *dest-- = *pb--;
1584 --nb;
1585 if (nb == 1)
1586 goto CopyA;
1587
1588 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1589 if (k < 0)
1590 goto Fail;
1591 k = nb - k;
1592 bcount = k;
1593 if (k) {
1594 dest -= k;
1595 pb -= k;
1596 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1597 nb -= k;
1598 if (nb == 1)
1599 goto CopyA;
1600 /* nb==0 is impossible now if the comparison
1601 * function is consistent, but we can't assume
1602 * that it is.
1603 */
1604 if (nb == 0)
1605 goto Succeed;
1606 }
1607 *dest-- = *pa--;
1608 --na;
1609 if (na == 0)
1610 goto Succeed;
1611 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001612 ++min_gallop; /* penalize it for leaving galloping mode */
1613 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001614 }
1615Succeed:
1616 result = 0;
1617Fail:
1618 if (nb)
1619 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1620 return result;
1621CopyA:
1622 assert(nb == 1 && na > 0);
1623 /* The first element of pb belongs at the front of the merge. */
1624 dest -= na;
1625 pa -= na;
1626 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1627 *dest = *pb;
1628 return 0;
1629}
1630
1631/* Merge the two runs at stack indices i and i+1.
1632 * Returns 0 on success, -1 on error.
1633 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001634static Py_ssize_t
1635merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001636{
1637 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001638 Py_ssize_t na, nb;
1639 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001640 PyObject *compare;
1641
1642 assert(ms != NULL);
1643 assert(ms->n >= 2);
1644 assert(i >= 0);
1645 assert(i == ms->n - 2 || i == ms->n - 3);
1646
Tim Peterse05f65a2002-08-10 05:21:15 +00001647 pa = ms->pending[i].base;
1648 na = ms->pending[i].len;
1649 pb = ms->pending[i+1].base;
1650 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001651 assert(na > 0 && nb > 0);
1652 assert(pa + na == pb);
1653
1654 /* Record the length of the combined runs; if i is the 3rd-last
1655 * run now, also slide over the last run (which isn't involved
1656 * in this merge). The current run i+1 goes away in any case.
1657 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001658 ms->pending[i].len = na + nb;
1659 if (i == ms->n - 3)
1660 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001661 --ms->n;
1662
1663 /* Where does b start in a? Elements in a before that can be
1664 * ignored (already in place).
1665 */
1666 compare = ms->compare;
1667 k = gallop_right(*pb, pa, na, 0, compare);
1668 if (k < 0)
1669 return -1;
1670 pa += k;
1671 na -= k;
1672 if (na == 0)
1673 return 0;
1674
1675 /* Where does a end in b? Elements in b after that can be
1676 * ignored (already in place).
1677 */
1678 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1679 if (nb <= 0)
1680 return nb;
1681
1682 /* Merge what remains of the runs, using a temp array with
1683 * min(na, nb) elements.
1684 */
1685 if (na <= nb)
1686 return merge_lo(ms, pa, na, pb, nb);
1687 else
1688 return merge_hi(ms, pa, na, pb, nb);
1689}
1690
1691/* Examine the stack of runs waiting to be merged, merging adjacent runs
1692 * until the stack invariants are re-established:
1693 *
1694 * 1. len[-3] > len[-2] + len[-1]
1695 * 2. len[-2] > len[-1]
1696 *
1697 * See listsort.txt for more info.
1698 *
1699 * Returns 0 on success, -1 on error.
1700 */
1701static int
1702merge_collapse(MergeState *ms)
1703{
Tim Peterse05f65a2002-08-10 05:21:15 +00001704 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001705
1706 assert(ms);
1707 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001708 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001709 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1710 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001711 --n;
1712 if (merge_at(ms, n) < 0)
1713 return -1;
1714 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001715 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001716 if (merge_at(ms, n) < 0)
1717 return -1;
1718 }
1719 else
1720 break;
1721 }
1722 return 0;
1723}
1724
1725/* Regardless of invariants, merge all runs on the stack until only one
1726 * remains. This is used at the end of the mergesort.
1727 *
1728 * Returns 0 on success, -1 on error.
1729 */
1730static int
1731merge_force_collapse(MergeState *ms)
1732{
Tim Peterse05f65a2002-08-10 05:21:15 +00001733 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001734
1735 assert(ms);
1736 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001737 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001738 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001739 --n;
1740 if (merge_at(ms, n) < 0)
1741 return -1;
1742 }
1743 return 0;
1744}
1745
1746/* Compute a good value for the minimum run length; natural runs shorter
1747 * than this are boosted artificially via binary insertion.
1748 *
1749 * If n < 64, return n (it's too small to bother with fancy stuff).
1750 * Else if n is an exact power of 2, return 32.
1751 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1752 * strictly less than, an exact power of 2.
1753 *
1754 * See listsort.txt for more info.
1755 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001756static Py_ssize_t
1757merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001758{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001759 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001760
1761 assert(n >= 0);
1762 while (n >= 64) {
1763 r |= n & 1;
1764 n >>= 1;
1765 }
1766 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001767}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001768
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001769/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001770 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001771 which is returned during the undecorate phase. By exposing only the key
1772 during comparisons, the underlying sort stability characteristics are left
1773 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001774 the key instead of a full record. */
1775
1776typedef struct {
1777 PyObject_HEAD
1778 PyObject *key;
1779 PyObject *value;
1780} sortwrapperobject;
1781
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001782PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001783static PyObject *
1784sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1785static void
1786sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001787
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001788PyTypeObject PySortWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001789 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001790 "sortwrapper", /* tp_name */
1791 sizeof(sortwrapperobject), /* tp_basicsize */
1792 0, /* tp_itemsize */
1793 /* methods */
1794 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1795 0, /* tp_print */
1796 0, /* tp_getattr */
1797 0, /* tp_setattr */
1798 0, /* tp_compare */
1799 0, /* tp_repr */
1800 0, /* tp_as_number */
1801 0, /* tp_as_sequence */
1802 0, /* tp_as_mapping */
1803 0, /* tp_hash */
1804 0, /* tp_call */
1805 0, /* tp_str */
1806 PyObject_GenericGetAttr, /* tp_getattro */
1807 0, /* tp_setattro */
1808 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001809 Py_TPFLAGS_DEFAULT, /* tp_flags */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001810 sortwrapper_doc, /* tp_doc */
1811 0, /* tp_traverse */
1812 0, /* tp_clear */
1813 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1814};
1815
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001816
1817static PyObject *
1818sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1819{
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001820 if (!PyObject_TypeCheck(b, &PySortWrapper_Type)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001821 PyErr_SetString(PyExc_TypeError,
1822 "expected a sortwrapperobject");
1823 return NULL;
1824 }
1825 return PyObject_RichCompare(a->key, b->key, op);
1826}
1827
1828static void
1829sortwrapper_dealloc(sortwrapperobject *so)
1830{
1831 Py_XDECREF(so->key);
1832 Py_XDECREF(so->value);
1833 PyObject_Del(so);
1834}
1835
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001836/* Returns a new reference to a sortwrapper.
1837 Consumes the references to the two underlying objects. */
1838
1839static PyObject *
1840build_sortwrapper(PyObject *key, PyObject *value)
1841{
1842 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001843
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001844 so = PyObject_New(sortwrapperobject, &PySortWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001845 if (so == NULL)
1846 return NULL;
1847 so->key = key;
1848 so->value = value;
1849 return (PyObject *)so;
1850}
1851
1852/* Returns a new reference to the value underlying the wrapper. */
1853static PyObject *
1854sortwrapper_getvalue(PyObject *so)
1855{
1856 PyObject *value;
1857
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001858 if (!PyObject_TypeCheck(so, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001859 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001860 "expected a sortwrapperobject");
1861 return NULL;
1862 }
1863 value = ((sortwrapperobject *)so)->value;
1864 Py_INCREF(value);
1865 return value;
1866}
1867
1868/* Wrapper for user specified cmp functions in combination with a
1869 specified key function. Makes sure the cmp function is presented
1870 with the actual key instead of the sortwrapper */
1871
1872typedef struct {
1873 PyObject_HEAD
1874 PyObject *func;
1875} cmpwrapperobject;
1876
1877static void
1878cmpwrapper_dealloc(cmpwrapperobject *co)
1879{
1880 Py_XDECREF(co->func);
1881 PyObject_Del(co);
1882}
1883
1884static PyObject *
1885cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1886{
1887 PyObject *x, *y, *xx, *yy;
1888
1889 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1890 return NULL;
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001891 if (!PyObject_TypeCheck(x, &PySortWrapper_Type) ||
1892 !PyObject_TypeCheck(y, &PySortWrapper_Type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001893 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001894 "expected a sortwrapperobject");
1895 return NULL;
1896 }
1897 xx = ((sortwrapperobject *)x)->key;
1898 yy = ((sortwrapperobject *)y)->key;
1899 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1900}
1901
1902PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1903
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001904PyTypeObject PyCmpWrapper_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001905 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001906 "cmpwrapper", /* tp_name */
1907 sizeof(cmpwrapperobject), /* tp_basicsize */
1908 0, /* tp_itemsize */
1909 /* methods */
1910 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1911 0, /* tp_print */
1912 0, /* tp_getattr */
1913 0, /* tp_setattr */
1914 0, /* tp_compare */
1915 0, /* tp_repr */
1916 0, /* tp_as_number */
1917 0, /* tp_as_sequence */
1918 0, /* tp_as_mapping */
1919 0, /* tp_hash */
1920 (ternaryfunc)cmpwrapper_call, /* tp_call */
1921 0, /* tp_str */
1922 PyObject_GenericGetAttr, /* tp_getattro */
1923 0, /* tp_setattro */
1924 0, /* tp_as_buffer */
1925 Py_TPFLAGS_DEFAULT, /* tp_flags */
1926 cmpwrapper_doc, /* tp_doc */
1927};
1928
1929static PyObject *
1930build_cmpwrapper(PyObject *cmpfunc)
1931{
1932 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001933
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001934 co = PyObject_New(cmpwrapperobject, &PyCmpWrapper_Type);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001935 if (co == NULL)
1936 return NULL;
1937 Py_INCREF(cmpfunc);
1938 co->func = cmpfunc;
1939 return (PyObject *)co;
1940}
1941
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001942static int
1943is_default_cmp(PyObject *cmpfunc)
1944{
1945 PyCFunctionObject *f;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001946 const char *module;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001947 if (cmpfunc == NULL || cmpfunc == Py_None)
1948 return 1;
1949 if (!PyCFunction_Check(cmpfunc))
1950 return 0;
Guido van Rossumf1624cd2006-08-24 23:43:52 +00001951 f = (PyCFunctionObject *)cmpfunc;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001952 if (f->m_self != NULL)
1953 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001954 if (!PyUnicode_Check(f->m_module))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001955 return 0;
Neal Norwitzed2b7392007-08-26 04:51:10 +00001956 module = PyUnicode_AsString(f->m_module);
1957 if (module == NULL)
1958 return 0;
Georg Brandl1a3284e2007-12-02 09:40:06 +00001959 if (strcmp(module, "builtins") != 0)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001960 return 0;
1961 if (strcmp(f->m_ml->ml_name, "cmp") != 0)
1962 return 0;
1963 return 1;
1964}
1965
Tim Petersa64dc242002-08-01 02:13:36 +00001966/* An adaptive, stable, natural mergesort. See listsort.txt.
1967 * Returns Py_None on success, NULL on error. Even in case of error, the
1968 * list will be some permutation of its input state (nothing is lost or
1969 * duplicated).
1970 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001971static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001972listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001973{
Tim Petersa64dc242002-08-01 02:13:36 +00001974 MergeState ms;
1975 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001976 Py_ssize_t nremaining;
1977 Py_ssize_t minrun;
1978 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001979 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001980 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001981 PyObject *compare = NULL;
1982 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001983 int reverse = 0;
1984 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001985 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001986 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001987 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001988
Tim Petersa64dc242002-08-01 02:13:36 +00001989 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001990 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001991 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001992 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
1993 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001994 return NULL;
1995 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001996 if (is_default_cmp(compare))
Skip Montanaro4abd5f02003-01-02 20:51:08 +00001997 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001998 if (keyfunc == Py_None)
1999 keyfunc = NULL;
2000 if (compare != NULL && keyfunc != NULL) {
2001 compare = build_cmpwrapper(compare);
2002 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002003 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002004 } else
2005 Py_XINCREF(compare);
2006
Tim Petersb9099c32002-11-12 22:08:10 +00002007 /* The list is temporarily made empty, so that mutations performed
2008 * by comparison functions can't affect the slice of memory we're
2009 * sorting (allowing mutations during sorting is a core-dump
2010 * factory, since ob_item may change).
2011 */
Christian Heimes90aa7642007-12-19 02:45:37 +00002012 saved_ob_size = Py_SIZE(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002013 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002014 saved_allocated = self->allocated;
Christian Heimes90aa7642007-12-19 02:45:37 +00002015 Py_SIZE(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002016 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002017 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002018
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002019 if (keyfunc != NULL) {
2020 for (i=0 ; i < saved_ob_size ; i++) {
2021 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002022 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002023 NULL);
2024 if (key == NULL) {
2025 for (i=i-1 ; i>=0 ; i--) {
2026 kvpair = saved_ob_item[i];
2027 value = sortwrapper_getvalue(kvpair);
2028 saved_ob_item[i] = value;
2029 Py_DECREF(kvpair);
2030 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002031 goto dsu_fail;
2032 }
2033 kvpair = build_sortwrapper(key, value);
2034 if (kvpair == NULL)
2035 goto dsu_fail;
2036 saved_ob_item[i] = kvpair;
2037 }
2038 }
2039
2040 /* Reverse sort stability achieved by initially reversing the list,
2041 applying a stable forward sort, then reversing the final result. */
2042 if (reverse && saved_ob_size > 1)
2043 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2044
2045 merge_init(&ms, compare);
2046
Tim Petersb9099c32002-11-12 22:08:10 +00002047 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002048 if (nremaining < 2)
2049 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002050
Tim Petersa64dc242002-08-01 02:13:36 +00002051 /* March over the array once, left to right, finding natural runs,
2052 * and extending short natural runs to minrun elements.
2053 */
Tim Petersb9099c32002-11-12 22:08:10 +00002054 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002055 hi = lo + nremaining;
2056 minrun = merge_compute_minrun(nremaining);
2057 do {
2058 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002059 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002060
Tim Petersa64dc242002-08-01 02:13:36 +00002061 /* Identify next run. */
2062 n = count_run(lo, hi, compare, &descending);
2063 if (n < 0)
2064 goto fail;
2065 if (descending)
2066 reverse_slice(lo, lo + n);
2067 /* If short, extend to min(minrun, nremaining). */
2068 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002069 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002070 nremaining : minrun;
2071 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2072 goto fail;
2073 n = force;
2074 }
2075 /* Push run onto pending-runs stack, and maybe merge. */
2076 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002077 ms.pending[ms.n].base = lo;
2078 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002079 ++ms.n;
2080 if (merge_collapse(&ms) < 0)
2081 goto fail;
2082 /* Advance to find next run. */
2083 lo += n;
2084 nremaining -= n;
2085 } while (nremaining);
2086 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002087
Tim Petersa64dc242002-08-01 02:13:36 +00002088 if (merge_force_collapse(&ms) < 0)
2089 goto fail;
2090 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002091 assert(ms.pending[0].base == saved_ob_item);
2092 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002093
2094succeed:
2095 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002096fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002097 if (keyfunc != NULL) {
2098 for (i=0 ; i < saved_ob_size ; i++) {
2099 kvpair = saved_ob_item[i];
2100 value = sortwrapper_getvalue(kvpair);
2101 saved_ob_item[i] = value;
2102 Py_DECREF(kvpair);
2103 }
2104 }
2105
Armin Rigo93677f02004-07-29 12:40:23 +00002106 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002107 /* The user mucked with the list during the sort,
2108 * and we don't already have another error to report.
2109 */
2110 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2111 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002112 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002113
2114 if (reverse && saved_ob_size > 1)
2115 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2116
2117 merge_freemem(&ms);
2118
2119dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002120 final_ob_item = self->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +00002121 i = Py_SIZE(self);
2122 Py_SIZE(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002123 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002124 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002125 if (final_ob_item != NULL) {
2126 /* we cannot use list_clear() for this because it does not
2127 guarantee that the list is really empty when it returns */
2128 while (--i >= 0) {
2129 Py_XDECREF(final_ob_item[i]);
2130 }
2131 PyMem_FREE(final_ob_item);
2132 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002133 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002134 Py_XINCREF(result);
2135 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002136}
Tim Peters330f9e92002-07-19 07:05:44 +00002137#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002138#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002139
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002140int
Fred Drakea2f55112000-07-09 15:16:51 +00002141PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002142{
2143 if (v == NULL || !PyList_Check(v)) {
2144 PyErr_BadInternalCall();
2145 return -1;
2146 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002147 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002148 if (v == NULL)
2149 return -1;
2150 Py_DECREF(v);
2151 return 0;
2152}
2153
Guido van Rossumb86c5492001-02-12 22:06:02 +00002154static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002155listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002156{
Christian Heimes90aa7642007-12-19 02:45:37 +00002157 if (Py_SIZE(self) > 1)
2158 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002159 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002160}
2161
Guido van Rossum84c76f51990-10-30 13:32:20 +00002162int
Fred Drakea2f55112000-07-09 15:16:51 +00002163PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002164{
Tim Peters6063e262002-08-08 01:06:39 +00002165 PyListObject *self = (PyListObject *)v;
2166
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002167 if (v == NULL || !PyList_Check(v)) {
2168 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002169 return -1;
2170 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002171 if (Py_SIZE(self) > 1)
2172 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002173 return 0;
2174}
2175
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002176PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002177PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002178{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002179 PyObject *w;
Christian Heimes2c181612007-12-17 20:04:13 +00002180 PyObject **p, **q;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002181 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002182 if (v == NULL || !PyList_Check(v)) {
2183 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002184 return NULL;
2185 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002186 n = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002188 if (w == NULL)
2189 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002190 p = ((PyTupleObject *)w)->ob_item;
Christian Heimes2c181612007-12-17 20:04:13 +00002191 q = ((PyListObject *)v)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002192 while (--n >= 0) {
Christian Heimes2c181612007-12-17 20:04:13 +00002193 Py_INCREF(*q);
2194 *p = *q;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002195 p++;
Christian Heimes2c181612007-12-17 20:04:13 +00002196 q++;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002197 }
2198 return w;
2199}
2200
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002201static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002202listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002203{
Christian Heimes90aa7642007-12-19 02:45:37 +00002204 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002205 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002206
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002207 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2208 _PyEval_SliceIndex, &start,
2209 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002210 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002211 if (start < 0) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002212 start += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002213 if (start < 0)
2214 start = 0;
2215 }
2216 if (stop < 0) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002217 stop += Py_SIZE(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002218 if (stop < 0)
2219 stop = 0;
2220 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002221 for (i = start; i < stop && i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002222 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2223 if (cmp > 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002224 return PyLong_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002225 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002226 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002228 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002229 return NULL;
2230}
2231
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002232static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002233listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002234{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002235 Py_ssize_t count = 0;
2236 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002237
Christian Heimes90aa7642007-12-19 02:45:37 +00002238 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002239 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2240 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002241 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002242 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002243 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002244 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002245 return PyLong_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002246}
2247
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002248static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002249listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002250{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002251 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002252
Christian Heimes90aa7642007-12-19 02:45:37 +00002253 for (i = 0; i < Py_SIZE(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002254 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2255 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002256 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002257 (PyObject *)NULL) == 0)
2258 Py_RETURN_NONE;
2259 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002260 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002261 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002262 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002263 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002264 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002265 return NULL;
2266}
2267
Jeremy Hylton8caad492000-06-23 14:18:11 +00002268static int
2269list_traverse(PyListObject *o, visitproc visit, void *arg)
2270{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002271 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002272
Christian Heimes90aa7642007-12-19 02:45:37 +00002273 for (i = Py_SIZE(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002274 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002275 return 0;
2276}
2277
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002278static PyObject *
2279list_richcompare(PyObject *v, PyObject *w, int op)
2280{
2281 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002282 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002283
2284 if (!PyList_Check(v) || !PyList_Check(w)) {
2285 Py_INCREF(Py_NotImplemented);
2286 return Py_NotImplemented;
2287 }
2288
2289 vl = (PyListObject *)v;
2290 wl = (PyListObject *)w;
2291
Christian Heimes90aa7642007-12-19 02:45:37 +00002292 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002293 /* Shortcut: if the lengths differ, the lists differ */
2294 PyObject *res;
2295 if (op == Py_EQ)
2296 res = Py_False;
2297 else
2298 res = Py_True;
2299 Py_INCREF(res);
2300 return res;
2301 }
2302
2303 /* Search for the first index where items are different */
Christian Heimes90aa7642007-12-19 02:45:37 +00002304 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002305 int k = PyObject_RichCompareBool(vl->ob_item[i],
2306 wl->ob_item[i], Py_EQ);
2307 if (k < 0)
2308 return NULL;
2309 if (!k)
2310 break;
2311 }
2312
Christian Heimes90aa7642007-12-19 02:45:37 +00002313 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002314 /* No more items to compare -- compare sizes */
Christian Heimes90aa7642007-12-19 02:45:37 +00002315 Py_ssize_t vs = Py_SIZE(vl);
2316 Py_ssize_t ws = Py_SIZE(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002317 int cmp;
2318 PyObject *res;
2319 switch (op) {
2320 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002321 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002322 case Py_EQ: cmp = vs == ws; break;
2323 case Py_NE: cmp = vs != ws; break;
2324 case Py_GT: cmp = vs > ws; break;
2325 case Py_GE: cmp = vs >= ws; break;
2326 default: return NULL; /* cannot happen */
2327 }
2328 if (cmp)
2329 res = Py_True;
2330 else
2331 res = Py_False;
2332 Py_INCREF(res);
2333 return res;
2334 }
2335
2336 /* We have an item that differs -- shortcuts for EQ/NE */
2337 if (op == Py_EQ) {
2338 Py_INCREF(Py_False);
2339 return Py_False;
2340 }
2341 if (op == Py_NE) {
2342 Py_INCREF(Py_True);
2343 return Py_True;
2344 }
2345
2346 /* Compare the final item again using the proper operator */
2347 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2348}
2349
Tim Peters6d6c1a32001-08-02 04:15:00 +00002350static int
2351list_init(PyListObject *self, PyObject *args, PyObject *kw)
2352{
2353 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002354 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002355
2356 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2357 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002358
2359 /* Verify list invariants established by PyType_GenericAlloc() */
Christian Heimes90aa7642007-12-19 02:45:37 +00002360 assert(0 <= Py_SIZE(self));
2361 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002362 assert(self->ob_item != NULL ||
2363 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002364
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002365 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002366 if (self->ob_item != NULL) {
2367 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002368 }
2369 if (arg != NULL) {
2370 PyObject *rv = listextend(self, arg);
2371 if (rv == NULL)
2372 return -1;
2373 Py_DECREF(rv);
2374 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002375 return 0;
2376}
2377
Raymond Hettinger1021c442003-11-07 15:38:09 +00002378static PyObject *list_iter(PyObject *seq);
2379static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2380
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002381PyDoc_STRVAR(getitem_doc,
2382"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002383PyDoc_STRVAR(reversed_doc,
2384"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002385PyDoc_STRVAR(append_doc,
2386"L.append(object) -- append object to end");
2387PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002388"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002389PyDoc_STRVAR(insert_doc,
2390"L.insert(index, object) -- insert object before index");
2391PyDoc_STRVAR(pop_doc,
2392"L.pop([index]) -> item -- remove and return item at index (default last)");
2393PyDoc_STRVAR(remove_doc,
2394"L.remove(value) -- remove first occurrence of value");
2395PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002396"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002397PyDoc_STRVAR(count_doc,
2398"L.count(value) -> integer -- return number of occurrences of value");
2399PyDoc_STRVAR(reverse_doc,
2400"L.reverse() -- reverse *IN PLACE*");
2401PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002402"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2403cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002404
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002405static PyObject *list_subscript(PyListObject*, PyObject*);
2406
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002407static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002408 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002409 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002410 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002411 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002412 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002413 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002414 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002415 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002416 {"count", (PyCFunction)listcount, METH_O, count_doc},
2417 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002418 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002419 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002420};
2421
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002422static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002423 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002424 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002425 (ssizeargfunc)list_repeat, /* sq_repeat */
2426 (ssizeargfunc)list_item, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002427 0, /* sq_slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002428 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002429 0, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002430 (objobjproc)list_contains, /* sq_contains */
2431 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002432 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002433};
2434
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002435PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002436"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002437"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002438
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002439static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002440list_subscript(PyListObject* self, PyObject* item)
2441{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002442 if (PyIndex_Check(item)) {
2443 Py_ssize_t i;
2444 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002445 if (i == -1 && PyErr_Occurred())
2446 return NULL;
2447 if (i < 0)
2448 i += PyList_GET_SIZE(self);
2449 return list_item(self, i);
2450 }
2451 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002452 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002453 PyObject* result;
2454 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002455 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002456
Christian Heimes90aa7642007-12-19 02:45:37 +00002457 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002458 &start, &stop, &step, &slicelength) < 0) {
2459 return NULL;
2460 }
2461
2462 if (slicelength <= 0) {
2463 return PyList_New(0);
2464 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002465 else if (step == 1) {
2466 return list_slice(self, start, stop);
2467 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002468 else {
2469 result = PyList_New(slicelength);
2470 if (!result) return NULL;
2471
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002472 src = self->ob_item;
2473 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002474 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002475 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002476 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002477 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002478 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002479 }
Tim Peters3b01a122002-07-19 02:35:45 +00002480
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002481 return result;
2482 }
2483 }
2484 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002485 PyErr_Format(PyExc_TypeError,
2486 "list indices must be integers, not %.200s",
2487 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002488 return NULL;
2489 }
2490}
2491
Tim Peters3b01a122002-07-19 02:35:45 +00002492static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002493list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2494{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002495 if (PyIndex_Check(item)) {
2496 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002497 if (i == -1 && PyErr_Occurred())
2498 return -1;
2499 if (i < 0)
2500 i += PyList_GET_SIZE(self);
2501 return list_ass_item(self, i, value);
2502 }
2503 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002504 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002505
Christian Heimes90aa7642007-12-19 02:45:37 +00002506 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002507 &start, &stop, &step, &slicelength) < 0) {
2508 return -1;
2509 }
2510
Thomas Woutersed03b412007-08-28 21:37:11 +00002511 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002512 return list_ass_slice(self, start, stop, value);
2513
Thomas Woutersed03b412007-08-28 21:37:11 +00002514 /* Make sure s[5:2] = [..] inserts at the right place:
2515 before 5, not before 2. */
2516 if ((step < 0 && start < stop) ||
2517 (step > 0 && start > stop))
2518 stop = start;
2519
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002520 if (value == NULL) {
2521 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002522 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002523 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002524
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002525 if (slicelength <= 0)
2526 return 0;
2527
2528 if (step < 0) {
2529 stop = start + 1;
2530 start = stop + step*(slicelength - 1) - 1;
2531 step = -step;
2532 }
2533
2534 garbage = (PyObject**)
2535 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002536 if (!garbage) {
2537 PyErr_NoMemory();
2538 return -1;
2539 }
Tim Peters3b01a122002-07-19 02:35:45 +00002540
Thomas Woutersed03b412007-08-28 21:37:11 +00002541 /* drawing pictures might help understand these for
2542 loops. Basically, we memmove the parts of the
2543 list that are *not* part of the slice: step-1
2544 items for each item that is part of the slice,
2545 and then tail end of the list that was not
2546 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002547 for (cur = start, i = 0;
2548 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002549 cur += step, i++) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002550 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002551
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002552 garbage[i] = PyList_GET_ITEM(self, cur);
2553
Christian Heimes90aa7642007-12-19 02:45:37 +00002554 if (cur + step >= Py_SIZE(self)) {
2555 lim = Py_SIZE(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002556 }
2557
Tim Petersb38e2b62004-07-29 02:29:26 +00002558 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002559 self->ob_item + cur + 1,
2560 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002561 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002562 cur = start + slicelength*step;
Christian Heimes90aa7642007-12-19 02:45:37 +00002563 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002564 memmove(self->ob_item + cur - slicelength,
2565 self->ob_item + cur,
Christian Heimes90aa7642007-12-19 02:45:37 +00002566 (Py_SIZE(self) - cur) *
Thomas Woutersed03b412007-08-28 21:37:11 +00002567 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002568 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002569
Christian Heimes90aa7642007-12-19 02:45:37 +00002570 Py_SIZE(self) -= slicelength;
2571 list_resize(self, Py_SIZE(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002572
2573 for (i = 0; i < slicelength; i++) {
2574 Py_DECREF(garbage[i]);
2575 }
2576 PyMem_FREE(garbage);
2577
2578 return 0;
2579 }
2580 else {
2581 /* assign slice */
Thomas Woutersed03b412007-08-28 21:37:11 +00002582 PyObject *ins, *seq;
2583 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002584 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002585
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002586 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002587 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002588 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002589 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002590 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002591 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002592 seq = PySequence_Fast(value,
Thomas Woutersed03b412007-08-28 21:37:11 +00002593 "must assign iterable "
2594 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002595 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002596 if (!seq)
2597 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002598
2599 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2600 PyErr_Format(PyExc_ValueError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002601 "attempt to assign sequence of "
2602 "size %zd to extended slice of "
2603 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002604 PySequence_Fast_GET_SIZE(seq),
2605 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002606 Py_DECREF(seq);
2607 return -1;
2608 }
2609
2610 if (!slicelength) {
2611 Py_DECREF(seq);
2612 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002613 }
2614
2615 garbage = (PyObject**)
2616 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002617 if (!garbage) {
2618 Py_DECREF(seq);
2619 PyErr_NoMemory();
2620 return -1;
2621 }
Tim Peters3b01a122002-07-19 02:35:45 +00002622
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002623 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002624 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002625 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002626 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002627 garbage[i] = selfitems[cur];
2628 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002629 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002630 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002631 }
2632
2633 for (i = 0; i < slicelength; i++) {
2634 Py_DECREF(garbage[i]);
2635 }
Tim Peters3b01a122002-07-19 02:35:45 +00002636
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002637 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002638 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002639
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002640 return 0;
2641 }
Tim Peters3b01a122002-07-19 02:35:45 +00002642 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002643 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 PyErr_Format(PyExc_TypeError,
2645 "list indices must be integers, not %.200s",
2646 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002647 return -1;
2648 }
2649}
2650
2651static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002652 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002653 (binaryfunc)list_subscript,
2654 (objobjargproc)list_ass_subscript
2655};
2656
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002657PyTypeObject PyList_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002658 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002659 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002660 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002661 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002662 (destructor)list_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002663 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002664 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002665 0, /* tp_setattr */
2666 0, /* tp_compare */
2667 (reprfunc)list_repr, /* tp_repr */
2668 0, /* tp_as_number */
2669 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002670 &list_as_mapping, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002671 0, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002672 0, /* tp_call */
2673 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002674 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002675 0, /* tp_setattro */
2676 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002677 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002678 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002679 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002680 (traverseproc)list_traverse, /* tp_traverse */
2681 (inquiry)list_clear, /* tp_clear */
2682 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002683 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002684 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002685 0, /* tp_iternext */
2686 list_methods, /* tp_methods */
2687 0, /* tp_members */
2688 0, /* tp_getset */
2689 0, /* tp_base */
2690 0, /* tp_dict */
2691 0, /* tp_descr_get */
2692 0, /* tp_descr_set */
2693 0, /* tp_dictoffset */
2694 (initproc)list_init, /* tp_init */
2695 PyType_GenericAlloc, /* tp_alloc */
2696 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002697 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002698};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002699
2700
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002701/*********************** List Iterator **************************/
2702
2703typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002704 PyObject_HEAD
2705 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002706 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002707} listiterobject;
2708
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002709static PyObject *list_iter(PyObject *);
2710static void listiter_dealloc(listiterobject *);
2711static int listiter_traverse(listiterobject *, visitproc, void *);
2712static PyObject *listiter_next(listiterobject *);
2713static PyObject *listiter_len(listiterobject *);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002714
Armin Rigof5b3e362006-02-11 21:32:43 +00002715PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002716
2717static PyMethodDef listiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002718 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002719 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002720};
2721
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002722PyTypeObject PyListIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002723 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002724 "list_iterator", /* tp_name */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002725 sizeof(listiterobject), /* tp_basicsize */
2726 0, /* tp_itemsize */
2727 /* methods */
2728 (destructor)listiter_dealloc, /* tp_dealloc */
2729 0, /* tp_print */
2730 0, /* tp_getattr */
2731 0, /* tp_setattr */
2732 0, /* tp_compare */
2733 0, /* tp_repr */
2734 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002735 0, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002736 0, /* tp_as_mapping */
2737 0, /* tp_hash */
2738 0, /* tp_call */
2739 0, /* tp_str */
2740 PyObject_GenericGetAttr, /* tp_getattro */
2741 0, /* tp_setattro */
2742 0, /* tp_as_buffer */
2743 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2744 0, /* tp_doc */
2745 (traverseproc)listiter_traverse, /* tp_traverse */
2746 0, /* tp_clear */
2747 0, /* tp_richcompare */
2748 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002749 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002750 (iternextfunc)listiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002751 listiter_methods, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002752 0, /* tp_members */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002753};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002754
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002755
2756static PyObject *
2757list_iter(PyObject *seq)
2758{
2759 listiterobject *it;
2760
2761 if (!PyList_Check(seq)) {
2762 PyErr_BadInternalCall();
2763 return NULL;
2764 }
2765 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2766 if (it == NULL)
2767 return NULL;
2768 it->it_index = 0;
2769 Py_INCREF(seq);
2770 it->it_seq = (PyListObject *)seq;
2771 _PyObject_GC_TRACK(it);
2772 return (PyObject *)it;
2773}
2774
2775static void
2776listiter_dealloc(listiterobject *it)
2777{
2778 _PyObject_GC_UNTRACK(it);
2779 Py_XDECREF(it->it_seq);
2780 PyObject_GC_Del(it);
2781}
2782
2783static int
2784listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2785{
2786 Py_VISIT(it->it_seq);
2787 return 0;
2788}
2789
2790static PyObject *
2791listiter_next(listiterobject *it)
2792{
2793 PyListObject *seq;
2794 PyObject *item;
2795
2796 assert(it != NULL);
2797 seq = it->it_seq;
2798 if (seq == NULL)
2799 return NULL;
2800 assert(PyList_Check(seq));
2801
2802 if (it->it_index < PyList_GET_SIZE(seq)) {
2803 item = PyList_GET_ITEM(seq, it->it_index);
2804 ++it->it_index;
2805 Py_INCREF(item);
2806 return item;
2807 }
2808
2809 Py_DECREF(seq);
2810 it->it_seq = NULL;
2811 return NULL;
2812}
2813
2814static PyObject *
2815listiter_len(listiterobject *it)
2816{
2817 Py_ssize_t len;
2818 if (it->it_seq) {
2819 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2820 if (len >= 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00002821 return PyLong_FromSsize_t(len);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002822 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002823 return PyLong_FromLong(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002824}
Raymond Hettinger1021c442003-11-07 15:38:09 +00002825/*********************** List Reverse Iterator **************************/
2826
2827typedef struct {
2828 PyObject_HEAD
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002829 Py_ssize_t it_index;
Raymond Hettinger001f2282003-11-08 11:58:44 +00002830 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002831} listreviterobject;
2832
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002833static PyObject *list_reversed(PyListObject *, PyObject *);
2834static void listreviter_dealloc(listreviterobject *);
2835static int listreviter_traverse(listreviterobject *, visitproc, void *);
2836static PyObject *listreviter_next(listreviterobject *);
2837static Py_ssize_t listreviter_len(listreviterobject *);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002838
2839static PySequenceMethods listreviter_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002840 (lenfunc)listreviter_len, /* sq_length */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002841 0, /* sq_concat */
2842};
2843
Raymond Hettinger1021c442003-11-07 15:38:09 +00002844PyTypeObject PyListRevIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002845 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002846 "list_reverseiterator", /* tp_name */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002847 sizeof(listreviterobject), /* tp_basicsize */
2848 0, /* tp_itemsize */
2849 /* methods */
2850 (destructor)listreviter_dealloc, /* tp_dealloc */
2851 0, /* tp_print */
2852 0, /* tp_getattr */
2853 0, /* tp_setattr */
2854 0, /* tp_compare */
2855 0, /* tp_repr */
2856 0, /* tp_as_number */
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002857 &listreviter_as_sequence, /* tp_as_sequence */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002858 0, /* tp_as_mapping */
2859 0, /* tp_hash */
2860 0, /* tp_call */
2861 0, /* tp_str */
2862 PyObject_GenericGetAttr, /* tp_getattro */
2863 0, /* tp_setattro */
2864 0, /* tp_as_buffer */
2865 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2866 0, /* tp_doc */
2867 (traverseproc)listreviter_traverse, /* tp_traverse */
2868 0, /* tp_clear */
2869 0, /* tp_richcompare */
2870 0, /* tp_weaklistoffset */
2871 PyObject_SelfIter, /* tp_iter */
2872 (iternextfunc)listreviter_next, /* tp_iternext */
2873 0,
2874};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002875
2876static PyObject *
2877list_reversed(PyListObject *seq, PyObject *unused)
2878{
2879 listreviterobject *it;
2880
2881 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2882 if (it == NULL)
2883 return NULL;
2884 assert(PyList_Check(seq));
2885 it->it_index = PyList_GET_SIZE(seq) - 1;
2886 Py_INCREF(seq);
2887 it->it_seq = seq;
2888 PyObject_GC_Track(it);
2889 return (PyObject *)it;
2890}
2891
2892static void
2893listreviter_dealloc(listreviterobject *it)
2894{
2895 PyObject_GC_UnTrack(it);
2896 Py_XDECREF(it->it_seq);
2897 PyObject_GC_Del(it);
2898}
2899
2900static int
2901listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2902{
2903 Py_VISIT(it->it_seq);
2904 return 0;
2905}
2906
2907static PyObject *
2908listreviter_next(listreviterobject *it)
2909{
2910 PyObject *item;
2911 Py_ssize_t index = it->it_index;
2912 PyListObject *seq = it->it_seq;
2913
2914 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2915 item = PyList_GET_ITEM(seq, index);
2916 it->it_index--;
2917 Py_INCREF(item);
2918 return item;
2919 }
2920 it->it_index = -1;
2921 if (seq != NULL) {
2922 it->it_seq = NULL;
2923 Py_DECREF(seq);
2924 }
2925 return NULL;
2926}
2927
2928static Py_ssize_t
2929listreviter_len(listreviterobject *it)
2930{
2931 Py_ssize_t len = it->it_index + 1;
2932 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2933 return 0;
2934 return len;
2935}
2936