blob: e2b9b2b7c104bcaae862cfa8c96d4e5ad75241db [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
Fred Drakea2f55112000-07-09 15:16:51 +000012roundupsize(int n)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000013{
Tim Peters65b8b842001-05-26 05:28:40 +000014 unsigned int nbits = 0;
15 unsigned int n2 = (unsigned int)n >> 5;
16
Tim Peters3b01a122002-07-19 02:35:45 +000017 /* Round up:
Tim Peters65b8b842001-05-26 05:28:40 +000018 * If n < 256, to a multiple of 8.
19 * If n < 2048, to a multiple of 64.
20 * If n < 16384, to a multiple of 512.
21 * If n < 131072, to a multiple of 4096.
22 * If n < 1048576, to a multiple of 32768.
23 * If n < 8388608, to a multiple of 262144.
24 * If n < 67108864, to a multiple of 2097152.
25 * If n < 536870912, to a multiple of 16777216.
26 * ...
27 * If n < 2**(5+3*i), to a multiple of 2**(3*i).
28 *
29 * This over-allocates proportional to the list size, making room
30 * 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
33 * system realloc() (which is a reality, e.g., across all flavors
34 * of Windows, with Win9x behavior being particularly bad -- and
35 * we've still got address space fragmentation problems on Win9x
36 * even with this scheme, although it requires much longer lists to
37 * provoke them than it used to).
38 */
39 do {
40 n2 >>= 3;
41 nbits += 3;
42 } while (n2);
43 return ((n >> nbits) + 1) << nbits;
44 }
Guido van Rossuma46d51d1995-01-26 22:59:43 +000045
Neal Norwitzd4e5be52002-05-22 23:19:17 +000046#define NRESIZE(var, type, nitems) \
47do { \
48 size_t _new_size = roundupsize(nitems); \
49 if (_new_size <= ((~(size_t)0) / sizeof(type))) \
50 PyMem_RESIZE(var, type, _new_size); \
51 else \
52 var = NULL; \
53} while (0)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000054
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000056PyList_New(int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000059 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 return NULL;
63 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000065 /* Check for overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 if (nbytes / sizeof(PyObject *) != (size_t)size) {
67 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000068 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000069 op = PyObject_GC_New(PyListObject, &PyList_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 if (op == NULL) {
Neil Schemenauere83c00e2001-08-29 23:54:21 +000071 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 }
73 if (size <= 0) {
74 op->ob_item = NULL;
75 }
76 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +000077 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 if (op->ob_item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080 }
Neal Norwitz35fc7602002-06-13 21:11:11 +000081 memset(op->ob_item, 0, sizeof(*op->ob_item) * size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000083 op->ob_size = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000084 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086}
87
88int
Fred Drakea2f55112000-07-09 15:16:51 +000089PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 if (!PyList_Check(op)) {
92 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 return -1;
94 }
95 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097}
98
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000100
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000102PyList_GetItem(PyObject *op, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 if (!PyList_Check(op)) {
105 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 return NULL;
107 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000109 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 indexerr = PyString_FromString(
111 "list index out of range");
112 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113 return NULL;
114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116}
117
118int
Fred Drakea2f55112000-07-09 15:16:51 +0000119PyList_SetItem(register PyObject *op, register int i,
120 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 register PyObject *olditem;
123 register PyObject **p;
124 if (!PyList_Check(op)) {
125 Py_XDECREF(newitem);
126 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000127 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
130 Py_XDECREF(newitem);
131 PyErr_SetString(PyExc_IndexError,
132 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000133 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000136 olditem = *p;
137 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 return 0;
140}
141
142static int
Fred Drakea2f55112000-07-09 15:16:51 +0000143ins1(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144{
145 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000147 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000149 return -1;
150 }
Trent Micka5846642000-08-13 22:47:45 +0000151 if (self->ob_size == INT_MAX) {
152 PyErr_SetString(PyExc_OverflowError,
153 "cannot add more objects to list");
154 return -1;
155 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 items = self->ob_item;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 NRESIZE(items, PyObject *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000158 if (items == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000160 return -1;
161 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162 if (where < 0)
163 where = 0;
164 if (where > self->ob_size)
165 where = self->ob_size;
166 for (i = self->ob_size; --i >= where; )
167 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;
170 self->ob_item = items;
171 self->ob_size++;
172 return 0;
173}
174
175int
Fred Drakea2f55112000-07-09 15:16:51 +0000176PyList_Insert(PyObject *op, int where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 if (!PyList_Check(op)) {
179 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000180 return -1;
181 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183}
184
185int
Fred Drakea2f55112000-07-09 15:16:51 +0000186PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 if (!PyList_Check(op)) {
189 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000190 return -1;
191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 return ins1((PyListObject *)op,
193 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194}
195
196/* Methods */
197
198static void
Fred Drakea2f55112000-07-09 15:16:51 +0000199list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200{
201 int i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000202 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000203 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000204 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000205 /* Do it backwards, for Christian Tismer.
206 There's a simple test case where somehow this reduces
207 thrashing when a *very* large list is created and
208 immediately deleted. */
209 i = op->ob_size;
210 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000212 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000213 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000214 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000215 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000216 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217}
218
Guido van Rossum90933611991-06-07 16:10:43 +0000219static int
Fred Drakea2f55112000-07-09 15:16:51 +0000220list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221{
222 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000223
224 i = Py_ReprEnter((PyObject*)op);
225 if (i != 0) {
226 if (i < 0)
227 return i;
228 fprintf(fp, "[...]");
229 return 0;
230 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000232 for (i = 0; i < op->ob_size; i++) {
233 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000235 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
236 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000237 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000238 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239 }
240 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000241 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000242 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243}
244
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000246list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000249 PyObject *s, *temp;
250 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000251
252 i = Py_ReprEnter((PyObject*)v);
253 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000254 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000255 }
Tim Petersa7259592001-06-16 05:11:17 +0000256
257 if (v->ob_size == 0) {
258 result = PyString_FromString("[]");
259 goto Done;
260 }
261
262 pieces = PyList_New(0);
263 if (pieces == NULL)
264 goto Done;
265
266 /* Do repr() on each element. Note that this may mutate the list,
267 so must refetch the list size on each iteration. */
268 for (i = 0; i < v->ob_size; ++i) {
269 int status;
270 s = PyObject_Repr(v->ob_item[i]);
271 if (s == NULL)
272 goto Done;
273 status = PyList_Append(pieces, s);
274 Py_DECREF(s); /* append created a new ref */
275 if (status < 0)
276 goto Done;
277 }
278
279 /* Add "[]" decorations to the first and last items. */
280 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000282 if (s == NULL)
283 goto Done;
284 temp = PyList_GET_ITEM(pieces, 0);
285 PyString_ConcatAndDel(&s, temp);
286 PyList_SET_ITEM(pieces, 0, s);
287 if (s == NULL)
288 goto Done;
289
290 s = PyString_FromString("]");
291 if (s == NULL)
292 goto Done;
293 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
294 PyString_ConcatAndDel(&temp, s);
295 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
296 if (temp == NULL)
297 goto Done;
298
299 /* Paste them all together with ", " between. */
300 s = PyString_FromString(", ");
301 if (s == NULL)
302 goto Done;
303 result = _PyString_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000304 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000305
306Done:
307 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000308 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000309 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310}
311
312static int
Fred Drakea2f55112000-07-09 15:16:51 +0000313list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314{
315 return a->ob_size;
316}
317
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000318
319
320static int
Fred Drakea2f55112000-07-09 15:16:51 +0000321list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000322{
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000323 int i;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000324
325 for (i = 0; i < a->ob_size; ++i) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000326 int cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
327 Py_EQ);
328 if (cmp > 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000329 return 1;
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000330 else if (cmp < 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000331 return -1;
332 }
333 return 0;
334}
335
336
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000338list_item(PyListObject *a, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339{
340 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000341 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 indexerr = PyString_FromString(
343 "list index out of range");
344 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345 return NULL;
346 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348 return a->ob_item[i];
349}
350
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000352list_slice(PyListObject *a, int ilow, int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 int i;
356 if (ilow < 0)
357 ilow = 0;
358 else if (ilow > a->ob_size)
359 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 if (ihigh < ilow)
361 ihigh = ilow;
362 else if (ihigh > a->ob_size)
363 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365 if (np == NULL)
366 return NULL;
367 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 PyObject *v = a->ob_item[i];
369 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370 np->ob_item[i - ilow] = v;
371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000376PyList_GetSlice(PyObject *a, int ilow, int ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000377{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 if (!PyList_Check(a)) {
379 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000380 return NULL;
381 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000383}
384
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000386list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387{
388 int size;
389 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 PyListObject *np;
391 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000392 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000393 "can only concatenate list (not \"%.200s\") to list",
394 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 return NULL;
396 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000401 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402 }
403 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 PyObject *v = a->ob_item[i];
405 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406 np->ob_item[i] = v;
407 }
408 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 PyObject *v = b->ob_item[i];
410 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411 np->ob_item[i + a->ob_size] = v;
412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414#undef b
415}
416
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000418list_repeat(PyListObject *a, int n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000419{
420 int i, j;
421 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyListObject *np;
423 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000424 if (n < 0)
425 n = 0;
426 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000428 if (np == NULL)
429 return NULL;
430 p = np->ob_item;
431 for (i = 0; i < n; i++) {
432 for (j = 0; j < a->ob_size; j++) {
433 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000435 p++;
436 }
437 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000439}
440
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441static int
Fred Drakea2f55112000-07-09 15:16:51 +0000442list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000444 /* Because [X]DECREF can recursively invoke list operations on
445 this list, we must postpone all [X]DECREF activity until
446 after the list is back in its canonical shape. Therefore
447 we must allocate an additional array, 'recycle', into which
448 we temporarily copy the items that are deleted from the
449 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 PyObject **recycle, **p;
451 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452 int n; /* Size of replacement list */
453 int d; /* Change in size */
454 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456 if (v == NULL)
457 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000460 if (a == b) {
461 /* Special case "a[i:j] = a" -- copy b first */
462 int ret;
463 v = list_slice(b, 0, n);
464 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000466 return ret;
467 }
468 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000469 else {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000470 PyErr_Format(PyExc_TypeError,
471 "must assign list (not \"%.200s\") to slice",
472 v->ob_type->tp_name);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000473 return -1;
474 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475 if (ilow < 0)
476 ilow = 0;
477 else if (ilow > a->ob_size)
478 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479 if (ihigh < ilow)
480 ihigh = ilow;
481 else if (ihigh > a->ob_size)
482 ihigh = a->ob_size;
483 item = a->ob_item;
484 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000485 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000487 else
488 p = recycle = NULL;
489 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000491 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492 if (d < 0) {
493 for (/*k = ihigh*/; k < a->ob_size; k++)
494 item[k+d] = item[k];
495 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497 a->ob_item = item;
498 }
499 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000500 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000502 if (item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000503 if (recycle != NULL)
504 PyMem_DEL(recycle);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000506 return -1;
507 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508 for (k = a->ob_size; --k >= ihigh; )
509 item[k+d] = item[k];
510 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000511 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 a->ob_item = item;
513 a->ob_size += d;
514 }
515 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 PyObject *w = b->ob_item[k];
517 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518 item[ilow] = w;
519 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000520 if (recycle) {
521 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 Py_XDECREF(*p);
523 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000524 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000525 if (a->ob_size == 0 && a->ob_item != NULL) {
526 PyMem_FREE(a->ob_item);
527 a->ob_item = NULL;
528 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000529 return 0;
530#undef b
531}
532
Guido van Rossum234f9421993-06-17 12:35:49 +0000533int
Fred Drakea2f55112000-07-09 15:16:51 +0000534PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000535{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536 if (!PyList_Check(a)) {
537 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000538 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000539 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000541}
542
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000543static PyObject *
544list_inplace_repeat(PyListObject *self, int n)
545{
546 PyObject **items;
547 int size, i, j;
548
549
550 size = PyList_GET_SIZE(self);
551 if (size == 0) {
552 Py_INCREF(self);
553 return (PyObject *)self;
554 }
555
556 items = self->ob_item;
557
558 if (n < 1) {
559 self->ob_item = NULL;
560 self->ob_size = 0;
561 for (i = 0; i < size; i++)
562 Py_XDECREF(items[i]);
563 PyMem_DEL(items);
564 Py_INCREF(self);
565 return (PyObject *)self;
566 }
567
568 NRESIZE(items, PyObject*, size*n);
569 if (items == NULL) {
570 PyErr_NoMemory();
571 goto finally;
572 }
573 self->ob_item = items;
574 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
575 for (j = 0; j < size; j++) {
576 PyObject *o = PyList_GET_ITEM(self, j);
577 Py_INCREF(o);
578 PyList_SET_ITEM(self, self->ob_size++, o);
579 }
580 }
581 Py_INCREF(self);
582 return (PyObject *)self;
583 finally:
584 return NULL;
585}
586
Guido van Rossum4a450d01991-04-03 19:05:18 +0000587static int
Fred Drakea2f55112000-07-09 15:16:51 +0000588list_ass_item(PyListObject *a, int i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000589{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000591 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 PyErr_SetString(PyExc_IndexError,
593 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000594 return -1;
595 }
596 if (v == NULL)
597 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000599 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000600 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000601 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000602 return 0;
603}
604
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000606ins(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000607{
608 if (ins1(self, where, v) != 0)
609 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 Py_INCREF(Py_None);
611 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612}
613
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000615listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000616{
617 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000619 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000620 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000621 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622}
623
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000625listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000626{
Guido van Rossumbf80e541993-02-08 15:49:17 +0000627 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000628}
629
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000630static int
631listextend_internal(PyListObject *self, PyObject *b)
Barry Warsawdedf6d61998-10-09 16:37:25 +0000632{
Barry Warsawdedf6d61998-10-09 16:37:25 +0000633 PyObject **items;
634 int selflen = PyList_GET_SIZE(self);
635 int blen;
636 register int i;
637
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000638 if (PyObject_Size(b) == 0) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000639 /* short circuit when b is empty */
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000640 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000641 return 0;
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000642 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000643
Barry Warsawdedf6d61998-10-09 16:37:25 +0000644 if (self == (PyListObject*)b) {
645 /* as in list_ass_slice() we must special case the
646 * situation: a.extend(a)
647 *
648 * XXX: I think this way ought to be faster than using
649 * list_slice() the way list_ass_slice() does.
650 */
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000651 Py_DECREF(b);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000652 b = PyList_New(selflen);
653 if (!b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000654 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000655 for (i = 0; i < selflen; i++) {
656 PyObject *o = PyList_GET_ITEM(self, i);
657 Py_INCREF(o);
658 PyList_SET_ITEM(b, i, o);
659 }
660 }
Barry Warsawdedf6d61998-10-09 16:37:25 +0000661
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000662 blen = PyObject_Size(b);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000663
Barry Warsawdedf6d61998-10-09 16:37:25 +0000664 /* resize a using idiom */
665 items = self->ob_item;
666 NRESIZE(items, PyObject*, selflen + blen);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000667 if (items == NULL) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000668 PyErr_NoMemory();
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669 Py_DECREF(b);
670 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000671 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000672
Barry Warsawdedf6d61998-10-09 16:37:25 +0000673 self->ob_item = items;
674
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000675 /* populate the end of self with b's items */
Barry Warsawdedf6d61998-10-09 16:37:25 +0000676 for (i = 0; i < blen; i++) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000677 PyObject *o = PySequence_Fast_GET_ITEM(b, i);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000678 Py_INCREF(o);
679 PyList_SET_ITEM(self, self->ob_size++, o);
680 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000681 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000682 return 0;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000683}
684
685
686static PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000687list_inplace_concat(PyListObject *self, PyObject *other)
688{
Tim Peters1af03e92001-05-26 19:37:54 +0000689 other = PySequence_Fast(other, "argument to += must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000690 if (!other)
691 return NULL;
692
693 if (listextend_internal(self, other) < 0)
694 return NULL;
695
696 Py_INCREF(self);
697 return (PyObject *)self;
698}
699
700static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000701listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000702{
703
Tim Peters1af03e92001-05-26 19:37:54 +0000704 b = PySequence_Fast(b, "list.extend() argument must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000705 if (!b)
706 return NULL;
707
708 if (listextend_internal(self, b) < 0)
709 return NULL;
710
711 Py_INCREF(Py_None);
712 return Py_None;
713}
714
715static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000716listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000717{
718 int i = -1;
719 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000720 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000721 return NULL;
722 if (self->ob_size == 0) {
723 /* Special-case most common failure cause */
724 PyErr_SetString(PyExc_IndexError, "pop from empty list");
725 return NULL;
726 }
727 if (i < 0)
728 i += self->ob_size;
729 if (i < 0 || i >= self->ob_size) {
730 PyErr_SetString(PyExc_IndexError, "pop index out of range");
731 return NULL;
732 }
733 v = self->ob_item[i];
734 Py_INCREF(v);
735 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
736 Py_DECREF(v);
737 return NULL;
738 }
739 return v;
740}
741
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000742/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
743static void
744reverse_slice(PyObject **lo, PyObject **hi)
745{
746 assert(lo && hi);
747
748 --hi;
749 while (lo < hi) {
750 PyObject *t = *lo;
751 *lo = *hi;
752 *hi = t;
753 ++lo;
754 --hi;
755 }
756}
757
Tim Petersa64dc242002-08-01 02:13:36 +0000758/* Lots of code for an adaptive, stable, natural mergesort. There are many
759 * pieces to this algorithm; read listsort.txt for overviews and details.
760 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000761
Guido van Rossum3f236de1996-12-10 23:55:39 +0000762/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000763 * comparison function (any callable Python object), which must not be
764 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
765 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000766 * Returns -1 on error, 1 if x < y, 0 if x >= y.
767 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000768static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000769islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000770{
Tim Petersf2a04732002-07-11 21:46:16 +0000771 PyObject *res;
772 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000773 int i;
774
Tim Peters66860f62002-08-04 17:47:26 +0000775 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000776 /* Call the user's comparison function and translate the 3-way
777 * result into true or false (or error).
778 */
Tim Petersf2a04732002-07-11 21:46:16 +0000779 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000780 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000781 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000782 Py_INCREF(x);
783 Py_INCREF(y);
784 PyTuple_SET_ITEM(args, 0, x);
785 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000786 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000788 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000789 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790 if (!PyInt_Check(res)) {
791 Py_DECREF(res);
792 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000793 "comparison function must return int");
Tim Petersa8c974c2002-07-19 03:30:57 +0000794 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000795 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 i = PyInt_AsLong(res);
797 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000798 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000799}
800
Tim Peters66860f62002-08-04 17:47:26 +0000801/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
802 * islt. This avoids a layer of function call in the usual case, and
803 * sorting does many comparisons.
804 * Returns -1 on error, 1 if x < y, 0 if x >= y.
805 */
806#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
807 PyObject_RichCompareBool(X, Y, Py_LT) : \
808 islt(X, Y, COMPARE))
809
810/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000811 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
812 started. It makes more sense in context <wink>. X and Y are PyObject*s.
813*/
Tim Peters66860f62002-08-04 17:47:26 +0000814#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000815 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000816
817/* binarysort is the best method for sorting small arrays: it does
818 few compares, but can do data movement quadratic in the number of
819 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000820 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000821 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000822 On entry, must have lo <= start <= hi, and that [lo, start) is already
823 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000824 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000825 Even in case of error, the output slice will be some permutation of
826 the input (nothing is lost or duplicated).
827*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000828static int
Fred Drakea2f55112000-07-09 15:16:51 +0000829binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
830 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000831{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000832 register int k;
833 register PyObject **l, **p, **r;
834 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000835
Tim Petersa8c974c2002-07-19 03:30:57 +0000836 assert(lo <= start && start <= hi);
837 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000838 if (lo == start)
839 ++start;
840 for (; start < hi; ++start) {
841 /* set l to where *start belongs */
842 l = lo;
843 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000844 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000845 /* Invariants:
846 * pivot >= all in [lo, l).
847 * pivot < all in [r, start).
848 * The second is vacuously true at the start.
849 */
850 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000851 do {
852 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000853 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000854 r = p;
855 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000856 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000857 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000858 assert(l == r);
859 /* The invariants still hold, so pivot >= all in [lo, l) and
860 pivot < all in [l, start), so pivot belongs at l. Note
861 that if there are elements equal to pivot, l points to the
862 first slot after them -- that's why this sort is stable.
863 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000864 Caution: using memmove is much slower under MSVC 5;
865 we're not usually moving many slots. */
866 for (p = start; p > l; --p)
867 *p = *(p-1);
868 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000869 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000870 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000871
872 fail:
873 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000874}
875
Tim Petersa64dc242002-08-01 02:13:36 +0000876/*
877Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
878is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000879
Tim Petersa64dc242002-08-01 02:13:36 +0000880 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000881
Tim Petersa64dc242002-08-01 02:13:36 +0000882or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000883
Tim Petersa64dc242002-08-01 02:13:36 +0000884 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +0000885
Tim Petersa64dc242002-08-01 02:13:36 +0000886Boolean *descending is set to 0 in the former case, or to 1 in the latter.
887For its intended use in a stable mergesort, the strictness of the defn of
888"descending" is needed so that the caller can safely reverse a descending
889sequence without violating stability (strict > ensures there are no equal
890elements to get out of order).
891
892Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000893*/
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000894static int
Tim Petersa64dc242002-08-01 02:13:36 +0000895count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000896{
Tim Petersa64dc242002-08-01 02:13:36 +0000897 int k;
898 int n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000899
Tim Petersa64dc242002-08-01 02:13:36 +0000900 assert(lo < hi);
901 *descending = 0;
902 ++lo;
903 if (lo == hi)
904 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000905
Tim Petersa64dc242002-08-01 02:13:36 +0000906 n = 2;
907 IFLT(*lo, *(lo-1)) {
908 *descending = 1;
909 for (lo = lo+1; lo < hi; ++lo, ++n) {
910 IFLT(*lo, *(lo-1))
911 ;
912 else
913 break;
914 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000915 }
Tim Petersa64dc242002-08-01 02:13:36 +0000916 else {
917 for (lo = lo+1; lo < hi; ++lo, ++n) {
918 IFLT(*lo, *(lo-1))
919 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000920 }
921 }
922
Tim Petersa64dc242002-08-01 02:13:36 +0000923 return n;
924fail:
925 return -1;
926}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000927
Tim Petersa64dc242002-08-01 02:13:36 +0000928/*
929Locate the proper position of key in a sorted vector; if the vector contains
930an element equal to key, return the position immediately to the left of
931the leftmost equal element. [gallop_right() does the same except returns
932the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000933
Tim Petersa64dc242002-08-01 02:13:36 +0000934"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000935
Tim Petersa64dc242002-08-01 02:13:36 +0000936"hint" is an index at which to begin the search, 0 <= hint < n. The closer
937hint is to the final result, the faster this runs.
938
939The return value is the int k in 0..n such that
940
941 a[k-1] < key <= a[k]
942
943pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
944key belongs at index k; or, IOW, the first k elements of a should precede
945key, and the last n-k should follow key.
946
947Returns -1 on error. See listsort.txt for info on the method.
948*/
949static int
950gallop_left(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
951{
952 int ofs;
953 int lastofs;
954 int k;
955
956 assert(key && a && n > 0 && hint >= 0 && hint < n);
957
958 a += hint;
959 lastofs = 0;
960 ofs = 1;
961 IFLT(*a, key) {
962 /* a[hint] < key -- gallop right, until
963 * a[hint + lastofs] < key <= a[hint + ofs]
964 */
965 const int maxofs = n - hint; /* &a[n-1] is highest */
966 while (ofs < maxofs) {
967 IFLT(a[ofs], key) {
968 lastofs = ofs;
969 ofs = (ofs << 1) + 1;
970 if (ofs <= 0) /* int overflow */
971 ofs = maxofs;
972 }
973 else /* key <= a[hint + ofs] */
974 break;
975 }
976 if (ofs > maxofs)
977 ofs = maxofs;
978 /* Translate back to offsets relative to &a[0]. */
979 lastofs += hint;
980 ofs += hint;
981 }
982 else {
983 /* key <= a[hint] -- gallop left, until
984 * a[hint - ofs] < key <= a[hint - lastofs]
985 */
986 const int maxofs = hint + 1; /* &a[0] is lowest */
987 while (ofs < maxofs) {
988 IFLT(*(a-ofs), key)
989 break;
990 /* key <= a[hint - ofs] */
991 lastofs = ofs;
992 ofs = (ofs << 1) + 1;
993 if (ofs <= 0) /* int overflow */
994 ofs = maxofs;
995 }
996 if (ofs > maxofs)
997 ofs = maxofs;
998 /* Translate back to positive offsets relative to &a[0]. */
999 k = lastofs;
1000 lastofs = hint - ofs;
1001 ofs = hint - k;
1002 }
1003 a -= hint;
1004
1005 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1006 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1007 * right of lastofs but no farther right than ofs. Do a binary
1008 * search, with invariant a[lastofs-1] < key <= a[ofs].
1009 */
1010 ++lastofs;
1011 while (lastofs < ofs) {
1012 int m = lastofs + ((ofs - lastofs) >> 1);
1013
1014 IFLT(a[m], key)
1015 lastofs = m+1; /* a[m] < key */
1016 else
1017 ofs = m; /* key <= a[m] */
1018 }
1019 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1020 return ofs;
1021
1022fail:
1023 return -1;
1024}
1025
1026/*
1027Exactly like gallop_left(), except that if key already exists in a[0:n],
1028finds the position immediately to the right of the rightmost equal value.
1029
1030The return value is the int k in 0..n such that
1031
1032 a[k-1] <= key < a[k]
1033
1034or -1 if error.
1035
1036The code duplication is massive, but this is enough different given that
1037we're sticking to "<" comparisons that it's much harder to follow if
1038written as one routine with yet another "left or right?" flag.
1039*/
1040static int
1041gallop_right(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
1042{
1043 int ofs;
1044 int lastofs;
1045 int k;
1046
1047 assert(key && a && n > 0 && hint >= 0 && hint < n);
1048
1049 a += hint;
1050 lastofs = 0;
1051 ofs = 1;
1052 IFLT(key, *a) {
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(key, *(a-ofs)) {
1059 lastofs = ofs;
1060 ofs = (ofs << 1) + 1;
1061 if (ofs <= 0) /* int overflow */
1062 ofs = maxofs;
1063 }
1064 else /* a[hint - ofs] <= key */
1065 break;
1066 }
1067 if (ofs > maxofs)
1068 ofs = maxofs;
1069 /* Translate back to positive offsets relative to &a[0]. */
1070 k = lastofs;
1071 lastofs = hint - ofs;
1072 ofs = hint - k;
1073 }
1074 else {
1075 /* a[hint] <= key -- gallop right, until
1076 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001077 */
Tim Petersa64dc242002-08-01 02:13:36 +00001078 const int maxofs = n - hint; /* &a[n-1] is highest */
1079 while (ofs < maxofs) {
1080 IFLT(key, a[ofs])
1081 break;
1082 /* a[hint + ofs] <= key */
1083 lastofs = ofs;
1084 ofs = (ofs << 1) + 1;
1085 if (ofs <= 0) /* int overflow */
1086 ofs = maxofs;
1087 }
1088 if (ofs > maxofs)
1089 ofs = maxofs;
1090 /* Translate back to offsets relative to &a[0]. */
1091 lastofs += hint;
1092 ofs += hint;
1093 }
1094 a -= hint;
1095
1096 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1097 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1098 * right of lastofs but no farther right than ofs. Do a binary
1099 * search, with invariant a[lastofs-1] <= key < a[ofs].
1100 */
1101 ++lastofs;
1102 while (lastofs < ofs) {
1103 int m = lastofs + ((ofs - lastofs) >> 1);
1104
1105 IFLT(key, a[m])
1106 ofs = m; /* key < a[m] */
1107 else
1108 lastofs = m+1; /* a[m] <= key */
1109 }
1110 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1111 return ofs;
1112
1113fail:
1114 return -1;
1115}
1116
1117/* The maximum number of entries in a MergeState's pending-runs stack.
1118 * This is enough to sort arrays of size up to about
1119 * 32 * phi ** MAX_MERGE_PENDING
1120 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1121 * with 2**64 elements.
1122 */
1123#define MAX_MERGE_PENDING 85
1124
1125/* If a run wins MIN_GALLOP times in a row, we switch to galloping mode,
1126 * and stay there until both runs win less often than MIN_GALLOP
1127 * consecutive times. See listsort.txt for more info.
1128 */
1129#define MIN_GALLOP 8
1130
1131/* Avoid malloc for small temp arrays. */
1132#define MERGESTATE_TEMP_SIZE 256
1133
1134/* One MergeState exists on the stack per invocation of mergesort. It's just
1135 * a convenient way to pass state around among the helper functions.
1136 */
1137typedef struct s_MergeState {
1138 /* The user-supplied comparison function. or NULL if none given. */
1139 PyObject *compare;
1140
1141 /* 'a' is temp storage to help with merges. It contains room for
1142 * alloced entries.
1143 */
1144 PyObject **a; /* may point to temparray below */
1145 int alloced;
1146
1147 /* A stack of n pending runs yet to be merged. Run #i starts at
1148 * address base[i] and extends for len[i] elements. It's always
1149 * true (so long as the indices are in bounds) that
1150 *
1151 * base[i] + len[i] == base[i+1]
1152 *
1153 * so we could cut the storage for this, but it's a minor amount,
1154 * and keeping all the info explicit simplifies the code.
1155 */
1156 int n;
1157 PyObject **base[MAX_MERGE_PENDING];
1158 int len[MAX_MERGE_PENDING];
1159
1160 /* 'a' points to this when possible, rather than muck with malloc. */
1161 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1162} MergeState;
1163
1164/* Conceptually a MergeState's constructor. */
1165static void
1166merge_init(MergeState *ms, PyObject *compare)
1167{
1168 assert(ms != NULL);
1169 ms->compare = compare;
1170 ms->a = ms->temparray;
1171 ms->alloced = MERGESTATE_TEMP_SIZE;
1172 ms->n = 0;
1173}
1174
1175/* Free all the temp memory owned by the MergeState. This must be called
1176 * when you're done with a MergeState, and may be called before then if
1177 * you want to free the temp memory early.
1178 */
1179static void
1180merge_freemem(MergeState *ms)
1181{
1182 assert(ms != NULL);
1183 if (ms->a != ms->temparray)
1184 PyMem_Free(ms->a);
1185 ms->a = ms->temparray;
1186 ms->alloced = MERGESTATE_TEMP_SIZE;
1187}
1188
1189/* Ensure enough temp memory for 'need' array slots is available.
1190 * Returns 0 on success and -1 if the memory can't be gotten.
1191 */
1192static int
1193merge_getmem(MergeState *ms, int need)
1194{
1195 assert(ms != NULL);
1196 if (need <= ms->alloced)
1197 return 0;
1198 /* Don't realloc! That can cost cycles to copy the old data, but
1199 * we don't care what's in the block.
1200 */
1201 merge_freemem(ms);
1202 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1203 if (ms->a) {
1204 ms->alloced = need;
1205 return 0;
1206 }
1207 PyErr_NoMemory();
1208 merge_freemem(ms); /* reset to sane state */
1209 return -1;
1210}
1211#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1212 merge_getmem(MS, NEED))
1213
1214/* Merge the na elements starting at pa with the nb elements starting at pb
1215 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1216 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1217 * merge, and should have na <= nb. See listsort.txt for more info.
1218 * Return 0 if successful, -1 if error.
1219 */
1220static int
1221merge_lo(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1222{
1223 int k;
1224 PyObject *compare;
1225 PyObject **dest;
1226 int result = -1; /* guilty until proved innocent */
1227
1228 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1229 if (MERGE_GETMEM(ms, na) < 0)
1230 return -1;
1231 memcpy(ms->a, pa, na * sizeof(PyObject*));
1232 dest = pa;
1233 pa = ms->a;
1234
1235 *dest++ = *pb++;
1236 --nb;
1237 if (nb == 0)
1238 goto Succeed;
1239 if (na == 1)
1240 goto CopyB;
1241
1242 compare = ms->compare;
1243 for (;;) {
1244 int acount = 0; /* # of times A won in a row */
1245 int bcount = 0; /* # of times B won in a row */
1246
1247 /* Do the straightforward thing until (if ever) one run
1248 * appears to win consistently.
1249 */
1250 for (;;) {
Tim Peters66860f62002-08-04 17:47:26 +00001251 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001252 if (k) {
1253 if (k < 0)
1254 goto Fail;
1255 *dest++ = *pb++;
1256 ++bcount;
1257 acount = 0;
1258 --nb;
1259 if (nb == 0)
1260 goto Succeed;
1261 if (bcount >= MIN_GALLOP)
1262 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001263 }
1264 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001265 *dest++ = *pa++;
1266 ++acount;
1267 bcount = 0;
1268 --na;
1269 if (na == 1)
1270 goto CopyB;
1271 if (acount >= MIN_GALLOP)
1272 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001273 }
Tim Petersa64dc242002-08-01 02:13:36 +00001274 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001275
Tim Petersa64dc242002-08-01 02:13:36 +00001276 /* One run is winning so consistently that galloping may
1277 * be a huge win. So try that, and continue galloping until
1278 * (if ever) neither run appears to be winning consistently
1279 * anymore.
1280 */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001281 do {
Tim Petersa64dc242002-08-01 02:13:36 +00001282 k = gallop_right(*pb, pa, na, 0, compare);
1283 acount = k;
1284 if (k) {
1285 if (k < 0)
1286 goto Fail;
1287 memcpy(dest, pa, k * sizeof(PyObject *));
1288 dest += k;
1289 pa += k;
1290 na -= k;
1291 if (na == 1)
1292 goto CopyB;
1293 /* na==0 is impossible now if the comparison
1294 * function is consistent, but we can't assume
1295 * that it is.
1296 */
1297 if (na == 0)
1298 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001299 }
Tim Petersa64dc242002-08-01 02:13:36 +00001300 *dest++ = *pb++;
1301 --nb;
1302 if (nb == 0)
1303 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001304
Tim Petersa64dc242002-08-01 02:13:36 +00001305 k = gallop_left(*pa, pb, nb, 0, compare);
1306 bcount = k;
1307 if (k) {
1308 if (k < 0)
1309 goto Fail;
1310 memmove(dest, pb, k * sizeof(PyObject *));
1311 dest += k;
1312 pb += k;
1313 nb -= k;
1314 if (nb == 0)
1315 goto Succeed;
1316 }
1317 *dest++ = *pa++;
1318 --na;
1319 if (na == 1)
1320 goto CopyB;
1321 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1322 }
1323Succeed:
1324 result = 0;
1325Fail:
1326 if (na)
1327 memcpy(dest, pa, na * sizeof(PyObject*));
1328 return result;
1329CopyB:
1330 assert(na == 1 && nb > 0);
1331 /* The last element of pa belongs at the end of the merge. */
1332 memmove(dest, pb, nb * sizeof(PyObject *));
1333 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001334 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001335}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001336
Tim Petersa64dc242002-08-01 02:13:36 +00001337/* Merge the na elements starting at pa with the nb elements starting at pb
1338 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1339 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1340 * merge, and should have na >= nb. See listsort.txt for more info.
1341 * Return 0 if successful, -1 if error.
1342 */
1343static int
1344merge_hi(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1345{
1346 int k;
1347 PyObject *compare;
1348 PyObject **dest;
1349 int result = -1; /* guilty until proved innocent */
1350 PyObject **basea;
1351 PyObject **baseb;
1352
1353 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1354 if (MERGE_GETMEM(ms, nb) < 0)
1355 return -1;
1356 dest = pb + nb - 1;
1357 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1358 basea = pa;
1359 baseb = ms->a;
1360 pb = ms->a + nb - 1;
1361 pa += na - 1;
1362
1363 *dest-- = *pa--;
1364 --na;
1365 if (na == 0)
1366 goto Succeed;
1367 if (nb == 1)
1368 goto CopyA;
1369
1370 compare = ms->compare;
1371 for (;;) {
1372 int acount = 0; /* # of times A won in a row */
1373 int bcount = 0; /* # of times B won in a row */
1374
1375 /* Do the straightforward thing until (if ever) one run
1376 * appears to win consistently.
1377 */
1378 for (;;) {
Tim Peters66860f62002-08-04 17:47:26 +00001379 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001380 if (k) {
1381 if (k < 0)
1382 goto Fail;
1383 *dest-- = *pa--;
1384 ++acount;
1385 bcount = 0;
1386 --na;
1387 if (na == 0)
1388 goto Succeed;
1389 if (acount >= MIN_GALLOP)
1390 break;
1391 }
1392 else {
1393 *dest-- = *pb--;
1394 ++bcount;
1395 acount = 0;
1396 --nb;
1397 if (nb == 1)
1398 goto CopyA;
1399 if (bcount >= MIN_GALLOP)
1400 break;
1401 }
1402 }
1403
1404 /* One run is winning so consistently that galloping may
1405 * be a huge win. So try that, and continue galloping until
1406 * (if ever) neither run appears to be winning consistently
1407 * anymore.
1408 */
1409 do {
1410 k = gallop_right(*pb, basea, na, na-1, compare);
1411 if (k < 0)
1412 goto Fail;
1413 k = na - k;
1414 acount = k;
1415 if (k) {
1416 dest -= k;
1417 pa -= k;
1418 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1419 na -= k;
1420 if (na == 0)
1421 goto Succeed;
1422 }
1423 *dest-- = *pb--;
1424 --nb;
1425 if (nb == 1)
1426 goto CopyA;
1427
1428 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1429 if (k < 0)
1430 goto Fail;
1431 k = nb - k;
1432 bcount = k;
1433 if (k) {
1434 dest -= k;
1435 pb -= k;
1436 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1437 nb -= k;
1438 if (nb == 1)
1439 goto CopyA;
1440 /* nb==0 is impossible now if the comparison
1441 * function is consistent, but we can't assume
1442 * that it is.
1443 */
1444 if (nb == 0)
1445 goto Succeed;
1446 }
1447 *dest-- = *pa--;
1448 --na;
1449 if (na == 0)
1450 goto Succeed;
1451 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1452 }
1453Succeed:
1454 result = 0;
1455Fail:
1456 if (nb)
1457 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1458 return result;
1459CopyA:
1460 assert(nb == 1 && na > 0);
1461 /* The first element of pb belongs at the front of the merge. */
1462 dest -= na;
1463 pa -= na;
1464 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1465 *dest = *pb;
1466 return 0;
1467}
1468
1469/* Merge the two runs at stack indices i and i+1.
1470 * Returns 0 on success, -1 on error.
1471 */
1472static int
1473merge_at(MergeState *ms, int i)
1474{
1475 PyObject **pa, **pb;
1476 int na, nb;
1477 int k;
1478 PyObject *compare;
1479
1480 assert(ms != NULL);
1481 assert(ms->n >= 2);
1482 assert(i >= 0);
1483 assert(i == ms->n - 2 || i == ms->n - 3);
1484
1485 pa = ms->base[i];
1486 pb = ms->base[i+1];
1487 na = ms->len[i];
1488 nb = ms->len[i+1];
1489 assert(na > 0 && nb > 0);
1490 assert(pa + na == pb);
1491
1492 /* Record the length of the combined runs; if i is the 3rd-last
1493 * run now, also slide over the last run (which isn't involved
1494 * in this merge). The current run i+1 goes away in any case.
1495 */
1496 if (i == ms->n - 3) {
1497 ms->len[i+1] = ms->len[i+2];
1498 ms->base[i+1] = ms->base[i+2];
1499 }
1500 ms->len[i] = na + nb;
1501 --ms->n;
1502
1503 /* Where does b start in a? Elements in a before that can be
1504 * ignored (already in place).
1505 */
1506 compare = ms->compare;
1507 k = gallop_right(*pb, pa, na, 0, compare);
1508 if (k < 0)
1509 return -1;
1510 pa += k;
1511 na -= k;
1512 if (na == 0)
1513 return 0;
1514
1515 /* Where does a end in b? Elements in b after that can be
1516 * ignored (already in place).
1517 */
1518 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1519 if (nb <= 0)
1520 return nb;
1521
1522 /* Merge what remains of the runs, using a temp array with
1523 * min(na, nb) elements.
1524 */
1525 if (na <= nb)
1526 return merge_lo(ms, pa, na, pb, nb);
1527 else
1528 return merge_hi(ms, pa, na, pb, nb);
1529}
1530
1531/* Examine the stack of runs waiting to be merged, merging adjacent runs
1532 * until the stack invariants are re-established:
1533 *
1534 * 1. len[-3] > len[-2] + len[-1]
1535 * 2. len[-2] > len[-1]
1536 *
1537 * See listsort.txt for more info.
1538 *
1539 * Returns 0 on success, -1 on error.
1540 */
1541static int
1542merge_collapse(MergeState *ms)
1543{
1544 int *len = ms->len;
1545
1546 assert(ms);
1547 while (ms->n > 1) {
1548 int n = ms->n - 2;
1549 if (n > 0 && len[n-1] <= len[n] + len[n+1]) {
1550 if (len[n-1] < len[n+1])
1551 --n;
1552 if (merge_at(ms, n) < 0)
1553 return -1;
1554 }
1555 else if (len[n] <= len[n+1]) {
1556 if (merge_at(ms, n) < 0)
1557 return -1;
1558 }
1559 else
1560 break;
1561 }
1562 return 0;
1563}
1564
1565/* Regardless of invariants, merge all runs on the stack until only one
1566 * remains. This is used at the end of the mergesort.
1567 *
1568 * Returns 0 on success, -1 on error.
1569 */
1570static int
1571merge_force_collapse(MergeState *ms)
1572{
1573 int *len = ms->len;
1574
1575 assert(ms);
1576 while (ms->n > 1) {
1577 int n = ms->n - 2;
1578 if (n > 0 && len[n-1] < len[n+1])
1579 --n;
1580 if (merge_at(ms, n) < 0)
1581 return -1;
1582 }
1583 return 0;
1584}
1585
1586/* Compute a good value for the minimum run length; natural runs shorter
1587 * than this are boosted artificially via binary insertion.
1588 *
1589 * If n < 64, return n (it's too small to bother with fancy stuff).
1590 * Else if n is an exact power of 2, return 32.
1591 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1592 * strictly less than, an exact power of 2.
1593 *
1594 * See listsort.txt for more info.
1595 */
1596static int
1597merge_compute_minrun(int n)
1598{
1599 int r = 0; /* becomes 1 if any 1 bits are shifted off */
1600
1601 assert(n >= 0);
1602 while (n >= 64) {
1603 r |= n & 1;
1604 n >>= 1;
1605 }
1606 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001607}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001608
Jeremy Hylton938ace62002-07-17 16:30:39 +00001609static PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001610
Tim Petersa64dc242002-08-01 02:13:36 +00001611/* An adaptive, stable, natural mergesort. See listsort.txt.
1612 * Returns Py_None on success, NULL on error. Even in case of error, the
1613 * list will be some permutation of its input state (nothing is lost or
1614 * duplicated).
1615 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001616static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001617listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001618{
Tim Petersa64dc242002-08-01 02:13:36 +00001619 MergeState ms;
1620 PyObject **lo, **hi;
1621 int nremaining;
1622 int minrun;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623 PyTypeObject *savetype;
Tim Petersa64dc242002-08-01 02:13:36 +00001624 PyObject *compare = NULL;
1625 PyObject *result = NULL; /* guilty until proved innocent */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001626
Tim Petersa64dc242002-08-01 02:13:36 +00001627 assert(self != NULL);
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001628 if (args != NULL) {
Tim Peters6bdbc9e2002-08-03 02:28:24 +00001629 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001630 return NULL;
1631 }
Tim Petersa64dc242002-08-01 02:13:36 +00001632 merge_init(&ms, compare);
Tim Peters330f9e92002-07-19 07:05:44 +00001633
Tim Peters6d6c1a32001-08-02 04:15:00 +00001634 savetype = self->ob_type;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001635 self->ob_type = &immutable_list_type;
Tim Peters330f9e92002-07-19 07:05:44 +00001636
Tim Petersa64dc242002-08-01 02:13:36 +00001637 nremaining = self->ob_size;
1638 if (nremaining < 2)
1639 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001640
Tim Petersa64dc242002-08-01 02:13:36 +00001641 /* March over the array once, left to right, finding natural runs,
1642 * and extending short natural runs to minrun elements.
1643 */
1644 lo = self->ob_item;
1645 hi = lo + nremaining;
1646 minrun = merge_compute_minrun(nremaining);
1647 do {
1648 int descending;
1649 int n;
Tim Peters330f9e92002-07-19 07:05:44 +00001650
Tim Petersa64dc242002-08-01 02:13:36 +00001651 /* Identify next run. */
1652 n = count_run(lo, hi, compare, &descending);
1653 if (n < 0)
1654 goto fail;
1655 if (descending)
1656 reverse_slice(lo, lo + n);
1657 /* If short, extend to min(minrun, nremaining). */
1658 if (n < minrun) {
1659 const int force = nremaining <= minrun ?
1660 nremaining : minrun;
1661 if (binarysort(lo, lo + force, lo + n, compare) < 0)
1662 goto fail;
1663 n = force;
1664 }
1665 /* Push run onto pending-runs stack, and maybe merge. */
1666 assert(ms.n < MAX_MERGE_PENDING);
1667 ms.base[ms.n] = lo;
1668 ms.len[ms.n] = n;
1669 ++ms.n;
1670 if (merge_collapse(&ms) < 0)
1671 goto fail;
1672 /* Advance to find next run. */
1673 lo += n;
1674 nremaining -= n;
1675 } while (nremaining);
1676 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00001677
Tim Petersa64dc242002-08-01 02:13:36 +00001678 if (merge_force_collapse(&ms) < 0)
1679 goto fail;
1680 assert(ms.n == 1);
1681 assert(ms.base[0] == self->ob_item);
1682 assert(ms.len[0] == self->ob_size);
1683
1684succeed:
1685 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00001686fail:
1687 self->ob_type = savetype;
Tim Petersa64dc242002-08-01 02:13:36 +00001688 merge_freemem(&ms);
1689 Py_XINCREF(result);
1690 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001691}
Tim Peters330f9e92002-07-19 07:05:44 +00001692#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00001693#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00001694
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001695int
Fred Drakea2f55112000-07-09 15:16:51 +00001696PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001697{
1698 if (v == NULL || !PyList_Check(v)) {
1699 PyErr_BadInternalCall();
1700 return -1;
1701 }
1702 v = listsort((PyListObject *)v, (PyObject *)NULL);
1703 if (v == NULL)
1704 return -1;
1705 Py_DECREF(v);
1706 return 0;
1707}
1708
Guido van Rossumb86c5492001-02-12 22:06:02 +00001709static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001710listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00001711{
Tim Peters326b4482002-07-19 04:04:16 +00001712 if (self->ob_size > 1)
1713 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001714 Py_INCREF(Py_None);
1715 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001716}
1717
Guido van Rossum84c76f51990-10-30 13:32:20 +00001718int
Fred Drakea2f55112000-07-09 15:16:51 +00001719PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001720{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721 if (v == NULL || !PyList_Check(v)) {
1722 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001723 return -1;
1724 }
Tim Peters8e2e7ca2002-07-19 02:33:08 +00001725 listreverse((PyListObject *)v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001726 return 0;
1727}
1728
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001729PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001730PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001731{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732 PyObject *w;
1733 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001734 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001735 if (v == NULL || !PyList_Check(v)) {
1736 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001737 return NULL;
1738 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001739 n = ((PyListObject *)v)->ob_size;
1740 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001741 if (w == NULL)
1742 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001743 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001744 memcpy((void *)p,
1745 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001747 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001748 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001749 p++;
1750 }
1751 return w;
1752}
1753
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001755listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001756{
1757 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001758
Guido van Rossumed98d481991-03-06 13:07:53 +00001759 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001760 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1761 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001763 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001764 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001765 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001766 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001767 return NULL;
1768}
1769
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001770static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001771listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001772{
1773 int count = 0;
1774 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001775
Guido van Rossume6f7d181991-10-20 20:20:40 +00001776 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001777 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1778 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001779 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001780 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001781 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001782 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001784}
1785
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001787listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001788{
1789 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001790
Guido van Rossumed98d481991-03-06 13:07:53 +00001791 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001792 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1793 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001794 if (list_ass_slice(self, i, i+1,
1795 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001796 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001797 Py_INCREF(Py_None);
1798 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001799 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001800 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001801 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001802 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001803 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001804 return NULL;
1805}
1806
Jeremy Hylton8caad492000-06-23 14:18:11 +00001807static int
1808list_traverse(PyListObject *o, visitproc visit, void *arg)
1809{
1810 int i, err;
1811 PyObject *x;
1812
1813 for (i = o->ob_size; --i >= 0; ) {
1814 x = o->ob_item[i];
1815 if (x != NULL) {
1816 err = visit(x, arg);
1817 if (err)
1818 return err;
1819 }
1820 }
1821 return 0;
1822}
1823
1824static int
1825list_clear(PyListObject *lp)
1826{
1827 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1828 return 0;
1829}
1830
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001831static PyObject *
1832list_richcompare(PyObject *v, PyObject *w, int op)
1833{
1834 PyListObject *vl, *wl;
1835 int i;
1836
1837 if (!PyList_Check(v) || !PyList_Check(w)) {
1838 Py_INCREF(Py_NotImplemented);
1839 return Py_NotImplemented;
1840 }
1841
1842 vl = (PyListObject *)v;
1843 wl = (PyListObject *)w;
1844
1845 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1846 /* Shortcut: if the lengths differ, the lists differ */
1847 PyObject *res;
1848 if (op == Py_EQ)
1849 res = Py_False;
1850 else
1851 res = Py_True;
1852 Py_INCREF(res);
1853 return res;
1854 }
1855
1856 /* Search for the first index where items are different */
1857 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1858 int k = PyObject_RichCompareBool(vl->ob_item[i],
1859 wl->ob_item[i], Py_EQ);
1860 if (k < 0)
1861 return NULL;
1862 if (!k)
1863 break;
1864 }
1865
1866 if (i >= vl->ob_size || i >= wl->ob_size) {
1867 /* No more items to compare -- compare sizes */
1868 int vs = vl->ob_size;
1869 int ws = wl->ob_size;
1870 int cmp;
1871 PyObject *res;
1872 switch (op) {
1873 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001874 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001875 case Py_EQ: cmp = vs == ws; break;
1876 case Py_NE: cmp = vs != ws; break;
1877 case Py_GT: cmp = vs > ws; break;
1878 case Py_GE: cmp = vs >= ws; break;
1879 default: return NULL; /* cannot happen */
1880 }
1881 if (cmp)
1882 res = Py_True;
1883 else
1884 res = Py_False;
1885 Py_INCREF(res);
1886 return res;
1887 }
1888
1889 /* We have an item that differs -- shortcuts for EQ/NE */
1890 if (op == Py_EQ) {
1891 Py_INCREF(Py_False);
1892 return Py_False;
1893 }
1894 if (op == Py_NE) {
1895 Py_INCREF(Py_True);
1896 return Py_True;
1897 }
1898
1899 /* Compare the final item again using the proper operator */
1900 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1901}
1902
Tim Peters6d6c1a32001-08-02 04:15:00 +00001903/* Adapted from newer code by Tim */
1904static int
1905list_fill(PyListObject *result, PyObject *v)
1906{
1907 PyObject *it; /* iter(v) */
1908 int n; /* guess for result list size */
1909 int i;
1910
1911 n = result->ob_size;
1912
1913 /* Special-case list(a_list), for speed. */
1914 if (PyList_Check(v)) {
1915 if (v == (PyObject *)result)
1916 return 0; /* source is destination, we're done */
1917 return list_ass_slice(result, 0, n, v);
1918 }
1919
1920 /* Empty previous contents */
1921 if (n != 0) {
1922 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1923 return -1;
1924 }
1925
1926 /* Get iterator. There may be some low-level efficiency to be gained
1927 * by caching the tp_iternext slot instead of using PyIter_Next()
1928 * later, but premature optimization is the root etc.
1929 */
1930 it = PyObject_GetIter(v);
1931 if (it == NULL)
1932 return -1;
1933
1934 /* Guess a result list size. */
1935 n = -1; /* unknown */
1936 if (PySequence_Check(v) &&
1937 v->ob_type->tp_as_sequence->sq_length) {
1938 n = PySequence_Size(v);
1939 if (n < 0)
1940 PyErr_Clear();
1941 }
1942 if (n < 0)
1943 n = 8; /* arbitrary */
1944 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001945 if (result->ob_item == NULL) {
1946 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001947 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001948 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00001949 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001950 result->ob_size = n;
1951
1952 /* Run iterator to exhaustion. */
1953 for (i = 0; ; i++) {
1954 PyObject *item = PyIter_Next(it);
1955 if (item == NULL) {
1956 if (PyErr_Occurred())
1957 goto error;
1958 break;
1959 }
1960 if (i < n)
1961 PyList_SET_ITEM(result, i, item); /* steals ref */
1962 else {
1963 int status = ins1(result, result->ob_size, item);
1964 Py_DECREF(item); /* append creates a new ref */
1965 if (status < 0)
1966 goto error;
1967 }
1968 }
1969
1970 /* Cut back result list if initial guess was too large. */
1971 if (i < n && result != NULL) {
1972 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
1973 goto error;
1974 }
1975 Py_DECREF(it);
1976 return 0;
1977
1978 error:
1979 Py_DECREF(it);
1980 return -1;
1981}
1982
1983static int
1984list_init(PyListObject *self, PyObject *args, PyObject *kw)
1985{
1986 PyObject *arg = NULL;
1987 static char *kwlist[] = {"sequence", 0};
1988
1989 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
1990 return -1;
1991 if (arg != NULL)
1992 return list_fill(self, arg);
1993 if (self->ob_size > 0)
1994 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
1995 return 0;
1996}
1997
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001998static long
1999list_nohash(PyObject *self)
2000{
2001 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2002 return -1;
2003}
2004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002005PyDoc_STRVAR(append_doc,
2006"L.append(object) -- append object to end");
2007PyDoc_STRVAR(extend_doc,
Martin v. Löwis673c0a22002-07-28 16:35:57 +00002008"L.extend(sequence) -- extend list by appending sequence elements");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002009PyDoc_STRVAR(insert_doc,
2010"L.insert(index, object) -- insert object before index");
2011PyDoc_STRVAR(pop_doc,
2012"L.pop([index]) -> item -- remove and return item at index (default last)");
2013PyDoc_STRVAR(remove_doc,
2014"L.remove(value) -- remove first occurrence of value");
2015PyDoc_STRVAR(index_doc,
2016"L.index(value) -> integer -- return index of first occurrence of value");
2017PyDoc_STRVAR(count_doc,
2018"L.count(value) -> integer -- return number of occurrences of value");
2019PyDoc_STRVAR(reverse_doc,
2020"L.reverse() -- reverse *IN PLACE*");
2021PyDoc_STRVAR(sort_doc,
Tim Petersa64dc242002-08-01 02:13:36 +00002022"L.sort([cmpfunc]) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002023
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002024static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002025 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002026 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002027 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002028 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002029 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2030 {"index", (PyCFunction)listindex, METH_O, index_doc},
2031 {"count", (PyCFunction)listcount, METH_O, count_doc},
2032 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002033 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002034 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002035};
2036
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002037static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002038 (inquiry)list_length, /* sq_length */
2039 (binaryfunc)list_concat, /* sq_concat */
2040 (intargfunc)list_repeat, /* sq_repeat */
2041 (intargfunc)list_item, /* sq_item */
2042 (intintargfunc)list_slice, /* sq_slice */
2043 (intobjargproc)list_ass_item, /* sq_ass_item */
2044 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
2045 (objobjproc)list_contains, /* sq_contains */
2046 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2047 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002048};
2049
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002050PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002051"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002052"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002053
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002054static PyObject *list_iter(PyObject *seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002055
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002056static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002057list_subscript(PyListObject* self, PyObject* item)
2058{
2059 if (PyInt_Check(item)) {
2060 long i = PyInt_AS_LONG(item);
2061 if (i < 0)
2062 i += PyList_GET_SIZE(self);
2063 return list_item(self, i);
2064 }
2065 else if (PyLong_Check(item)) {
2066 long i = PyLong_AsLong(item);
2067 if (i == -1 && PyErr_Occurred())
2068 return NULL;
2069 if (i < 0)
2070 i += PyList_GET_SIZE(self);
2071 return list_item(self, i);
2072 }
2073 else if (PySlice_Check(item)) {
2074 int start, stop, step, slicelength, cur, i;
2075 PyObject* result;
2076 PyObject* it;
2077
2078 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2079 &start, &stop, &step, &slicelength) < 0) {
2080 return NULL;
2081 }
2082
2083 if (slicelength <= 0) {
2084 return PyList_New(0);
2085 }
2086 else {
2087 result = PyList_New(slicelength);
2088 if (!result) return NULL;
2089
Tim Peters3b01a122002-07-19 02:35:45 +00002090 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002091 cur += step, i++) {
2092 it = PyList_GET_ITEM(self, cur);
2093 Py_INCREF(it);
2094 PyList_SET_ITEM(result, i, it);
2095 }
Tim Peters3b01a122002-07-19 02:35:45 +00002096
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002097 return result;
2098 }
2099 }
2100 else {
2101 PyErr_SetString(PyExc_TypeError,
2102 "list indices must be integers");
2103 return NULL;
2104 }
2105}
2106
Tim Peters3b01a122002-07-19 02:35:45 +00002107static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002108list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2109{
2110 if (PyInt_Check(item)) {
2111 long i = PyInt_AS_LONG(item);
2112 if (i < 0)
2113 i += PyList_GET_SIZE(self);
2114 return list_ass_item(self, i, value);
2115 }
2116 else if (PyLong_Check(item)) {
2117 long i = PyLong_AsLong(item);
2118 if (i == -1 && PyErr_Occurred())
2119 return -1;
2120 if (i < 0)
2121 i += PyList_GET_SIZE(self);
2122 return list_ass_item(self, i, value);
2123 }
2124 else if (PySlice_Check(item)) {
2125 int start, stop, step, slicelength;
2126
2127 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2128 &start, &stop, &step, &slicelength) < 0) {
2129 return -1;
2130 }
2131
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002132 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2133 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2134 return list_ass_slice(self, start, stop, value);
2135
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002136 if (value == NULL) {
2137 /* delete slice */
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002138 PyObject **garbage, **it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002139 int cur, i, j;
Tim Peters3b01a122002-07-19 02:35:45 +00002140
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002141 if (slicelength <= 0)
2142 return 0;
2143
2144 if (step < 0) {
2145 stop = start + 1;
2146 start = stop + step*(slicelength - 1) - 1;
2147 step = -step;
2148 }
2149
2150 garbage = (PyObject**)
2151 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002152
2153 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002154 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002155 for (cur = start, i = 0;
2156 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002157 cur += step, i++) {
2158 int lim = step;
2159
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002160 garbage[i] = PyList_GET_ITEM(self, cur);
2161
Michael W. Hudson56796f62002-07-29 14:35:04 +00002162 if (cur + step >= self->ob_size) {
2163 lim = self->ob_size - cur - 1;
2164 }
2165
2166 for (j = 0; j < lim; j++) {
Tim Peters3b01a122002-07-19 02:35:45 +00002167 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00002168 PyList_GET_ITEM(self,
2169 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002170 }
2171 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002172 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002173 cur < self->ob_size; cur++) {
2174 PyList_SET_ITEM(self, cur - slicelength,
2175 PyList_GET_ITEM(self, cur));
2176 }
2177 self->ob_size -= slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002178 it = self->ob_item;
2179 NRESIZE(it, PyObject*, self->ob_size);
2180 self->ob_item = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002181
2182 for (i = 0; i < slicelength; i++) {
2183 Py_DECREF(garbage[i]);
2184 }
2185 PyMem_FREE(garbage);
2186
2187 return 0;
2188 }
2189 else {
2190 /* assign slice */
2191 PyObject **garbage, *ins;
2192 int cur, i;
2193
2194 if (!PyList_Check(value)) {
2195 PyErr_Format(PyExc_TypeError,
2196 "must assign list (not \"%.200s\") to slice",
2197 value->ob_type->tp_name);
2198 return -1;
2199 }
2200
2201 if (PyList_GET_SIZE(value) != slicelength) {
2202 PyErr_Format(PyExc_ValueError,
2203 "attempt to assign list of size %d to extended slice of size %d",
2204 PyList_Size(value), slicelength);
2205 return -1;
2206 }
2207
2208 if (!slicelength)
2209 return 0;
2210
2211 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002212 if (self == (PyListObject*)value) {
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002213 value = list_slice((PyListObject*)value, 0,
2214 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002215 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002216 else {
2217 Py_INCREF(value);
2218 }
2219
2220 garbage = (PyObject**)
2221 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002222
2223 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002224 cur += step, i++) {
2225 garbage[i] = PyList_GET_ITEM(self, cur);
Tim Peters3b01a122002-07-19 02:35:45 +00002226
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002227 ins = PyList_GET_ITEM(value, i);
2228 Py_INCREF(ins);
2229 PyList_SET_ITEM(self, cur, ins);
2230 }
2231
2232 for (i = 0; i < slicelength; i++) {
2233 Py_DECREF(garbage[i]);
2234 }
Tim Peters3b01a122002-07-19 02:35:45 +00002235
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002236 PyMem_FREE(garbage);
2237 Py_DECREF(value);
Tim Peters3b01a122002-07-19 02:35:45 +00002238
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002239 return 0;
2240 }
Tim Peters3b01a122002-07-19 02:35:45 +00002241 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002242 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002243 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002244 "list indices must be integers");
2245 return -1;
2246 }
2247}
2248
2249static PyMappingMethods list_as_mapping = {
2250 (inquiry)list_length,
2251 (binaryfunc)list_subscript,
2252 (objobjargproc)list_ass_subscript
2253};
2254
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002255PyTypeObject PyList_Type = {
2256 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002257 0,
2258 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002259 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002260 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002261 (destructor)list_dealloc, /* tp_dealloc */
2262 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002263 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002264 0, /* tp_setattr */
2265 0, /* tp_compare */
2266 (reprfunc)list_repr, /* tp_repr */
2267 0, /* tp_as_number */
2268 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002269 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002270 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002271 0, /* tp_call */
2272 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002273 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002274 0, /* tp_setattro */
2275 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002276 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002277 Py_TPFLAGS_BASETYPE, /* tp_flags */
2278 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002279 (traverseproc)list_traverse, /* tp_traverse */
2280 (inquiry)list_clear, /* tp_clear */
2281 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002282 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002283 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002284 0, /* tp_iternext */
2285 list_methods, /* tp_methods */
2286 0, /* tp_members */
2287 0, /* tp_getset */
2288 0, /* tp_base */
2289 0, /* tp_dict */
2290 0, /* tp_descr_get */
2291 0, /* tp_descr_set */
2292 0, /* tp_dictoffset */
2293 (initproc)list_init, /* tp_init */
2294 PyType_GenericAlloc, /* tp_alloc */
2295 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002296 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002297};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002298
2299
2300/* During a sort, we really can't have anyone modifying the list; it could
2301 cause core dumps. Thus, we substitute a dummy type that raises an
2302 explanatory exception when a modifying operation is used. Caveat:
2303 comparisons may behave differently; but I guess it's a bad idea anyway to
2304 compare a list that's being sorted... */
2305
2306static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002307immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002308{
2309 PyErr_SetString(PyExc_TypeError,
2310 "a list cannot be modified while it is being sorted");
2311 return NULL;
2312}
2313
2314static PyMethodDef immutable_list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002315 {"append", (PyCFunction)immutable_list_op, METH_VARARGS},
2316 {"insert", (PyCFunction)immutable_list_op, METH_VARARGS},
Tim Peters52e07172001-08-30 06:15:32 +00002317 {"extend", (PyCFunction)immutable_list_op, METH_O},
2318 {"pop", (PyCFunction)immutable_list_op, METH_VARARGS},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002319 {"remove", (PyCFunction)immutable_list_op, METH_VARARGS},
2320 {"index", (PyCFunction)listindex, METH_O},
2321 {"count", (PyCFunction)listcount, METH_O},
2322 {"reverse", (PyCFunction)immutable_list_op, METH_VARARGS},
2323 {"sort", (PyCFunction)immutable_list_op, METH_VARARGS},
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002324 {NULL, NULL} /* sentinel */
2325};
2326
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002327static int
Fred Drakea2f55112000-07-09 15:16:51 +00002328immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002329{
2330 immutable_list_op();
2331 return -1;
2332}
2333
2334static PySequenceMethods immutable_list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002335 (inquiry)list_length, /* sq_length */
2336 (binaryfunc)list_concat, /* sq_concat */
2337 (intargfunc)list_repeat, /* sq_repeat */
2338 (intargfunc)list_item, /* sq_item */
2339 (intintargfunc)list_slice, /* sq_slice */
2340 (intobjargproc)immutable_list_ass, /* sq_ass_item */
2341 (intintobjargproc)immutable_list_ass, /* sq_ass_slice */
2342 (objobjproc)list_contains, /* sq_contains */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002343};
2344
2345static PyTypeObject immutable_list_type = {
2346 PyObject_HEAD_INIT(&PyType_Type)
2347 0,
2348 "list (immutable, during sort)",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002349 sizeof(PyListObject),
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002350 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002351 0, /* Cannot happen */ /* tp_dealloc */
2352 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002353 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002354 0, /* tp_setattr */
2355 0, /* Won't be called */ /* tp_compare */
2356 (reprfunc)list_repr, /* tp_repr */
2357 0, /* tp_as_number */
2358 &immutable_list_as_sequence, /* tp_as_sequence */
2359 0, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002360 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002361 0, /* tp_call */
2362 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002363 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002364 0, /* tp_setattro */
2365 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002366 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002367 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002368 (traverseproc)list_traverse, /* tp_traverse */
2369 0, /* tp_clear */
2370 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002371 0, /* tp_weaklistoffset */
2372 0, /* tp_iter */
2373 0, /* tp_iternext */
2374 immutable_list_methods, /* tp_methods */
2375 0, /* tp_members */
2376 0, /* tp_getset */
2377 0, /* tp_base */
2378 0, /* tp_dict */
2379 0, /* tp_descr_get */
2380 0, /* tp_descr_set */
2381 0, /* tp_init */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002382 /* NOTE: This is *not* the standard list_type struct! */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002383};
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002384
2385
2386/*********************** List Iterator **************************/
2387
2388typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002389 PyObject_HEAD
2390 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002391 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002392} listiterobject;
2393
2394PyTypeObject PyListIter_Type;
2395
Guido van Rossum5086e492002-07-16 15:56:52 +00002396static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002397list_iter(PyObject *seq)
2398{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002399 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002400
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002401 if (!PyList_Check(seq)) {
2402 PyErr_BadInternalCall();
2403 return NULL;
2404 }
2405 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2406 if (it == NULL)
2407 return NULL;
2408 it->it_index = 0;
2409 Py_INCREF(seq);
2410 it->it_seq = (PyListObject *)seq;
2411 _PyObject_GC_TRACK(it);
2412 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002413}
2414
2415static void
2416listiter_dealloc(listiterobject *it)
2417{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002418 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002419 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002420 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002421}
2422
2423static int
2424listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2425{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002426 if (it->it_seq == NULL)
2427 return 0;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002428 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002429}
2430
2431
2432static PyObject *
2433listiter_getiter(PyObject *it)
2434{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002435 Py_INCREF(it);
2436 return it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002437}
2438
2439static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002440listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002441{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002442 PyListObject *seq;
2443 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002444
Tim Peters93b2cc42002-06-01 05:22:55 +00002445 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002446 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002447 if (seq == NULL)
2448 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002449 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002450
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002451 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002452 item = PyList_GET_ITEM(seq, it->it_index);
2453 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002454 Py_INCREF(item);
2455 return item;
2456 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002457
2458 Py_DECREF(seq);
2459 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002460 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002461}
2462
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002463PyTypeObject PyListIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002464 PyObject_HEAD_INIT(&PyType_Type)
2465 0, /* ob_size */
2466 "listiterator", /* tp_name */
2467 sizeof(listiterobject), /* tp_basicsize */
2468 0, /* tp_itemsize */
2469 /* methods */
2470 (destructor)listiter_dealloc, /* tp_dealloc */
2471 0, /* tp_print */
2472 0, /* tp_getattr */
2473 0, /* tp_setattr */
2474 0, /* tp_compare */
2475 0, /* tp_repr */
2476 0, /* tp_as_number */
2477 0, /* tp_as_sequence */
2478 0, /* tp_as_mapping */
2479 0, /* tp_hash */
2480 0, /* tp_call */
2481 0, /* tp_str */
2482 PyObject_GenericGetAttr, /* tp_getattro */
2483 0, /* tp_setattro */
2484 0, /* tp_as_buffer */
2485 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2486 0, /* tp_doc */
2487 (traverseproc)listiter_traverse, /* tp_traverse */
2488 0, /* tp_clear */
2489 0, /* tp_richcompare */
2490 0, /* tp_weaklistoffset */
2491 (getiterfunc)listiter_getiter, /* tp_iter */
2492 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002493 0, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002494 0, /* tp_members */
2495 0, /* tp_getset */
2496 0, /* tp_base */
2497 0, /* tp_dict */
2498 0, /* tp_descr_get */
2499 0, /* tp_descr_set */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002500};