blob: 7289be1286fdd47d2cc7f901edf727573844a2ff [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
Guido van Rossuma46d51d1995-01-26 22:59:43 +000011static int
Raymond Hettinger4bb95402004-02-13 11:36:39 +000012list_resize(PyListObject *self, int newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000013{
Raymond Hettinger4bb95402004-02-13 11:36:39 +000014 PyObject **items;
15 size_t _new_size;
Tim Peters65b8b842001-05-26 05:28:40 +000016
Raymond Hettinger4bb95402004-02-13 11:36:39 +000017 /* Bypass realloc() when a previous overallocation is large enough
18 to accommodate the newsize. If the newsize is 16 smaller than the
19 current size, then proceed with the realloc() to shrink the list.
20 */
21
22 if (self->allocated >= newsize &&
23 self->ob_size < newsize + 16 &&
24 self->ob_item != NULL) {
25 self->ob_size = newsize;
26 return 0;
27 }
28
29 /* This over-allocates proportional to the list size, making room
Tim Peters65b8b842001-05-26 05:28:40 +000030 * for additional growth. The over-allocation is mild, but is
31 * enough to give linear-time amortized behavior over a long
32 * sequence of appends() in the presence of a poorly-performing
Raymond Hettingerab517d22004-02-14 18:34:46 +000033 * system realloc().
34 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
Tim Peters65b8b842001-05-26 05:28:40 +000035 */
Raymond Hettingerab517d22004-02-14 18:34:46 +000036 _new_size = (newsize >> 3) + (self->ob_size < 8 ? 3 : 6) + newsize;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000037 items = self->ob_item;
38 if (_new_size <= ((~(size_t)0) / sizeof(PyObject *)))
39 PyMem_RESIZE(items, PyObject *, _new_size);
40 else
41 items = NULL;
42 if (items == NULL) {
43 PyErr_NoMemory();
44 return -1;
45 }
46 self->ob_item = items;
47 self->ob_size = newsize;
48 self->allocated = _new_size;
49 return 0;
50}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000051
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000053PyList_New(int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000056 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 return NULL;
60 }
Tim Peters7049d812004-01-18 20:31:02 +000061 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000062 /* Check for overflow */
Tim Peters7049d812004-01-18 20:31:02 +000063 if (nbytes / sizeof(PyObject *) != (size_t)size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000065 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000066 op = PyObject_GC_New(PyListObject, &PyList_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 if (op == NULL) {
Neil Schemenauere83c00e2001-08-29 23:54:21 +000068 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069 }
70 if (size <= 0) {
71 op->ob_item = NULL;
72 }
73 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +000074 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 if (op->ob_item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077 }
Tim Peters7049d812004-01-18 20:31:02 +000078 memset(op->ob_item, 0, sizeof(*op->ob_item) * size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000080 op->ob_size = size;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000081 op->allocated = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000082 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000083 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084}
85
86int
Fred Drakea2f55112000-07-09 15:16:51 +000087PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 if (!PyList_Check(op)) {
90 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091 return -1;
92 }
93 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095}
96
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +000098
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000100PyList_GetItem(PyObject *op, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 if (!PyList_Check(op)) {
103 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104 return NULL;
105 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000107 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 indexerr = PyString_FromString(
109 "list index out of range");
110 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 return NULL;
112 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114}
115
116int
Fred Drakea2f55112000-07-09 15:16:51 +0000117PyList_SetItem(register PyObject *op, register int i,
118 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 register PyObject *olditem;
121 register PyObject **p;
122 if (!PyList_Check(op)) {
123 Py_XDECREF(newitem);
124 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000125 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
128 Py_XDECREF(newitem);
129 PyErr_SetString(PyExc_IndexError,
130 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000131 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000134 olditem = *p;
135 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137 return 0;
138}
139
140static int
Fred Drakea2f55112000-07-09 15:16:51 +0000141ins1(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142{
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000143 int i, n = self->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000145 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000147 return -1;
148 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000149 if (n == INT_MAX) {
Trent Micka5846642000-08-13 22:47:45 +0000150 PyErr_SetString(PyExc_OverflowError,
151 "cannot add more objects to list");
152 return -1;
153 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000154
155 if (list_resize(self, n+1) == -1)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000156 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000157
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000158 if (where < 0) {
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000159 where += n;
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000160 if (where < 0)
161 where = 0;
162 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000163 if (where > n)
164 where = n;
165 items = self->ob_item;
166 for (i = n; --i >= where; )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 items[where] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170 return 0;
171}
172
173int
Fred Drakea2f55112000-07-09 15:16:51 +0000174PyList_Insert(PyObject *op, int where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 if (!PyList_Check(op)) {
177 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000178 return -1;
179 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181}
182
183int
Fred Drakea2f55112000-07-09 15:16:51 +0000184PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 if (!PyList_Check(op)) {
187 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000188 return -1;
189 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 return ins1((PyListObject *)op,
191 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192}
193
194/* Methods */
195
196static void
Fred Drakea2f55112000-07-09 15:16:51 +0000197list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198{
199 int i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000200 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000201 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000202 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000203 /* Do it backwards, for Christian Tismer.
204 There's a simple test case where somehow this reduces
205 thrashing when a *very* large list is created and
206 immediately deleted. */
207 i = op->ob_size;
208 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000210 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000211 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000212 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000213 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000214 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215}
216
Guido van Rossum90933611991-06-07 16:10:43 +0000217static int
Fred Drakea2f55112000-07-09 15:16:51 +0000218list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219{
220 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000221
222 i = Py_ReprEnter((PyObject*)op);
223 if (i != 0) {
224 if (i < 0)
225 return i;
226 fprintf(fp, "[...]");
227 return 0;
228 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000230 for (i = 0; i < op->ob_size; i++) {
231 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000233 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
234 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000235 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000236 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 }
238 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000239 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000240 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241}
242
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000244list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000247 PyObject *s, *temp;
248 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000249
250 i = Py_ReprEnter((PyObject*)v);
251 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000252 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000253 }
Tim Petersa7259592001-06-16 05:11:17 +0000254
255 if (v->ob_size == 0) {
256 result = PyString_FromString("[]");
257 goto Done;
258 }
259
260 pieces = PyList_New(0);
261 if (pieces == NULL)
262 goto Done;
263
264 /* Do repr() on each element. Note that this may mutate the list,
265 so must refetch the list size on each iteration. */
266 for (i = 0; i < v->ob_size; ++i) {
267 int status;
268 s = PyObject_Repr(v->ob_item[i]);
269 if (s == NULL)
270 goto Done;
271 status = PyList_Append(pieces, s);
272 Py_DECREF(s); /* append created a new ref */
273 if (status < 0)
274 goto Done;
275 }
276
277 /* Add "[]" decorations to the first and last items. */
278 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000280 if (s == NULL)
281 goto Done;
282 temp = PyList_GET_ITEM(pieces, 0);
283 PyString_ConcatAndDel(&s, temp);
284 PyList_SET_ITEM(pieces, 0, s);
285 if (s == NULL)
286 goto Done;
287
288 s = PyString_FromString("]");
289 if (s == NULL)
290 goto Done;
291 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
292 PyString_ConcatAndDel(&temp, s);
293 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
294 if (temp == NULL)
295 goto Done;
296
297 /* Paste them all together with ", " between. */
298 s = PyString_FromString(", ");
299 if (s == NULL)
300 goto Done;
301 result = _PyString_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000302 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000303
304Done:
305 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000306 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000307 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308}
309
310static int
Fred Drakea2f55112000-07-09 15:16:51 +0000311list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312{
313 return a->ob_size;
314}
315
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000316static int
Fred Drakea2f55112000-07-09 15:16:51 +0000317list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000318{
Raymond Hettingeraae59992002-09-05 14:23:49 +0000319 int i, cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000320
Raymond Hettingeraae59992002-09-05 14:23:49 +0000321 for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
322 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000323 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000324 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000325}
326
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000328list_item(PyListObject *a, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329{
330 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000331 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 indexerr = PyString_FromString(
333 "list index out of range");
334 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 return NULL;
336 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338 return a->ob_item[i];
339}
340
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000342list_slice(PyListObject *a, int ilow, int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345 int i;
346 if (ilow < 0)
347 ilow = 0;
348 else if (ilow > a->ob_size)
349 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350 if (ihigh < ilow)
351 ihigh = ilow;
352 else if (ihigh > a->ob_size)
353 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 if (np == NULL)
356 return NULL;
357 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyObject *v = a->ob_item[i];
359 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 np->ob_item[i - ilow] = v;
361 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000363}
364
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000366PyList_GetSlice(PyObject *a, int ilow, int ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000367{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 if (!PyList_Check(a)) {
369 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000370 return NULL;
371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000376list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377{
378 int size;
379 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 PyListObject *np;
381 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000382 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000383 "can only concatenate list (not \"%.200s\") to list",
384 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 return NULL;
386 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 size = a->ob_size + b->ob_size;
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000389 if (size < 0)
390 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000393 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394 }
395 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyObject *v = a->ob_item[i];
397 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 np->ob_item[i] = v;
399 }
400 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 PyObject *v = b->ob_item[i];
402 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403 np->ob_item[i + a->ob_size] = v;
404 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406#undef b
407}
408
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000410list_repeat(PyListObject *a, int n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000411{
412 int i, j;
413 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 PyListObject *np;
415 PyObject **p;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000416 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000417 if (n < 0)
418 n = 0;
419 size = a->ob_size * n;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000420 if (size == 0)
421 return PyList_New(0);
Guido van Rossumbfa5a142002-10-11 23:39:35 +0000422 if (n && size/n != a->ob_size)
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000423 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000425 if (np == NULL)
426 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000427
428 if (a->ob_size == 1) {
429 elem = a->ob_item[0];
430 for (i = 0; i < n; i++) {
431 np->ob_item[i] = elem;
432 Py_INCREF(elem);
433 }
434 return (PyObject *) np;
435 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000436 p = np->ob_item;
437 for (i = 0; i < n; i++) {
438 for (j = 0; j < a->ob_size; j++) {
439 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000441 p++;
442 }
443 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000445}
446
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447static int
Fred Drakea2f55112000-07-09 15:16:51 +0000448list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000450 /* Because [X]DECREF can recursively invoke list operations on
451 this list, we must postpone all [X]DECREF activity until
452 after the list is back in its canonical shape. Therefore
453 we must allocate an additional array, 'recycle', into which
454 we temporarily copy the items that are deleted from the
455 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 PyObject **recycle, **p;
457 PyObject **item;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000458 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 int n; /* Size of replacement list */
460 int d; /* Change in size */
461 int k; /* Loop index */
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000462 int s;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464 if (v == NULL)
465 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000466 else {
467 char msg[256];
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000468 if (a == b) {
469 /* Special case "a[i:j] = a" -- copy b first */
470 int ret;
Michael W. Hudsonda0a0672003-08-15 12:06:41 +0000471 v = list_slice(b, 0, b->ob_size);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000472 if (v == NULL)
473 return -1;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000474 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000476 return ret;
477 }
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000478
479 PyOS_snprintf(msg, sizeof(msg),
480 "must assign sequence"
481 " (not \"%.200s\") to slice",
482 v->ob_type->tp_name);
483 v_as_SF = PySequence_Fast(v, msg);
484 if(v_as_SF == NULL)
485 return -1;
486 n = PySequence_Fast_GET_SIZE(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000487 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488 if (ilow < 0)
489 ilow = 0;
490 else if (ilow > a->ob_size)
491 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492 if (ihigh < ilow)
493 ihigh = ilow;
494 else if (ihigh > a->ob_size)
495 ihigh = a->ob_size;
496 item = a->ob_item;
497 d = n - (ihigh-ilow);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000498 if (ihigh > ilow) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000500 if (recycle == NULL) {
501 PyErr_NoMemory();
502 return -1;
503 }
504 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000505 else
506 p = recycle = NULL;
507 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000509 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000510 if (d < 0) {
511 for (/*k = ihigh*/; k < a->ob_size; k++)
512 item[k+d] = item[k];
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000513 list_resize(a, a->ob_size + d);
514 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515 }
516 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000517 else { /* Insert d items; recycle ihigh-ilow items */
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000518 s = a->ob_size;
519 if (list_resize(a, s+d) == -1) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000520 if (recycle != NULL)
521 PyMem_DEL(recycle);
Raymond Hettinger2731ae42004-02-14 03:07:21 +0000522 return -1;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000523 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000524 item = a->ob_item;
525 for (k = s; --k >= ihigh; )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526 item[k+d] = item[k];
527 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000528 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000529 }
530 for (k = 0; k < n; k++, ilow++) {
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000531 PyObject *w = PySequence_Fast_GET_ITEM(v_as_SF, k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533 item[ilow] = w;
534 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000535 if (recycle) {
536 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 Py_XDECREF(*p);
538 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000539 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000540 if (a->ob_size == 0 && a->ob_item != NULL) {
541 PyMem_FREE(a->ob_item);
542 a->ob_item = NULL;
543 }
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000544 Py_XDECREF(v_as_SF);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545 return 0;
546#undef b
547}
548
Guido van Rossum234f9421993-06-17 12:35:49 +0000549int
Fred Drakea2f55112000-07-09 15:16:51 +0000550PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000551{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 if (!PyList_Check(a)) {
553 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000554 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000555 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000557}
558
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000559static PyObject *
560list_inplace_repeat(PyListObject *self, int n)
561{
562 PyObject **items;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000563 int size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000564
565
566 size = PyList_GET_SIZE(self);
567 if (size == 0) {
568 Py_INCREF(self);
569 return (PyObject *)self;
570 }
571
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000572 if (n < 1) {
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000573 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000574 self->ob_item = NULL;
575 self->ob_size = 0;
576 for (i = 0; i < size; i++)
577 Py_XDECREF(items[i]);
578 PyMem_DEL(items);
579 Py_INCREF(self);
580 return (PyObject *)self;
581 }
582
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000583 if (list_resize(self, size*n) == -1)
584 return NULL;
585
586 p = size;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000587 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
588 for (j = 0; j < size; j++) {
589 PyObject *o = PyList_GET_ITEM(self, j);
590 Py_INCREF(o);
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000591 PyList_SET_ITEM(self, p++, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000592 }
593 }
594 Py_INCREF(self);
595 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000596}
597
Guido van Rossum4a450d01991-04-03 19:05:18 +0000598static int
Fred Drakea2f55112000-07-09 15:16:51 +0000599list_ass_item(PyListObject *a, int i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000600{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000602 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 PyErr_SetString(PyExc_IndexError,
604 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000605 return -1;
606 }
607 if (v == NULL)
608 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000610 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000611 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000612 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000613 return 0;
614}
615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000617ins(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000618{
619 if (ins1(self, where, v) != 0)
620 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 Py_INCREF(Py_None);
622 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623}
624
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000626listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627{
628 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000630 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000631 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000632 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633}
634
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000636listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637{
Guido van Rossumbf80e541993-02-08 15:49:17 +0000638 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000639}
640
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000641static int
642listextend_internal(PyListObject *self, PyObject *b)
Barry Warsawdedf6d61998-10-09 16:37:25 +0000643{
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000644 register int selflen = PyList_GET_SIZE(self);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000645 int blen;
646 register int i;
647
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000648 if (PyObject_Size(b) == 0) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000649 /* short circuit when b is empty */
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000650 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000651 return 0;
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000652 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000653
Barry Warsawdedf6d61998-10-09 16:37:25 +0000654 if (self == (PyListObject*)b) {
655 /* as in list_ass_slice() we must special case the
656 * situation: a.extend(a)
657 *
658 * XXX: I think this way ought to be faster than using
659 * list_slice() the way list_ass_slice() does.
660 */
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000661 Py_DECREF(b);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000662 b = PyList_New(selflen);
663 if (!b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000664 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000665 for (i = 0; i < selflen; i++) {
666 PyObject *o = PyList_GET_ITEM(self, i);
667 Py_INCREF(o);
668 PyList_SET_ITEM(b, i, o);
669 }
670 }
Barry Warsawdedf6d61998-10-09 16:37:25 +0000671
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000672 blen = PyObject_Size(b);
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000673 if (list_resize(self, selflen + blen) == -1) {
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000674 Py_DECREF(b);
675 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000676 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000677
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000678 /* populate the end of self with b's items */
Barry Warsawdedf6d61998-10-09 16:37:25 +0000679 for (i = 0; i < blen; i++) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000680 PyObject *o = PySequence_Fast_GET_ITEM(b, i);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000681 Py_INCREF(o);
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000682 PyList_SET_ITEM(self, i+selflen, o);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000683 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000684 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000685 return 0;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000686}
687
Barry Warsawdedf6d61998-10-09 16:37:25 +0000688static PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000689list_inplace_concat(PyListObject *self, PyObject *other)
690{
Tim Peters1af03e92001-05-26 19:37:54 +0000691 other = PySequence_Fast(other, "argument to += must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000692 if (!other)
693 return NULL;
694
695 if (listextend_internal(self, other) < 0)
696 return NULL;
697
698 Py_INCREF(self);
699 return (PyObject *)self;
700}
701
702static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000703listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000704{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000705 PyObject *it; /* iter(v) */
706 int m; /* size of self */
707 int n; /* guess for size of b */
708 int mn; /* m + n */
709 int i;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000711 /* Special cases:
712 1) lists and tuples which can use PySequence_Fast ops
713 2) extending self to self requires making a copy first
714 */
715 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
716 b = PySequence_Fast(b, "argument must be iterable");
717 if (!b)
718 return NULL;
719 if (listextend_internal(self, b) < 0)
720 return NULL;
721 Py_RETURN_NONE;
722 }
723
724 it = PyObject_GetIter(b);
725 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000726 return NULL;
727
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000728 /* Guess a result list size. */
729 n = PyObject_Size(b);
730 if (n < 0) {
731 PyErr_Clear();
732 n = 8; /* arbitrary */
733 }
734 m = self->ob_size;
735 mn = m + n;
736 if (list_resize(self, mn) == -1)
737 goto error;
738 memset(&(self->ob_item[m]), 0, sizeof(*self->ob_item) * n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000739
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000740 /* Run iterator to exhaustion. */
741 for (i = m; ; i++) {
742 PyObject *item = PyIter_Next(it);
743 if (item == NULL) {
744 if (PyErr_Occurred())
745 goto error;
746 break;
747 }
748 if (i < mn)
749 PyList_SET_ITEM(self, i, item); /* steals ref */
750 else {
751 int status = ins1(self, self->ob_size, item);
752 Py_DECREF(item); /* append creates a new ref */
753 if (status < 0)
754 goto error;
755 }
756 }
757
758 /* Cut back result list if initial guess was too large. */
759 if (i < mn && self != NULL) {
760 if (list_ass_slice(self, i, mn, (PyObject *)NULL) != 0)
761 goto error;
762 }
763 Py_DECREF(it);
764 Py_RETURN_NONE;
765
766 error:
767 Py_DECREF(it);
768 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000769}
770
771static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000772listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000773{
774 int i = -1;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000775 PyObject *v, *arg = NULL;
776
777 if (!PyArg_UnpackTuple(args, "pop", 0, 1, &arg))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000778 return NULL;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000779 if (arg != NULL) {
780 if (PyInt_Check(arg))
781 i = (int)(PyInt_AS_LONG((PyIntObject*) arg));
782 else {
783 PyErr_SetString(PyExc_TypeError, "an integer is required");
784 return NULL;
785 }
786 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000787 if (self->ob_size == 0) {
788 /* Special-case most common failure cause */
789 PyErr_SetString(PyExc_IndexError, "pop from empty list");
790 return NULL;
791 }
792 if (i < 0)
793 i += self->ob_size;
794 if (i < 0 || i >= self->ob_size) {
795 PyErr_SetString(PyExc_IndexError, "pop index out of range");
796 return NULL;
797 }
798 v = self->ob_item[i];
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000799 if (i == self->ob_size - 1) {
800 if (list_resize(self, self->ob_size - 1) == -1)
801 return NULL;
802 return v;
803 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000804 Py_INCREF(v);
805 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
806 Py_DECREF(v);
807 return NULL;
808 }
809 return v;
810}
811
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000812/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
813static void
814reverse_slice(PyObject **lo, PyObject **hi)
815{
816 assert(lo && hi);
817
818 --hi;
819 while (lo < hi) {
820 PyObject *t = *lo;
821 *lo = *hi;
822 *hi = t;
823 ++lo;
824 --hi;
825 }
826}
827
Tim Petersa64dc242002-08-01 02:13:36 +0000828/* Lots of code for an adaptive, stable, natural mergesort. There are many
829 * pieces to this algorithm; read listsort.txt for overviews and details.
830 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000831
Guido van Rossum3f236de1996-12-10 23:55:39 +0000832/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000833 * comparison function (any callable Python object), which must not be
834 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
835 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000836 * Returns -1 on error, 1 if x < y, 0 if x >= y.
837 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000838static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000839islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000840{
Tim Petersf2a04732002-07-11 21:46:16 +0000841 PyObject *res;
842 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000843 int i;
844
Tim Peters66860f62002-08-04 17:47:26 +0000845 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000846 /* Call the user's comparison function and translate the 3-way
847 * result into true or false (or error).
848 */
Tim Petersf2a04732002-07-11 21:46:16 +0000849 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000850 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000851 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000852 Py_INCREF(x);
853 Py_INCREF(y);
854 PyTuple_SET_ITEM(args, 0, x);
855 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000856 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000858 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000859 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 if (!PyInt_Check(res)) {
861 Py_DECREF(res);
862 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000863 "comparison function must return int");
Tim Petersa8c974c2002-07-19 03:30:57 +0000864 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000865 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 i = PyInt_AsLong(res);
867 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000868 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000869}
870
Tim Peters66860f62002-08-04 17:47:26 +0000871/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
872 * islt. This avoids a layer of function call in the usual case, and
873 * sorting does many comparisons.
874 * Returns -1 on error, 1 if x < y, 0 if x >= y.
875 */
876#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
877 PyObject_RichCompareBool(X, Y, Py_LT) : \
878 islt(X, Y, COMPARE))
879
880/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000881 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
882 started. It makes more sense in context <wink>. X and Y are PyObject*s.
883*/
Tim Peters66860f62002-08-04 17:47:26 +0000884#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000885 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000886
887/* binarysort is the best method for sorting small arrays: it does
888 few compares, but can do data movement quadratic in the number of
889 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000890 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000891 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000892 On entry, must have lo <= start <= hi, and that [lo, start) is already
893 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000894 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000895 Even in case of error, the output slice will be some permutation of
896 the input (nothing is lost or duplicated).
897*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000898static int
Fred Drakea2f55112000-07-09 15:16:51 +0000899binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
900 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000901{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000902 register int k;
903 register PyObject **l, **p, **r;
904 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000905
Tim Petersa8c974c2002-07-19 03:30:57 +0000906 assert(lo <= start && start <= hi);
907 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000908 if (lo == start)
909 ++start;
910 for (; start < hi; ++start) {
911 /* set l to where *start belongs */
912 l = lo;
913 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000914 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000915 /* Invariants:
916 * pivot >= all in [lo, l).
917 * pivot < all in [r, start).
918 * The second is vacuously true at the start.
919 */
920 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000921 do {
922 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000923 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000924 r = p;
925 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000926 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000927 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000928 assert(l == r);
929 /* The invariants still hold, so pivot >= all in [lo, l) and
930 pivot < all in [l, start), so pivot belongs at l. Note
931 that if there are elements equal to pivot, l points to the
932 first slot after them -- that's why this sort is stable.
933 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000934 Caution: using memmove is much slower under MSVC 5;
935 we're not usually moving many slots. */
936 for (p = start; p > l; --p)
937 *p = *(p-1);
938 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000939 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000940 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000941
942 fail:
943 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000944}
945
Tim Petersa64dc242002-08-01 02:13:36 +0000946/*
947Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
948is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000949
Tim Petersa64dc242002-08-01 02:13:36 +0000950 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000951
Tim Petersa64dc242002-08-01 02:13:36 +0000952or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000953
Tim Petersa64dc242002-08-01 02:13:36 +0000954 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +0000955
Tim Petersa64dc242002-08-01 02:13:36 +0000956Boolean *descending is set to 0 in the former case, or to 1 in the latter.
957For its intended use in a stable mergesort, the strictness of the defn of
958"descending" is needed so that the caller can safely reverse a descending
959sequence without violating stability (strict > ensures there are no equal
960elements to get out of order).
961
962Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000963*/
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000964static int
Tim Petersa64dc242002-08-01 02:13:36 +0000965count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000966{
Tim Petersa64dc242002-08-01 02:13:36 +0000967 int k;
968 int n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000969
Tim Petersa64dc242002-08-01 02:13:36 +0000970 assert(lo < hi);
971 *descending = 0;
972 ++lo;
973 if (lo == hi)
974 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000975
Tim Petersa64dc242002-08-01 02:13:36 +0000976 n = 2;
977 IFLT(*lo, *(lo-1)) {
978 *descending = 1;
979 for (lo = lo+1; lo < hi; ++lo, ++n) {
980 IFLT(*lo, *(lo-1))
981 ;
982 else
983 break;
984 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000985 }
Tim Petersa64dc242002-08-01 02:13:36 +0000986 else {
987 for (lo = lo+1; lo < hi; ++lo, ++n) {
988 IFLT(*lo, *(lo-1))
989 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000990 }
991 }
992
Tim Petersa64dc242002-08-01 02:13:36 +0000993 return n;
994fail:
995 return -1;
996}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000997
Tim Petersa64dc242002-08-01 02:13:36 +0000998/*
999Locate the proper position of key in a sorted vector; if the vector contains
1000an element equal to key, return the position immediately to the left of
1001the leftmost equal element. [gallop_right() does the same except returns
1002the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001003
Tim Petersa64dc242002-08-01 02:13:36 +00001004"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001005
Tim Petersa64dc242002-08-01 02:13:36 +00001006"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1007hint is to the final result, the faster this runs.
1008
1009The return value is the int k in 0..n such that
1010
1011 a[k-1] < key <= a[k]
1012
1013pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1014key belongs at index k; or, IOW, the first k elements of a should precede
1015key, and the last n-k should follow key.
1016
1017Returns -1 on error. See listsort.txt for info on the method.
1018*/
1019static int
1020gallop_left(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
1021{
1022 int ofs;
1023 int lastofs;
1024 int k;
1025
1026 assert(key && a && n > 0 && hint >= 0 && hint < n);
1027
1028 a += hint;
1029 lastofs = 0;
1030 ofs = 1;
1031 IFLT(*a, key) {
1032 /* a[hint] < key -- gallop right, until
1033 * a[hint + lastofs] < key <= a[hint + ofs]
1034 */
1035 const int maxofs = n - hint; /* &a[n-1] is highest */
1036 while (ofs < maxofs) {
1037 IFLT(a[ofs], key) {
1038 lastofs = ofs;
1039 ofs = (ofs << 1) + 1;
1040 if (ofs <= 0) /* int overflow */
1041 ofs = maxofs;
1042 }
1043 else /* key <= a[hint + ofs] */
1044 break;
1045 }
1046 if (ofs > maxofs)
1047 ofs = maxofs;
1048 /* Translate back to offsets relative to &a[0]. */
1049 lastofs += hint;
1050 ofs += hint;
1051 }
1052 else {
1053 /* key <= a[hint] -- gallop left, until
1054 * a[hint - ofs] < key <= a[hint - lastofs]
1055 */
1056 const int maxofs = hint + 1; /* &a[0] is lowest */
1057 while (ofs < maxofs) {
1058 IFLT(*(a-ofs), key)
1059 break;
1060 /* key <= a[hint - ofs] */
1061 lastofs = ofs;
1062 ofs = (ofs << 1) + 1;
1063 if (ofs <= 0) /* int overflow */
1064 ofs = maxofs;
1065 }
1066 if (ofs > maxofs)
1067 ofs = maxofs;
1068 /* Translate back to positive offsets relative to &a[0]. */
1069 k = lastofs;
1070 lastofs = hint - ofs;
1071 ofs = hint - k;
1072 }
1073 a -= hint;
1074
1075 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1076 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1077 * right of lastofs but no farther right than ofs. Do a binary
1078 * search, with invariant a[lastofs-1] < key <= a[ofs].
1079 */
1080 ++lastofs;
1081 while (lastofs < ofs) {
1082 int m = lastofs + ((ofs - lastofs) >> 1);
1083
1084 IFLT(a[m], key)
1085 lastofs = m+1; /* a[m] < key */
1086 else
1087 ofs = m; /* key <= a[m] */
1088 }
1089 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1090 return ofs;
1091
1092fail:
1093 return -1;
1094}
1095
1096/*
1097Exactly like gallop_left(), except that if key already exists in a[0:n],
1098finds the position immediately to the right of the rightmost equal value.
1099
1100The return value is the int k in 0..n such that
1101
1102 a[k-1] <= key < a[k]
1103
1104or -1 if error.
1105
1106The code duplication is massive, but this is enough different given that
1107we're sticking to "<" comparisons that it's much harder to follow if
1108written as one routine with yet another "left or right?" flag.
1109*/
1110static int
1111gallop_right(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
1112{
1113 int ofs;
1114 int lastofs;
1115 int k;
1116
1117 assert(key && a && n > 0 && hint >= 0 && hint < n);
1118
1119 a += hint;
1120 lastofs = 0;
1121 ofs = 1;
1122 IFLT(key, *a) {
1123 /* key < a[hint] -- gallop left, until
1124 * a[hint - ofs] <= key < a[hint - lastofs]
1125 */
1126 const int maxofs = hint + 1; /* &a[0] is lowest */
1127 while (ofs < maxofs) {
1128 IFLT(key, *(a-ofs)) {
1129 lastofs = ofs;
1130 ofs = (ofs << 1) + 1;
1131 if (ofs <= 0) /* int overflow */
1132 ofs = maxofs;
1133 }
1134 else /* a[hint - ofs] <= key */
1135 break;
1136 }
1137 if (ofs > maxofs)
1138 ofs = maxofs;
1139 /* Translate back to positive offsets relative to &a[0]. */
1140 k = lastofs;
1141 lastofs = hint - ofs;
1142 ofs = hint - k;
1143 }
1144 else {
1145 /* a[hint] <= key -- gallop right, until
1146 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001147 */
Tim Petersa64dc242002-08-01 02:13:36 +00001148 const int maxofs = n - hint; /* &a[n-1] is highest */
1149 while (ofs < maxofs) {
1150 IFLT(key, a[ofs])
1151 break;
1152 /* a[hint + ofs] <= key */
1153 lastofs = ofs;
1154 ofs = (ofs << 1) + 1;
1155 if (ofs <= 0) /* int overflow */
1156 ofs = maxofs;
1157 }
1158 if (ofs > maxofs)
1159 ofs = maxofs;
1160 /* Translate back to offsets relative to &a[0]. */
1161 lastofs += hint;
1162 ofs += hint;
1163 }
1164 a -= hint;
1165
1166 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1167 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1168 * right of lastofs but no farther right than ofs. Do a binary
1169 * search, with invariant a[lastofs-1] <= key < a[ofs].
1170 */
1171 ++lastofs;
1172 while (lastofs < ofs) {
1173 int m = lastofs + ((ofs - lastofs) >> 1);
1174
1175 IFLT(key, a[m])
1176 ofs = m; /* key < a[m] */
1177 else
1178 lastofs = m+1; /* a[m] <= key */
1179 }
1180 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1181 return ofs;
1182
1183fail:
1184 return -1;
1185}
1186
1187/* The maximum number of entries in a MergeState's pending-runs stack.
1188 * This is enough to sort arrays of size up to about
1189 * 32 * phi ** MAX_MERGE_PENDING
1190 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1191 * with 2**64 elements.
1192 */
1193#define MAX_MERGE_PENDING 85
1194
Tim Peterse05f65a2002-08-10 05:21:15 +00001195/* When we get into galloping mode, we stay there until both runs win less
1196 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001197 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001198#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001199
1200/* Avoid malloc for small temp arrays. */
1201#define MERGESTATE_TEMP_SIZE 256
1202
1203/* One MergeState exists on the stack per invocation of mergesort. It's just
1204 * a convenient way to pass state around among the helper functions.
1205 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001206struct s_slice {
1207 PyObject **base;
1208 int len;
1209};
1210
Tim Petersa64dc242002-08-01 02:13:36 +00001211typedef struct s_MergeState {
1212 /* The user-supplied comparison function. or NULL if none given. */
1213 PyObject *compare;
1214
Tim Peterse05f65a2002-08-10 05:21:15 +00001215 /* This controls when we get *into* galloping mode. It's initialized
1216 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1217 * random data, and lower for highly structured data.
1218 */
1219 int min_gallop;
1220
Tim Petersa64dc242002-08-01 02:13:36 +00001221 /* 'a' is temp storage to help with merges. It contains room for
1222 * alloced entries.
1223 */
1224 PyObject **a; /* may point to temparray below */
1225 int alloced;
1226
1227 /* A stack of n pending runs yet to be merged. Run #i starts at
1228 * address base[i] and extends for len[i] elements. It's always
1229 * true (so long as the indices are in bounds) that
1230 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001231 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001232 *
1233 * so we could cut the storage for this, but it's a minor amount,
1234 * and keeping all the info explicit simplifies the code.
1235 */
1236 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001237 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001238
1239 /* 'a' points to this when possible, rather than muck with malloc. */
1240 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1241} MergeState;
1242
1243/* Conceptually a MergeState's constructor. */
1244static void
1245merge_init(MergeState *ms, PyObject *compare)
1246{
1247 assert(ms != NULL);
1248 ms->compare = compare;
1249 ms->a = ms->temparray;
1250 ms->alloced = MERGESTATE_TEMP_SIZE;
1251 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001252 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001253}
1254
1255/* Free all the temp memory owned by the MergeState. This must be called
1256 * when you're done with a MergeState, and may be called before then if
1257 * you want to free the temp memory early.
1258 */
1259static void
1260merge_freemem(MergeState *ms)
1261{
1262 assert(ms != NULL);
1263 if (ms->a != ms->temparray)
1264 PyMem_Free(ms->a);
1265 ms->a = ms->temparray;
1266 ms->alloced = MERGESTATE_TEMP_SIZE;
1267}
1268
1269/* Ensure enough temp memory for 'need' array slots is available.
1270 * Returns 0 on success and -1 if the memory can't be gotten.
1271 */
1272static int
1273merge_getmem(MergeState *ms, int need)
1274{
1275 assert(ms != NULL);
1276 if (need <= ms->alloced)
1277 return 0;
1278 /* Don't realloc! That can cost cycles to copy the old data, but
1279 * we don't care what's in the block.
1280 */
1281 merge_freemem(ms);
1282 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1283 if (ms->a) {
1284 ms->alloced = need;
1285 return 0;
1286 }
1287 PyErr_NoMemory();
1288 merge_freemem(ms); /* reset to sane state */
1289 return -1;
1290}
1291#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1292 merge_getmem(MS, NEED))
1293
1294/* Merge the na elements starting at pa with the nb elements starting at pb
1295 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1296 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1297 * merge, and should have na <= nb. See listsort.txt for more info.
1298 * Return 0 if successful, -1 if error.
1299 */
1300static int
1301merge_lo(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1302{
1303 int k;
1304 PyObject *compare;
1305 PyObject **dest;
1306 int result = -1; /* guilty until proved innocent */
Tim Peterse05f65a2002-08-10 05:21:15 +00001307 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001308
1309 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1310 if (MERGE_GETMEM(ms, na) < 0)
1311 return -1;
1312 memcpy(ms->a, pa, na * sizeof(PyObject*));
1313 dest = pa;
1314 pa = ms->a;
1315
1316 *dest++ = *pb++;
1317 --nb;
1318 if (nb == 0)
1319 goto Succeed;
1320 if (na == 1)
1321 goto CopyB;
1322
1323 compare = ms->compare;
1324 for (;;) {
1325 int acount = 0; /* # of times A won in a row */
1326 int bcount = 0; /* # of times B won in a row */
1327
1328 /* Do the straightforward thing until (if ever) one run
1329 * appears to win consistently.
1330 */
1331 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001332 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001333 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001334 if (k) {
1335 if (k < 0)
1336 goto Fail;
1337 *dest++ = *pb++;
1338 ++bcount;
1339 acount = 0;
1340 --nb;
1341 if (nb == 0)
1342 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001343 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001344 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001345 }
1346 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001347 *dest++ = *pa++;
1348 ++acount;
1349 bcount = 0;
1350 --na;
1351 if (na == 1)
1352 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001353 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001354 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001355 }
Tim Petersa64dc242002-08-01 02:13:36 +00001356 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001357
Tim Petersa64dc242002-08-01 02:13:36 +00001358 /* One run is winning so consistently that galloping may
1359 * be a huge win. So try that, and continue galloping until
1360 * (if ever) neither run appears to be winning consistently
1361 * anymore.
1362 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001363 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001364 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001365 assert(na > 1 && nb > 0);
1366 min_gallop -= min_gallop > 1;
1367 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001368 k = gallop_right(*pb, pa, na, 0, compare);
1369 acount = k;
1370 if (k) {
1371 if (k < 0)
1372 goto Fail;
1373 memcpy(dest, pa, k * sizeof(PyObject *));
1374 dest += k;
1375 pa += k;
1376 na -= k;
1377 if (na == 1)
1378 goto CopyB;
1379 /* na==0 is impossible now if the comparison
1380 * function is consistent, but we can't assume
1381 * that it is.
1382 */
1383 if (na == 0)
1384 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001385 }
Tim Petersa64dc242002-08-01 02:13:36 +00001386 *dest++ = *pb++;
1387 --nb;
1388 if (nb == 0)
1389 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001390
Tim Petersa64dc242002-08-01 02:13:36 +00001391 k = gallop_left(*pa, pb, nb, 0, compare);
1392 bcount = k;
1393 if (k) {
1394 if (k < 0)
1395 goto Fail;
1396 memmove(dest, pb, k * sizeof(PyObject *));
1397 dest += k;
1398 pb += k;
1399 nb -= k;
1400 if (nb == 0)
1401 goto Succeed;
1402 }
1403 *dest++ = *pa++;
1404 --na;
1405 if (na == 1)
1406 goto CopyB;
1407 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001408 ++min_gallop; /* penalize it for leaving galloping mode */
1409 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001410 }
1411Succeed:
1412 result = 0;
1413Fail:
1414 if (na)
1415 memcpy(dest, pa, na * sizeof(PyObject*));
1416 return result;
1417CopyB:
1418 assert(na == 1 && nb > 0);
1419 /* The last element of pa belongs at the end of the merge. */
1420 memmove(dest, pb, nb * sizeof(PyObject *));
1421 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001422 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001423}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001424
Tim Petersa64dc242002-08-01 02:13:36 +00001425/* Merge the na elements starting at pa with the nb elements starting at pb
1426 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1427 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1428 * merge, and should have na >= nb. See listsort.txt for more info.
1429 * Return 0 if successful, -1 if error.
1430 */
1431static int
1432merge_hi(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1433{
1434 int k;
1435 PyObject *compare;
1436 PyObject **dest;
1437 int result = -1; /* guilty until proved innocent */
1438 PyObject **basea;
1439 PyObject **baseb;
Tim Peterse05f65a2002-08-10 05:21:15 +00001440 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001441
1442 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1443 if (MERGE_GETMEM(ms, nb) < 0)
1444 return -1;
1445 dest = pb + nb - 1;
1446 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1447 basea = pa;
1448 baseb = ms->a;
1449 pb = ms->a + nb - 1;
1450 pa += na - 1;
1451
1452 *dest-- = *pa--;
1453 --na;
1454 if (na == 0)
1455 goto Succeed;
1456 if (nb == 1)
1457 goto CopyA;
1458
1459 compare = ms->compare;
1460 for (;;) {
1461 int acount = 0; /* # of times A won in a row */
1462 int bcount = 0; /* # of times B won in a row */
1463
1464 /* Do the straightforward thing until (if ever) one run
1465 * appears to win consistently.
1466 */
1467 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001468 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001469 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001470 if (k) {
1471 if (k < 0)
1472 goto Fail;
1473 *dest-- = *pa--;
1474 ++acount;
1475 bcount = 0;
1476 --na;
1477 if (na == 0)
1478 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001479 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001480 break;
1481 }
1482 else {
1483 *dest-- = *pb--;
1484 ++bcount;
1485 acount = 0;
1486 --nb;
1487 if (nb == 1)
1488 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001489 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001490 break;
1491 }
1492 }
1493
1494 /* One run is winning so consistently that galloping may
1495 * be a huge win. So try that, and continue galloping until
1496 * (if ever) neither run appears to be winning consistently
1497 * anymore.
1498 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001499 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001500 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001501 assert(na > 0 && nb > 1);
1502 min_gallop -= min_gallop > 1;
1503 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001504 k = gallop_right(*pb, basea, na, na-1, compare);
1505 if (k < 0)
1506 goto Fail;
1507 k = na - k;
1508 acount = k;
1509 if (k) {
1510 dest -= k;
1511 pa -= k;
1512 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1513 na -= k;
1514 if (na == 0)
1515 goto Succeed;
1516 }
1517 *dest-- = *pb--;
1518 --nb;
1519 if (nb == 1)
1520 goto CopyA;
1521
1522 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1523 if (k < 0)
1524 goto Fail;
1525 k = nb - k;
1526 bcount = k;
1527 if (k) {
1528 dest -= k;
1529 pb -= k;
1530 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1531 nb -= k;
1532 if (nb == 1)
1533 goto CopyA;
1534 /* nb==0 is impossible now if the comparison
1535 * function is consistent, but we can't assume
1536 * that it is.
1537 */
1538 if (nb == 0)
1539 goto Succeed;
1540 }
1541 *dest-- = *pa--;
1542 --na;
1543 if (na == 0)
1544 goto Succeed;
1545 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001546 ++min_gallop; /* penalize it for leaving galloping mode */
1547 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001548 }
1549Succeed:
1550 result = 0;
1551Fail:
1552 if (nb)
1553 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1554 return result;
1555CopyA:
1556 assert(nb == 1 && na > 0);
1557 /* The first element of pb belongs at the front of the merge. */
1558 dest -= na;
1559 pa -= na;
1560 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1561 *dest = *pb;
1562 return 0;
1563}
1564
1565/* Merge the two runs at stack indices i and i+1.
1566 * Returns 0 on success, -1 on error.
1567 */
1568static int
1569merge_at(MergeState *ms, int i)
1570{
1571 PyObject **pa, **pb;
1572 int na, nb;
1573 int k;
1574 PyObject *compare;
1575
1576 assert(ms != NULL);
1577 assert(ms->n >= 2);
1578 assert(i >= 0);
1579 assert(i == ms->n - 2 || i == ms->n - 3);
1580
Tim Peterse05f65a2002-08-10 05:21:15 +00001581 pa = ms->pending[i].base;
1582 na = ms->pending[i].len;
1583 pb = ms->pending[i+1].base;
1584 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001585 assert(na > 0 && nb > 0);
1586 assert(pa + na == pb);
1587
1588 /* Record the length of the combined runs; if i is the 3rd-last
1589 * run now, also slide over the last run (which isn't involved
1590 * in this merge). The current run i+1 goes away in any case.
1591 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001592 ms->pending[i].len = na + nb;
1593 if (i == ms->n - 3)
1594 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001595 --ms->n;
1596
1597 /* Where does b start in a? Elements in a before that can be
1598 * ignored (already in place).
1599 */
1600 compare = ms->compare;
1601 k = gallop_right(*pb, pa, na, 0, compare);
1602 if (k < 0)
1603 return -1;
1604 pa += k;
1605 na -= k;
1606 if (na == 0)
1607 return 0;
1608
1609 /* Where does a end in b? Elements in b after that can be
1610 * ignored (already in place).
1611 */
1612 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1613 if (nb <= 0)
1614 return nb;
1615
1616 /* Merge what remains of the runs, using a temp array with
1617 * min(na, nb) elements.
1618 */
1619 if (na <= nb)
1620 return merge_lo(ms, pa, na, pb, nb);
1621 else
1622 return merge_hi(ms, pa, na, pb, nb);
1623}
1624
1625/* Examine the stack of runs waiting to be merged, merging adjacent runs
1626 * until the stack invariants are re-established:
1627 *
1628 * 1. len[-3] > len[-2] + len[-1]
1629 * 2. len[-2] > len[-1]
1630 *
1631 * See listsort.txt for more info.
1632 *
1633 * Returns 0 on success, -1 on error.
1634 */
1635static int
1636merge_collapse(MergeState *ms)
1637{
Tim Peterse05f65a2002-08-10 05:21:15 +00001638 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001639
1640 assert(ms);
1641 while (ms->n > 1) {
1642 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001643 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1644 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001645 --n;
1646 if (merge_at(ms, n) < 0)
1647 return -1;
1648 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001649 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001650 if (merge_at(ms, n) < 0)
1651 return -1;
1652 }
1653 else
1654 break;
1655 }
1656 return 0;
1657}
1658
1659/* Regardless of invariants, merge all runs on the stack until only one
1660 * remains. This is used at the end of the mergesort.
1661 *
1662 * Returns 0 on success, -1 on error.
1663 */
1664static int
1665merge_force_collapse(MergeState *ms)
1666{
Tim Peterse05f65a2002-08-10 05:21:15 +00001667 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001668
1669 assert(ms);
1670 while (ms->n > 1) {
1671 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001672 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001673 --n;
1674 if (merge_at(ms, n) < 0)
1675 return -1;
1676 }
1677 return 0;
1678}
1679
1680/* Compute a good value for the minimum run length; natural runs shorter
1681 * than this are boosted artificially via binary insertion.
1682 *
1683 * If n < 64, return n (it's too small to bother with fancy stuff).
1684 * Else if n is an exact power of 2, return 32.
1685 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1686 * strictly less than, an exact power of 2.
1687 *
1688 * See listsort.txt for more info.
1689 */
1690static int
1691merge_compute_minrun(int n)
1692{
1693 int r = 0; /* becomes 1 if any 1 bits are shifted off */
1694
1695 assert(n >= 0);
1696 while (n >= 64) {
1697 r |= n & 1;
1698 n >>= 1;
1699 }
1700 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001701}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001702
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001703/* Special wrapper to support stable sorting using the decorate-sort-undecorate
1704 pattern. Holds a key which is used for comparisions and the original record
1705 which is returned during the undecorate phase. By exposing only the key
1706 during comparisons, the underlying sort stability characteristics are left
1707 unchanged. Also, if a custom comparison function is used, it will only see
1708 the key instead of a full record. */
1709
1710typedef struct {
1711 PyObject_HEAD
1712 PyObject *key;
1713 PyObject *value;
1714} sortwrapperobject;
1715
1716static PyTypeObject sortwrapper_type;
1717
1718static PyObject *
1719sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1720{
1721 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1722 PyErr_SetString(PyExc_TypeError,
1723 "expected a sortwrapperobject");
1724 return NULL;
1725 }
1726 return PyObject_RichCompare(a->key, b->key, op);
1727}
1728
1729static void
1730sortwrapper_dealloc(sortwrapperobject *so)
1731{
1732 Py_XDECREF(so->key);
1733 Py_XDECREF(so->value);
1734 PyObject_Del(so);
1735}
1736
1737PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
1738
1739static PyTypeObject sortwrapper_type = {
1740 PyObject_HEAD_INIT(&PyType_Type)
1741 0, /* ob_size */
1742 "sortwrapper", /* tp_name */
1743 sizeof(sortwrapperobject), /* tp_basicsize */
1744 0, /* tp_itemsize */
1745 /* methods */
1746 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1747 0, /* tp_print */
1748 0, /* tp_getattr */
1749 0, /* tp_setattr */
1750 0, /* tp_compare */
1751 0, /* tp_repr */
1752 0, /* tp_as_number */
1753 0, /* tp_as_sequence */
1754 0, /* tp_as_mapping */
1755 0, /* tp_hash */
1756 0, /* tp_call */
1757 0, /* tp_str */
1758 PyObject_GenericGetAttr, /* tp_getattro */
1759 0, /* tp_setattro */
1760 0, /* tp_as_buffer */
1761 Py_TPFLAGS_DEFAULT |
1762 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1763 sortwrapper_doc, /* tp_doc */
1764 0, /* tp_traverse */
1765 0, /* tp_clear */
1766 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1767};
1768
1769/* Returns a new reference to a sortwrapper.
1770 Consumes the references to the two underlying objects. */
1771
1772static PyObject *
1773build_sortwrapper(PyObject *key, PyObject *value)
1774{
1775 sortwrapperobject *so;
1776
1777 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1778 if (so == NULL)
1779 return NULL;
1780 so->key = key;
1781 so->value = value;
1782 return (PyObject *)so;
1783}
1784
1785/* Returns a new reference to the value underlying the wrapper. */
1786static PyObject *
1787sortwrapper_getvalue(PyObject *so)
1788{
1789 PyObject *value;
1790
1791 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
1792 PyErr_SetString(PyExc_TypeError,
1793 "expected a sortwrapperobject");
1794 return NULL;
1795 }
1796 value = ((sortwrapperobject *)so)->value;
1797 Py_INCREF(value);
1798 return value;
1799}
1800
1801/* Wrapper for user specified cmp functions in combination with a
1802 specified key function. Makes sure the cmp function is presented
1803 with the actual key instead of the sortwrapper */
1804
1805typedef struct {
1806 PyObject_HEAD
1807 PyObject *func;
1808} cmpwrapperobject;
1809
1810static void
1811cmpwrapper_dealloc(cmpwrapperobject *co)
1812{
1813 Py_XDECREF(co->func);
1814 PyObject_Del(co);
1815}
1816
1817static PyObject *
1818cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1819{
1820 PyObject *x, *y, *xx, *yy;
1821
1822 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1823 return NULL;
1824 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001825 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001826 PyErr_SetString(PyExc_TypeError,
1827 "expected a sortwrapperobject");
1828 return NULL;
1829 }
1830 xx = ((sortwrapperobject *)x)->key;
1831 yy = ((sortwrapperobject *)y)->key;
1832 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1833}
1834
1835PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1836
1837static PyTypeObject cmpwrapper_type = {
1838 PyObject_HEAD_INIT(&PyType_Type)
1839 0, /* ob_size */
1840 "cmpwrapper", /* tp_name */
1841 sizeof(cmpwrapperobject), /* tp_basicsize */
1842 0, /* tp_itemsize */
1843 /* methods */
1844 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1845 0, /* tp_print */
1846 0, /* tp_getattr */
1847 0, /* tp_setattr */
1848 0, /* tp_compare */
1849 0, /* tp_repr */
1850 0, /* tp_as_number */
1851 0, /* tp_as_sequence */
1852 0, /* tp_as_mapping */
1853 0, /* tp_hash */
1854 (ternaryfunc)cmpwrapper_call, /* tp_call */
1855 0, /* tp_str */
1856 PyObject_GenericGetAttr, /* tp_getattro */
1857 0, /* tp_setattro */
1858 0, /* tp_as_buffer */
1859 Py_TPFLAGS_DEFAULT, /* tp_flags */
1860 cmpwrapper_doc, /* tp_doc */
1861};
1862
1863static PyObject *
1864build_cmpwrapper(PyObject *cmpfunc)
1865{
1866 cmpwrapperobject *co;
1867
1868 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1869 if (co == NULL)
1870 return NULL;
1871 Py_INCREF(cmpfunc);
1872 co->func = cmpfunc;
1873 return (PyObject *)co;
1874}
1875
Tim Petersa64dc242002-08-01 02:13:36 +00001876/* An adaptive, stable, natural mergesort. See listsort.txt.
1877 * Returns Py_None on success, NULL on error. Even in case of error, the
1878 * list will be some permutation of its input state (nothing is lost or
1879 * duplicated).
1880 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001881static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001882listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001883{
Tim Petersa64dc242002-08-01 02:13:36 +00001884 MergeState ms;
1885 PyObject **lo, **hi;
1886 int nremaining;
1887 int minrun;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00001888 int saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001889 PyObject **saved_ob_item;
1890 PyObject **empty_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001891 PyObject *compare = NULL;
1892 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001893 int reverse = 0;
1894 PyObject *keyfunc = NULL;
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001895 int i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001896 PyObject *key, *value, *kvpair;
1897 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001898
Tim Petersa64dc242002-08-01 02:13:36 +00001899 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001900 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001901 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001902 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
1903 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001904 return NULL;
1905 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00001906 if (compare == Py_None)
1907 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001908 if (keyfunc == Py_None)
1909 keyfunc = NULL;
1910 if (compare != NULL && keyfunc != NULL) {
1911 compare = build_cmpwrapper(compare);
1912 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00001913 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001914 } else
1915 Py_XINCREF(compare);
1916
Tim Petersb9099c32002-11-12 22:08:10 +00001917 /* The list is temporarily made empty, so that mutations performed
1918 * by comparison functions can't affect the slice of memory we're
1919 * sorting (allowing mutations during sorting is a core-dump
1920 * factory, since ob_item may change).
1921 */
1922 saved_ob_size = self->ob_size;
1923 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00001924 saved_allocated = self->allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001925 self->ob_size = 0;
Tim Peters7049d812004-01-18 20:31:02 +00001926 self->ob_item = empty_ob_item = PyMem_NEW(PyObject *, 0);
Raymond Hettinger4bb95402004-02-13 11:36:39 +00001927 self->allocated = 0;
Tim Peters330f9e92002-07-19 07:05:44 +00001928
Michael W. Hudson1df0f652003-12-04 11:25:46 +00001929 if (keyfunc != NULL) {
1930 for (i=0 ; i < saved_ob_size ; i++) {
1931 value = saved_ob_item[i];
1932 key = PyObject_CallFunctionObjArgs(keyfunc, value,
1933 NULL);
1934 if (key == NULL) {
1935 for (i=i-1 ; i>=0 ; i--) {
1936 kvpair = saved_ob_item[i];
1937 value = sortwrapper_getvalue(kvpair);
1938 saved_ob_item[i] = value;
1939 Py_DECREF(kvpair);
1940 }
1941 if (self->ob_item != empty_ob_item
1942 || self->ob_size) {
1943 /* If the list changed *as well* we
1944 have two errors. We let the first
1945 one "win", but we shouldn't let
1946 what's in the list currently
1947 leak. */
1948 (void)list_ass_slice(
1949 self, 0, self->ob_size,
1950 (PyObject *)NULL);
1951 }
1952
1953 goto dsu_fail;
1954 }
1955 kvpair = build_sortwrapper(key, value);
1956 if (kvpair == NULL)
1957 goto dsu_fail;
1958 saved_ob_item[i] = kvpair;
1959 }
1960 }
1961
1962 /* Reverse sort stability achieved by initially reversing the list,
1963 applying a stable forward sort, then reversing the final result. */
1964 if (reverse && saved_ob_size > 1)
1965 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
1966
1967 merge_init(&ms, compare);
1968
Tim Petersb9099c32002-11-12 22:08:10 +00001969 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00001970 if (nremaining < 2)
1971 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001972
Tim Petersa64dc242002-08-01 02:13:36 +00001973 /* March over the array once, left to right, finding natural runs,
1974 * and extending short natural runs to minrun elements.
1975 */
Tim Petersb9099c32002-11-12 22:08:10 +00001976 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001977 hi = lo + nremaining;
1978 minrun = merge_compute_minrun(nremaining);
1979 do {
1980 int descending;
1981 int n;
Tim Peters330f9e92002-07-19 07:05:44 +00001982
Tim Petersa64dc242002-08-01 02:13:36 +00001983 /* Identify next run. */
1984 n = count_run(lo, hi, compare, &descending);
1985 if (n < 0)
1986 goto fail;
1987 if (descending)
1988 reverse_slice(lo, lo + n);
1989 /* If short, extend to min(minrun, nremaining). */
1990 if (n < minrun) {
1991 const int force = nremaining <= minrun ?
1992 nremaining : minrun;
1993 if (binarysort(lo, lo + force, lo + n, compare) < 0)
1994 goto fail;
1995 n = force;
1996 }
1997 /* Push run onto pending-runs stack, and maybe merge. */
1998 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00001999 ms.pending[ms.n].base = lo;
2000 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002001 ++ms.n;
2002 if (merge_collapse(&ms) < 0)
2003 goto fail;
2004 /* Advance to find next run. */
2005 lo += n;
2006 nremaining -= n;
2007 } while (nremaining);
2008 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002009
Tim Petersa64dc242002-08-01 02:13:36 +00002010 if (merge_force_collapse(&ms) < 0)
2011 goto fail;
2012 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002013 assert(ms.pending[0].base == saved_ob_item);
2014 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002015
2016succeed:
2017 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002018fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002019 if (keyfunc != NULL) {
2020 for (i=0 ; i < saved_ob_size ; i++) {
2021 kvpair = saved_ob_item[i];
2022 value = sortwrapper_getvalue(kvpair);
2023 saved_ob_item[i] = value;
2024 Py_DECREF(kvpair);
2025 }
2026 }
2027
Tim Petersb9099c32002-11-12 22:08:10 +00002028 if (self->ob_item != empty_ob_item || self->ob_size) {
2029 /* The user mucked with the list during the sort. */
2030 (void)list_ass_slice(self, 0, self->ob_size, (PyObject *)NULL);
2031 if (result != NULL) {
2032 PyErr_SetString(PyExc_ValueError,
2033 "list modified during sort");
2034 result = NULL;
2035 }
2036 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002037
2038 if (reverse && saved_ob_size > 1)
2039 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2040
2041 merge_freemem(&ms);
2042
2043dsu_fail:
Tim Petersb9099c32002-11-12 22:08:10 +00002044 if (self->ob_item == empty_ob_item)
2045 PyMem_FREE(empty_ob_item);
2046 self->ob_size = saved_ob_size;
2047 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002048 self->allocated = saved_allocated;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002049 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002050 Py_XINCREF(result);
2051 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002052}
Tim Peters330f9e92002-07-19 07:05:44 +00002053#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002054#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002055
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002056int
Fred Drakea2f55112000-07-09 15:16:51 +00002057PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002058{
2059 if (v == NULL || !PyList_Check(v)) {
2060 PyErr_BadInternalCall();
2061 return -1;
2062 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002063 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002064 if (v == NULL)
2065 return -1;
2066 Py_DECREF(v);
2067 return 0;
2068}
2069
Guido van Rossumb86c5492001-02-12 22:06:02 +00002070static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002071listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002072{
Tim Peters326b4482002-07-19 04:04:16 +00002073 if (self->ob_size > 1)
2074 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002075 Py_INCREF(Py_None);
2076 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00002077}
2078
Guido van Rossum84c76f51990-10-30 13:32:20 +00002079int
Fred Drakea2f55112000-07-09 15:16:51 +00002080PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002081{
Tim Peters6063e262002-08-08 01:06:39 +00002082 PyListObject *self = (PyListObject *)v;
2083
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002084 if (v == NULL || !PyList_Check(v)) {
2085 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002086 return -1;
2087 }
Tim Peters6063e262002-08-08 01:06:39 +00002088 if (self->ob_size > 1)
2089 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002090 return 0;
2091}
2092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002094PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002095{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002096 PyObject *w;
2097 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002098 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002099 if (v == NULL || !PyList_Check(v)) {
2100 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002101 return NULL;
2102 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002103 n = ((PyListObject *)v)->ob_size;
2104 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002105 if (w == NULL)
2106 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002107 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002108 memcpy((void *)p,
2109 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002110 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002111 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002112 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002113 p++;
2114 }
2115 return w;
2116}
2117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002118static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002119listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002120{
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002121 int i, start=0, stop=self->ob_size;
2122 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002123
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002124 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2125 _PyEval_SliceIndex, &start,
2126 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002127 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002128 if (start < 0) {
2129 start += self->ob_size;
2130 if (start < 0)
2131 start = 0;
2132 }
2133 if (stop < 0) {
2134 stop += self->ob_size;
2135 if (stop < 0)
2136 stop = 0;
2137 }
2138 else if (stop > self->ob_size)
2139 stop = self->ob_size;
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002140 for (i = start; i < stop; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002141 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2142 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002143 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002144 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002145 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002147 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002148 return NULL;
2149}
2150
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002151static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002152listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002153{
2154 int count = 0;
2155 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002156
Guido van Rossume6f7d181991-10-20 20:20:40 +00002157 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002158 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2159 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002160 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002161 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002162 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002163 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002164 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002165}
2166
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002167static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002168listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002169{
2170 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002171
Guido van Rossumed98d481991-03-06 13:07:53 +00002172 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002173 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2174 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175 if (list_ass_slice(self, i, i+1,
2176 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00002177 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178 Py_INCREF(Py_None);
2179 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00002180 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002181 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002182 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002183 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002184 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002185 return NULL;
2186}
2187
Jeremy Hylton8caad492000-06-23 14:18:11 +00002188static int
2189list_traverse(PyListObject *o, visitproc visit, void *arg)
2190{
2191 int i, err;
2192 PyObject *x;
2193
2194 for (i = o->ob_size; --i >= 0; ) {
2195 x = o->ob_item[i];
2196 if (x != NULL) {
2197 err = visit(x, arg);
2198 if (err)
2199 return err;
2200 }
2201 }
2202 return 0;
2203}
2204
2205static int
2206list_clear(PyListObject *lp)
2207{
2208 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
2209 return 0;
2210}
2211
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002212static PyObject *
2213list_richcompare(PyObject *v, PyObject *w, int op)
2214{
2215 PyListObject *vl, *wl;
2216 int i;
2217
2218 if (!PyList_Check(v) || !PyList_Check(w)) {
2219 Py_INCREF(Py_NotImplemented);
2220 return Py_NotImplemented;
2221 }
2222
2223 vl = (PyListObject *)v;
2224 wl = (PyListObject *)w;
2225
2226 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
2227 /* Shortcut: if the lengths differ, the lists differ */
2228 PyObject *res;
2229 if (op == Py_EQ)
2230 res = Py_False;
2231 else
2232 res = Py_True;
2233 Py_INCREF(res);
2234 return res;
2235 }
2236
2237 /* Search for the first index where items are different */
2238 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
2239 int k = PyObject_RichCompareBool(vl->ob_item[i],
2240 wl->ob_item[i], Py_EQ);
2241 if (k < 0)
2242 return NULL;
2243 if (!k)
2244 break;
2245 }
2246
2247 if (i >= vl->ob_size || i >= wl->ob_size) {
2248 /* No more items to compare -- compare sizes */
2249 int vs = vl->ob_size;
2250 int ws = wl->ob_size;
2251 int cmp;
2252 PyObject *res;
2253 switch (op) {
2254 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002255 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002256 case Py_EQ: cmp = vs == ws; break;
2257 case Py_NE: cmp = vs != ws; break;
2258 case Py_GT: cmp = vs > ws; break;
2259 case Py_GE: cmp = vs >= ws; break;
2260 default: return NULL; /* cannot happen */
2261 }
2262 if (cmp)
2263 res = Py_True;
2264 else
2265 res = Py_False;
2266 Py_INCREF(res);
2267 return res;
2268 }
2269
2270 /* We have an item that differs -- shortcuts for EQ/NE */
2271 if (op == Py_EQ) {
2272 Py_INCREF(Py_False);
2273 return Py_False;
2274 }
2275 if (op == Py_NE) {
2276 Py_INCREF(Py_True);
2277 return Py_True;
2278 }
2279
2280 /* Compare the final item again using the proper operator */
2281 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2282}
2283
Tim Peters6d6c1a32001-08-02 04:15:00 +00002284static int
2285list_init(PyListObject *self, PyObject *args, PyObject *kw)
2286{
2287 PyObject *arg = NULL;
2288 static char *kwlist[] = {"sequence", 0};
2289
2290 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2291 return -1;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002292 /* Empty previous contents */
2293 if (self->ob_size != 0) {
2294 if (list_ass_slice(self, 0, self->ob_size, (PyObject *)NULL) != 0)
2295 return -1;
2296 }
2297 if (arg != NULL) {
2298 PyObject *rv = listextend(self, arg);
2299 if (rv == NULL)
2300 return -1;
2301 Py_DECREF(rv);
2302 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002303 return 0;
2304}
2305
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002306static long
2307list_nohash(PyObject *self)
2308{
2309 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2310 return -1;
2311}
2312
Raymond Hettinger1021c442003-11-07 15:38:09 +00002313static PyObject *list_iter(PyObject *seq);
2314static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2315
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002316PyDoc_STRVAR(getitem_doc,
2317"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002318PyDoc_STRVAR(reversed_doc,
2319"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002320PyDoc_STRVAR(append_doc,
2321"L.append(object) -- append object to end");
2322PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002323"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002324PyDoc_STRVAR(insert_doc,
2325"L.insert(index, object) -- insert object before index");
2326PyDoc_STRVAR(pop_doc,
2327"L.pop([index]) -> item -- remove and return item at index (default last)");
2328PyDoc_STRVAR(remove_doc,
2329"L.remove(value) -- remove first occurrence of value");
2330PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002331"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002332PyDoc_STRVAR(count_doc,
2333"L.count(value) -> integer -- return number of occurrences of value");
2334PyDoc_STRVAR(reverse_doc,
2335"L.reverse() -- reverse *IN PLACE*");
2336PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002337"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2338cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002339
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002340static PyObject *list_subscript(PyListObject*, PyObject*);
2341
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002342static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002343 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002344 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002345 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002346 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002347 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002348 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002349 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002350 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002351 {"count", (PyCFunction)listcount, METH_O, count_doc},
2352 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002353 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002354 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002355};
2356
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002357static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002358 (inquiry)list_length, /* sq_length */
2359 (binaryfunc)list_concat, /* sq_concat */
2360 (intargfunc)list_repeat, /* sq_repeat */
2361 (intargfunc)list_item, /* sq_item */
2362 (intintargfunc)list_slice, /* sq_slice */
2363 (intobjargproc)list_ass_item, /* sq_ass_item */
2364 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
2365 (objobjproc)list_contains, /* sq_contains */
2366 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2367 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002368};
2369
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002370PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002371"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002372"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002373
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002374static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002375list_subscript(PyListObject* self, PyObject* item)
2376{
2377 if (PyInt_Check(item)) {
2378 long i = PyInt_AS_LONG(item);
2379 if (i < 0)
2380 i += PyList_GET_SIZE(self);
2381 return list_item(self, i);
2382 }
2383 else if (PyLong_Check(item)) {
2384 long i = PyLong_AsLong(item);
2385 if (i == -1 && PyErr_Occurred())
2386 return NULL;
2387 if (i < 0)
2388 i += PyList_GET_SIZE(self);
2389 return list_item(self, i);
2390 }
2391 else if (PySlice_Check(item)) {
2392 int start, stop, step, slicelength, cur, i;
2393 PyObject* result;
2394 PyObject* it;
2395
2396 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2397 &start, &stop, &step, &slicelength) < 0) {
2398 return NULL;
2399 }
2400
2401 if (slicelength <= 0) {
2402 return PyList_New(0);
2403 }
2404 else {
2405 result = PyList_New(slicelength);
2406 if (!result) return NULL;
2407
Tim Peters3b01a122002-07-19 02:35:45 +00002408 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002409 cur += step, i++) {
2410 it = PyList_GET_ITEM(self, cur);
2411 Py_INCREF(it);
2412 PyList_SET_ITEM(result, i, it);
2413 }
Tim Peters3b01a122002-07-19 02:35:45 +00002414
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002415 return result;
2416 }
2417 }
2418 else {
2419 PyErr_SetString(PyExc_TypeError,
2420 "list indices must be integers");
2421 return NULL;
2422 }
2423}
2424
Tim Peters3b01a122002-07-19 02:35:45 +00002425static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002426list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2427{
2428 if (PyInt_Check(item)) {
2429 long i = PyInt_AS_LONG(item);
2430 if (i < 0)
2431 i += PyList_GET_SIZE(self);
2432 return list_ass_item(self, i, value);
2433 }
2434 else if (PyLong_Check(item)) {
2435 long i = PyLong_AsLong(item);
2436 if (i == -1 && PyErr_Occurred())
2437 return -1;
2438 if (i < 0)
2439 i += PyList_GET_SIZE(self);
2440 return list_ass_item(self, i, value);
2441 }
2442 else if (PySlice_Check(item)) {
2443 int start, stop, step, slicelength;
2444
2445 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2446 &start, &stop, &step, &slicelength) < 0) {
2447 return -1;
2448 }
2449
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002450 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2451 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2452 return list_ass_slice(self, start, stop, value);
2453
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002454 if (value == NULL) {
2455 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002456 PyObject **garbage;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002457 int cur, i, j;
Tim Peters3b01a122002-07-19 02:35:45 +00002458
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002459 if (slicelength <= 0)
2460 return 0;
2461
2462 if (step < 0) {
2463 stop = start + 1;
2464 start = stop + step*(slicelength - 1) - 1;
2465 step = -step;
2466 }
2467
2468 garbage = (PyObject**)
2469 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002470
2471 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002472 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002473 for (cur = start, i = 0;
2474 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002475 cur += step, i++) {
2476 int lim = step;
2477
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002478 garbage[i] = PyList_GET_ITEM(self, cur);
2479
Michael W. Hudson56796f62002-07-29 14:35:04 +00002480 if (cur + step >= self->ob_size) {
2481 lim = self->ob_size - cur - 1;
2482 }
2483
2484 for (j = 0; j < lim; j++) {
Tim Peters3b01a122002-07-19 02:35:45 +00002485 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00002486 PyList_GET_ITEM(self,
2487 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002488 }
2489 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002490 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002491 cur < self->ob_size; cur++) {
2492 PyList_SET_ITEM(self, cur - slicelength,
2493 PyList_GET_ITEM(self, cur));
2494 }
2495 self->ob_size -= slicelength;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002496 list_resize(self, self->ob_size);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002497
2498 for (i = 0; i < slicelength; i++) {
2499 Py_DECREF(garbage[i]);
2500 }
2501 PyMem_FREE(garbage);
2502
2503 return 0;
2504 }
2505 else {
2506 /* assign slice */
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002507 PyObject **garbage, *ins, *seq;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002508 int cur, i;
2509
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002510 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002511 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002512 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002513 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002514 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002515 else {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002516 char msg[256];
2517 PyOS_snprintf(msg, sizeof(msg),
2518 "must assign sequence (not \"%.200s\") to extended slice",
2519 value->ob_type->tp_name);
2520 seq = PySequence_Fast(value, msg);
2521 if (!seq)
2522 return -1;
2523 }
2524
2525 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2526 PyErr_Format(PyExc_ValueError,
2527 "attempt to assign sequence of size %d to extended slice of size %d",
2528 PySequence_Fast_GET_SIZE(seq),
2529 slicelength);
2530 Py_DECREF(seq);
2531 return -1;
2532 }
2533
2534 if (!slicelength) {
2535 Py_DECREF(seq);
2536 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002537 }
2538
2539 garbage = (PyObject**)
2540 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002541
2542 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002543 cur += step, i++) {
2544 garbage[i] = PyList_GET_ITEM(self, cur);
Tim Peters3b01a122002-07-19 02:35:45 +00002545
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002546 ins = PySequence_Fast_GET_ITEM(seq, i);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002547 Py_INCREF(ins);
2548 PyList_SET_ITEM(self, cur, ins);
2549 }
2550
2551 for (i = 0; i < slicelength; i++) {
2552 Py_DECREF(garbage[i]);
2553 }
Tim Peters3b01a122002-07-19 02:35:45 +00002554
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002555 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002556 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002557
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002558 return 0;
2559 }
Tim Peters3b01a122002-07-19 02:35:45 +00002560 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002561 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002562 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002563 "list indices must be integers");
2564 return -1;
2565 }
2566}
2567
2568static PyMappingMethods list_as_mapping = {
2569 (inquiry)list_length,
2570 (binaryfunc)list_subscript,
2571 (objobjargproc)list_ass_subscript
2572};
2573
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002574PyTypeObject PyList_Type = {
2575 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002576 0,
2577 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002578 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002579 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002580 (destructor)list_dealloc, /* tp_dealloc */
2581 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002582 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002583 0, /* tp_setattr */
2584 0, /* tp_compare */
2585 (reprfunc)list_repr, /* tp_repr */
2586 0, /* tp_as_number */
2587 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002588 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002589 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002590 0, /* tp_call */
2591 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002592 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002593 0, /* tp_setattro */
2594 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002595 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002596 Py_TPFLAGS_BASETYPE, /* tp_flags */
2597 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002598 (traverseproc)list_traverse, /* tp_traverse */
2599 (inquiry)list_clear, /* tp_clear */
2600 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002601 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002602 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002603 0, /* tp_iternext */
2604 list_methods, /* tp_methods */
2605 0, /* tp_members */
2606 0, /* tp_getset */
2607 0, /* tp_base */
2608 0, /* tp_dict */
2609 0, /* tp_descr_get */
2610 0, /* tp_descr_set */
2611 0, /* tp_dictoffset */
2612 (initproc)list_init, /* tp_init */
2613 PyType_GenericAlloc, /* tp_alloc */
2614 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002615 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002616};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002617
2618
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002619/*********************** List Iterator **************************/
2620
2621typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002622 PyObject_HEAD
2623 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002624 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002625} listiterobject;
2626
2627PyTypeObject PyListIter_Type;
2628
Guido van Rossum5086e492002-07-16 15:56:52 +00002629static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002630list_iter(PyObject *seq)
2631{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002632 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002633
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002634 if (!PyList_Check(seq)) {
2635 PyErr_BadInternalCall();
2636 return NULL;
2637 }
2638 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2639 if (it == NULL)
2640 return NULL;
2641 it->it_index = 0;
2642 Py_INCREF(seq);
2643 it->it_seq = (PyListObject *)seq;
2644 _PyObject_GC_TRACK(it);
2645 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002646}
2647
2648static void
2649listiter_dealloc(listiterobject *it)
2650{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002651 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002652 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002653 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002654}
2655
2656static int
2657listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2658{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002659 if (it->it_seq == NULL)
2660 return 0;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002661 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002662}
2663
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002664static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002665listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002666{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002667 PyListObject *seq;
2668 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002669
Tim Peters93b2cc42002-06-01 05:22:55 +00002670 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002671 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002672 if (seq == NULL)
2673 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002674 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002675
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002676 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002677 item = PyList_GET_ITEM(seq, it->it_index);
2678 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002679 Py_INCREF(item);
2680 return item;
2681 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002682
2683 Py_DECREF(seq);
2684 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002685 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002686}
2687
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002688PyTypeObject PyListIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002689 PyObject_HEAD_INIT(&PyType_Type)
2690 0, /* ob_size */
2691 "listiterator", /* tp_name */
2692 sizeof(listiterobject), /* tp_basicsize */
2693 0, /* tp_itemsize */
2694 /* methods */
2695 (destructor)listiter_dealloc, /* tp_dealloc */
2696 0, /* tp_print */
2697 0, /* tp_getattr */
2698 0, /* tp_setattr */
2699 0, /* tp_compare */
2700 0, /* tp_repr */
2701 0, /* tp_as_number */
2702 0, /* tp_as_sequence */
2703 0, /* tp_as_mapping */
2704 0, /* tp_hash */
2705 0, /* tp_call */
2706 0, /* tp_str */
2707 PyObject_GenericGetAttr, /* tp_getattro */
2708 0, /* tp_setattro */
2709 0, /* tp_as_buffer */
2710 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2711 0, /* tp_doc */
2712 (traverseproc)listiter_traverse, /* tp_traverse */
2713 0, /* tp_clear */
2714 0, /* tp_richcompare */
2715 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002716 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002717 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002718 0, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002719 0, /* tp_members */
2720 0, /* tp_getset */
2721 0, /* tp_base */
2722 0, /* tp_dict */
2723 0, /* tp_descr_get */
2724 0, /* tp_descr_set */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002725};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002726
2727/*********************** List Reverse Iterator **************************/
2728
2729typedef struct {
2730 PyObject_HEAD
2731 long it_index;
Raymond Hettinger001f2282003-11-08 11:58:44 +00002732 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger1021c442003-11-07 15:38:09 +00002733} listreviterobject;
2734
2735PyTypeObject PyListRevIter_Type;
2736
2737static PyObject *
2738list_reversed(PyListObject *seq, PyObject *unused)
2739{
2740 listreviterobject *it;
2741
2742 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2743 if (it == NULL)
2744 return NULL;
2745 assert(PyList_Check(seq));
2746 it->it_index = PyList_GET_SIZE(seq) - 1;
2747 Py_INCREF(seq);
2748 it->it_seq = seq;
2749 PyObject_GC_Track(it);
2750 return (PyObject *)it;
2751}
2752
2753static void
2754listreviter_dealloc(listreviterobject *it)
2755{
2756 PyObject_GC_UnTrack(it);
2757 Py_XDECREF(it->it_seq);
2758 PyObject_GC_Del(it);
2759}
2760
2761static int
2762listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2763{
2764 if (it->it_seq == NULL)
2765 return 0;
2766 return visit((PyObject *)it->it_seq, arg);
2767}
2768
2769static PyObject *
2770listreviter_next(listreviterobject *it)
2771{
2772 PyObject *item = NULL;
2773
2774 assert(PyList_Check(it->it_seq));
2775 if (it->it_index >= 0) {
2776 assert(it->it_index < PyList_GET_SIZE(it->it_seq));
2777 item = PyList_GET_ITEM(it->it_seq, it->it_index);
2778 it->it_index--;
2779 Py_INCREF(item);
Raymond Hettinger001f2282003-11-08 11:58:44 +00002780 } else if (it->it_seq != NULL) {
2781 Py_DECREF(it->it_seq);
2782 it->it_seq = NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002783 }
2784 return item;
2785}
2786
2787PyTypeObject PyListRevIter_Type = {
2788 PyObject_HEAD_INIT(&PyType_Type)
2789 0, /* ob_size */
2790 "listreverseiterator", /* tp_name */
2791 sizeof(listreviterobject), /* tp_basicsize */
2792 0, /* tp_itemsize */
2793 /* methods */
2794 (destructor)listreviter_dealloc, /* tp_dealloc */
2795 0, /* tp_print */
2796 0, /* tp_getattr */
2797 0, /* tp_setattr */
2798 0, /* tp_compare */
2799 0, /* tp_repr */
2800 0, /* tp_as_number */
2801 0, /* tp_as_sequence */
2802 0, /* tp_as_mapping */
2803 0, /* tp_hash */
2804 0, /* tp_call */
2805 0, /* tp_str */
2806 PyObject_GenericGetAttr, /* tp_getattro */
2807 0, /* tp_setattro */
2808 0, /* tp_as_buffer */
2809 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2810 0, /* tp_doc */
2811 (traverseproc)listreviter_traverse, /* tp_traverse */
2812 0, /* tp_clear */
2813 0, /* tp_richcompare */
2814 0, /* tp_weaklistoffset */
2815 PyObject_SelfIter, /* tp_iter */
2816 (iternextfunc)listreviter_next, /* tp_iternext */
2817 0,
2818};