blob: 7fad905060bc8cf4625863ef231f102ec7df9051 [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{
Tim Peters6063e262002-08-08 01:06:39 +00001721 PyListObject *self = (PyListObject *)v;
1722
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001723 if (v == NULL || !PyList_Check(v)) {
1724 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001725 return -1;
1726 }
Tim Peters6063e262002-08-08 01:06:39 +00001727 if (self->ob_size > 1)
1728 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001729 return 0;
1730}
1731
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001733PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001734{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001735 PyObject *w;
1736 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001737 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001738 if (v == NULL || !PyList_Check(v)) {
1739 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001740 return NULL;
1741 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742 n = ((PyListObject *)v)->ob_size;
1743 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001744 if (w == NULL)
1745 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001747 memcpy((void *)p,
1748 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001749 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001750 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001751 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001752 p++;
1753 }
1754 return w;
1755}
1756
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001757static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001758listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001759{
1760 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001761
Guido van Rossumed98d481991-03-06 13:07:53 +00001762 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001763 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1764 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001765 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001766 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001767 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001768 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001770 return NULL;
1771}
1772
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001773static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001774listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001775{
1776 int count = 0;
1777 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001778
Guido van Rossume6f7d181991-10-20 20:20:40 +00001779 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001780 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1781 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001782 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001783 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001784 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001785 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001787}
1788
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001790listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001791{
1792 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001793
Guido van Rossumed98d481991-03-06 13:07:53 +00001794 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001795 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1796 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001797 if (list_ass_slice(self, i, i+1,
1798 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001799 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001800 Py_INCREF(Py_None);
1801 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001802 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001803 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001804 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001805 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001807 return NULL;
1808}
1809
Jeremy Hylton8caad492000-06-23 14:18:11 +00001810static int
1811list_traverse(PyListObject *o, visitproc visit, void *arg)
1812{
1813 int i, err;
1814 PyObject *x;
1815
1816 for (i = o->ob_size; --i >= 0; ) {
1817 x = o->ob_item[i];
1818 if (x != NULL) {
1819 err = visit(x, arg);
1820 if (err)
1821 return err;
1822 }
1823 }
1824 return 0;
1825}
1826
1827static int
1828list_clear(PyListObject *lp)
1829{
1830 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1831 return 0;
1832}
1833
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001834static PyObject *
1835list_richcompare(PyObject *v, PyObject *w, int op)
1836{
1837 PyListObject *vl, *wl;
1838 int i;
1839
1840 if (!PyList_Check(v) || !PyList_Check(w)) {
1841 Py_INCREF(Py_NotImplemented);
1842 return Py_NotImplemented;
1843 }
1844
1845 vl = (PyListObject *)v;
1846 wl = (PyListObject *)w;
1847
1848 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1849 /* Shortcut: if the lengths differ, the lists differ */
1850 PyObject *res;
1851 if (op == Py_EQ)
1852 res = Py_False;
1853 else
1854 res = Py_True;
1855 Py_INCREF(res);
1856 return res;
1857 }
1858
1859 /* Search for the first index where items are different */
1860 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1861 int k = PyObject_RichCompareBool(vl->ob_item[i],
1862 wl->ob_item[i], Py_EQ);
1863 if (k < 0)
1864 return NULL;
1865 if (!k)
1866 break;
1867 }
1868
1869 if (i >= vl->ob_size || i >= wl->ob_size) {
1870 /* No more items to compare -- compare sizes */
1871 int vs = vl->ob_size;
1872 int ws = wl->ob_size;
1873 int cmp;
1874 PyObject *res;
1875 switch (op) {
1876 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001877 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001878 case Py_EQ: cmp = vs == ws; break;
1879 case Py_NE: cmp = vs != ws; break;
1880 case Py_GT: cmp = vs > ws; break;
1881 case Py_GE: cmp = vs >= ws; break;
1882 default: return NULL; /* cannot happen */
1883 }
1884 if (cmp)
1885 res = Py_True;
1886 else
1887 res = Py_False;
1888 Py_INCREF(res);
1889 return res;
1890 }
1891
1892 /* We have an item that differs -- shortcuts for EQ/NE */
1893 if (op == Py_EQ) {
1894 Py_INCREF(Py_False);
1895 return Py_False;
1896 }
1897 if (op == Py_NE) {
1898 Py_INCREF(Py_True);
1899 return Py_True;
1900 }
1901
1902 /* Compare the final item again using the proper operator */
1903 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1904}
1905
Tim Peters6d6c1a32001-08-02 04:15:00 +00001906/* Adapted from newer code by Tim */
1907static int
1908list_fill(PyListObject *result, PyObject *v)
1909{
1910 PyObject *it; /* iter(v) */
1911 int n; /* guess for result list size */
1912 int i;
1913
1914 n = result->ob_size;
1915
1916 /* Special-case list(a_list), for speed. */
1917 if (PyList_Check(v)) {
1918 if (v == (PyObject *)result)
1919 return 0; /* source is destination, we're done */
1920 return list_ass_slice(result, 0, n, v);
1921 }
1922
1923 /* Empty previous contents */
1924 if (n != 0) {
1925 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1926 return -1;
1927 }
1928
1929 /* Get iterator. There may be some low-level efficiency to be gained
1930 * by caching the tp_iternext slot instead of using PyIter_Next()
1931 * later, but premature optimization is the root etc.
1932 */
1933 it = PyObject_GetIter(v);
1934 if (it == NULL)
1935 return -1;
1936
1937 /* Guess a result list size. */
1938 n = -1; /* unknown */
1939 if (PySequence_Check(v) &&
1940 v->ob_type->tp_as_sequence->sq_length) {
1941 n = PySequence_Size(v);
1942 if (n < 0)
1943 PyErr_Clear();
1944 }
1945 if (n < 0)
1946 n = 8; /* arbitrary */
1947 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001948 if (result->ob_item == NULL) {
1949 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001950 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001951 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00001952 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001953 result->ob_size = n;
1954
1955 /* Run iterator to exhaustion. */
1956 for (i = 0; ; i++) {
1957 PyObject *item = PyIter_Next(it);
1958 if (item == NULL) {
1959 if (PyErr_Occurred())
1960 goto error;
1961 break;
1962 }
1963 if (i < n)
1964 PyList_SET_ITEM(result, i, item); /* steals ref */
1965 else {
1966 int status = ins1(result, result->ob_size, item);
1967 Py_DECREF(item); /* append creates a new ref */
1968 if (status < 0)
1969 goto error;
1970 }
1971 }
1972
1973 /* Cut back result list if initial guess was too large. */
1974 if (i < n && result != NULL) {
1975 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
1976 goto error;
1977 }
1978 Py_DECREF(it);
1979 return 0;
1980
1981 error:
1982 Py_DECREF(it);
1983 return -1;
1984}
1985
1986static int
1987list_init(PyListObject *self, PyObject *args, PyObject *kw)
1988{
1989 PyObject *arg = NULL;
1990 static char *kwlist[] = {"sequence", 0};
1991
1992 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
1993 return -1;
1994 if (arg != NULL)
1995 return list_fill(self, arg);
1996 if (self->ob_size > 0)
1997 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
1998 return 0;
1999}
2000
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002001static long
2002list_nohash(PyObject *self)
2003{
2004 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2005 return -1;
2006}
2007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002008PyDoc_STRVAR(append_doc,
2009"L.append(object) -- append object to end");
2010PyDoc_STRVAR(extend_doc,
Martin v. Löwis673c0a22002-07-28 16:35:57 +00002011"L.extend(sequence) -- extend list by appending sequence elements");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002012PyDoc_STRVAR(insert_doc,
2013"L.insert(index, object) -- insert object before index");
2014PyDoc_STRVAR(pop_doc,
2015"L.pop([index]) -> item -- remove and return item at index (default last)");
2016PyDoc_STRVAR(remove_doc,
2017"L.remove(value) -- remove first occurrence of value");
2018PyDoc_STRVAR(index_doc,
2019"L.index(value) -> integer -- return index of first occurrence of value");
2020PyDoc_STRVAR(count_doc,
2021"L.count(value) -> integer -- return number of occurrences of value");
2022PyDoc_STRVAR(reverse_doc,
2023"L.reverse() -- reverse *IN PLACE*");
2024PyDoc_STRVAR(sort_doc,
Tim Petersa64dc242002-08-01 02:13:36 +00002025"L.sort([cmpfunc]) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002026
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002028 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002029 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002030 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002031 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002032 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2033 {"index", (PyCFunction)listindex, METH_O, index_doc},
2034 {"count", (PyCFunction)listcount, METH_O, count_doc},
2035 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002036 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002037 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002038};
2039
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002040static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002041 (inquiry)list_length, /* sq_length */
2042 (binaryfunc)list_concat, /* sq_concat */
2043 (intargfunc)list_repeat, /* sq_repeat */
2044 (intargfunc)list_item, /* sq_item */
2045 (intintargfunc)list_slice, /* sq_slice */
2046 (intobjargproc)list_ass_item, /* sq_ass_item */
2047 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
2048 (objobjproc)list_contains, /* sq_contains */
2049 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2050 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002051};
2052
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002053PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002054"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002055"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002056
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002057static PyObject *list_iter(PyObject *seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002058
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002059static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002060list_subscript(PyListObject* self, PyObject* item)
2061{
2062 if (PyInt_Check(item)) {
2063 long i = PyInt_AS_LONG(item);
2064 if (i < 0)
2065 i += PyList_GET_SIZE(self);
2066 return list_item(self, i);
2067 }
2068 else if (PyLong_Check(item)) {
2069 long i = PyLong_AsLong(item);
2070 if (i == -1 && PyErr_Occurred())
2071 return NULL;
2072 if (i < 0)
2073 i += PyList_GET_SIZE(self);
2074 return list_item(self, i);
2075 }
2076 else if (PySlice_Check(item)) {
2077 int start, stop, step, slicelength, cur, i;
2078 PyObject* result;
2079 PyObject* it;
2080
2081 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2082 &start, &stop, &step, &slicelength) < 0) {
2083 return NULL;
2084 }
2085
2086 if (slicelength <= 0) {
2087 return PyList_New(0);
2088 }
2089 else {
2090 result = PyList_New(slicelength);
2091 if (!result) return NULL;
2092
Tim Peters3b01a122002-07-19 02:35:45 +00002093 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002094 cur += step, i++) {
2095 it = PyList_GET_ITEM(self, cur);
2096 Py_INCREF(it);
2097 PyList_SET_ITEM(result, i, it);
2098 }
Tim Peters3b01a122002-07-19 02:35:45 +00002099
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002100 return result;
2101 }
2102 }
2103 else {
2104 PyErr_SetString(PyExc_TypeError,
2105 "list indices must be integers");
2106 return NULL;
2107 }
2108}
2109
Tim Peters3b01a122002-07-19 02:35:45 +00002110static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002111list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2112{
2113 if (PyInt_Check(item)) {
2114 long i = PyInt_AS_LONG(item);
2115 if (i < 0)
2116 i += PyList_GET_SIZE(self);
2117 return list_ass_item(self, i, value);
2118 }
2119 else if (PyLong_Check(item)) {
2120 long i = PyLong_AsLong(item);
2121 if (i == -1 && PyErr_Occurred())
2122 return -1;
2123 if (i < 0)
2124 i += PyList_GET_SIZE(self);
2125 return list_ass_item(self, i, value);
2126 }
2127 else if (PySlice_Check(item)) {
2128 int start, stop, step, slicelength;
2129
2130 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2131 &start, &stop, &step, &slicelength) < 0) {
2132 return -1;
2133 }
2134
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002135 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2136 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2137 return list_ass_slice(self, start, stop, value);
2138
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002139 if (value == NULL) {
2140 /* delete slice */
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002141 PyObject **garbage, **it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002142 int cur, i, j;
Tim Peters3b01a122002-07-19 02:35:45 +00002143
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002144 if (slicelength <= 0)
2145 return 0;
2146
2147 if (step < 0) {
2148 stop = start + 1;
2149 start = stop + step*(slicelength - 1) - 1;
2150 step = -step;
2151 }
2152
2153 garbage = (PyObject**)
2154 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002155
2156 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002157 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002158 for (cur = start, i = 0;
2159 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002160 cur += step, i++) {
2161 int lim = step;
2162
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002163 garbage[i] = PyList_GET_ITEM(self, cur);
2164
Michael W. Hudson56796f62002-07-29 14:35:04 +00002165 if (cur + step >= self->ob_size) {
2166 lim = self->ob_size - cur - 1;
2167 }
2168
2169 for (j = 0; j < lim; j++) {
Tim Peters3b01a122002-07-19 02:35:45 +00002170 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00002171 PyList_GET_ITEM(self,
2172 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002173 }
2174 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002175 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002176 cur < self->ob_size; cur++) {
2177 PyList_SET_ITEM(self, cur - slicelength,
2178 PyList_GET_ITEM(self, cur));
2179 }
2180 self->ob_size -= slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002181 it = self->ob_item;
2182 NRESIZE(it, PyObject*, self->ob_size);
2183 self->ob_item = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002184
2185 for (i = 0; i < slicelength; i++) {
2186 Py_DECREF(garbage[i]);
2187 }
2188 PyMem_FREE(garbage);
2189
2190 return 0;
2191 }
2192 else {
2193 /* assign slice */
2194 PyObject **garbage, *ins;
2195 int cur, i;
2196
2197 if (!PyList_Check(value)) {
2198 PyErr_Format(PyExc_TypeError,
2199 "must assign list (not \"%.200s\") to slice",
2200 value->ob_type->tp_name);
2201 return -1;
2202 }
2203
2204 if (PyList_GET_SIZE(value) != slicelength) {
2205 PyErr_Format(PyExc_ValueError,
2206 "attempt to assign list of size %d to extended slice of size %d",
2207 PyList_Size(value), slicelength);
2208 return -1;
2209 }
2210
2211 if (!slicelength)
2212 return 0;
2213
2214 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002215 if (self == (PyListObject*)value) {
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002216 value = list_slice((PyListObject*)value, 0,
2217 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002218 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002219 else {
2220 Py_INCREF(value);
2221 }
2222
2223 garbage = (PyObject**)
2224 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002225
2226 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002227 cur += step, i++) {
2228 garbage[i] = PyList_GET_ITEM(self, cur);
Tim Peters3b01a122002-07-19 02:35:45 +00002229
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002230 ins = PyList_GET_ITEM(value, i);
2231 Py_INCREF(ins);
2232 PyList_SET_ITEM(self, cur, ins);
2233 }
2234
2235 for (i = 0; i < slicelength; i++) {
2236 Py_DECREF(garbage[i]);
2237 }
Tim Peters3b01a122002-07-19 02:35:45 +00002238
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002239 PyMem_FREE(garbage);
2240 Py_DECREF(value);
Tim Peters3b01a122002-07-19 02:35:45 +00002241
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002242 return 0;
2243 }
Tim Peters3b01a122002-07-19 02:35:45 +00002244 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002245 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002246 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002247 "list indices must be integers");
2248 return -1;
2249 }
2250}
2251
2252static PyMappingMethods list_as_mapping = {
2253 (inquiry)list_length,
2254 (binaryfunc)list_subscript,
2255 (objobjargproc)list_ass_subscript
2256};
2257
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002258PyTypeObject PyList_Type = {
2259 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002260 0,
2261 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002262 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002263 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002264 (destructor)list_dealloc, /* tp_dealloc */
2265 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002266 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002267 0, /* tp_setattr */
2268 0, /* tp_compare */
2269 (reprfunc)list_repr, /* tp_repr */
2270 0, /* tp_as_number */
2271 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002272 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002273 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002274 0, /* tp_call */
2275 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002276 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002277 0, /* tp_setattro */
2278 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002279 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002280 Py_TPFLAGS_BASETYPE, /* tp_flags */
2281 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002282 (traverseproc)list_traverse, /* tp_traverse */
2283 (inquiry)list_clear, /* tp_clear */
2284 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002285 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002286 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002287 0, /* tp_iternext */
2288 list_methods, /* tp_methods */
2289 0, /* tp_members */
2290 0, /* tp_getset */
2291 0, /* tp_base */
2292 0, /* tp_dict */
2293 0, /* tp_descr_get */
2294 0, /* tp_descr_set */
2295 0, /* tp_dictoffset */
2296 (initproc)list_init, /* tp_init */
2297 PyType_GenericAlloc, /* tp_alloc */
2298 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002299 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002300};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002301
2302
2303/* During a sort, we really can't have anyone modifying the list; it could
2304 cause core dumps. Thus, we substitute a dummy type that raises an
2305 explanatory exception when a modifying operation is used. Caveat:
2306 comparisons may behave differently; but I guess it's a bad idea anyway to
2307 compare a list that's being sorted... */
2308
2309static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002310immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002311{
2312 PyErr_SetString(PyExc_TypeError,
2313 "a list cannot be modified while it is being sorted");
2314 return NULL;
2315}
2316
2317static PyMethodDef immutable_list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002318 {"append", (PyCFunction)immutable_list_op, METH_VARARGS},
2319 {"insert", (PyCFunction)immutable_list_op, METH_VARARGS},
Tim Peters52e07172001-08-30 06:15:32 +00002320 {"extend", (PyCFunction)immutable_list_op, METH_O},
2321 {"pop", (PyCFunction)immutable_list_op, METH_VARARGS},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002322 {"remove", (PyCFunction)immutable_list_op, METH_VARARGS},
2323 {"index", (PyCFunction)listindex, METH_O},
2324 {"count", (PyCFunction)listcount, METH_O},
2325 {"reverse", (PyCFunction)immutable_list_op, METH_VARARGS},
2326 {"sort", (PyCFunction)immutable_list_op, METH_VARARGS},
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002327 {NULL, NULL} /* sentinel */
2328};
2329
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002330static int
Fred Drakea2f55112000-07-09 15:16:51 +00002331immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002332{
2333 immutable_list_op();
2334 return -1;
2335}
2336
2337static PySequenceMethods immutable_list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002338 (inquiry)list_length, /* sq_length */
2339 (binaryfunc)list_concat, /* sq_concat */
2340 (intargfunc)list_repeat, /* sq_repeat */
2341 (intargfunc)list_item, /* sq_item */
2342 (intintargfunc)list_slice, /* sq_slice */
2343 (intobjargproc)immutable_list_ass, /* sq_ass_item */
2344 (intintobjargproc)immutable_list_ass, /* sq_ass_slice */
2345 (objobjproc)list_contains, /* sq_contains */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002346};
2347
2348static PyTypeObject immutable_list_type = {
2349 PyObject_HEAD_INIT(&PyType_Type)
2350 0,
2351 "list (immutable, during sort)",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002352 sizeof(PyListObject),
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002353 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002354 0, /* Cannot happen */ /* tp_dealloc */
2355 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002356 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002357 0, /* tp_setattr */
2358 0, /* Won't be called */ /* tp_compare */
2359 (reprfunc)list_repr, /* tp_repr */
2360 0, /* tp_as_number */
2361 &immutable_list_as_sequence, /* tp_as_sequence */
2362 0, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002363 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002364 0, /* tp_call */
2365 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002366 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002367 0, /* tp_setattro */
2368 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002369 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002370 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002371 (traverseproc)list_traverse, /* tp_traverse */
2372 0, /* tp_clear */
2373 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002374 0, /* tp_weaklistoffset */
2375 0, /* tp_iter */
2376 0, /* tp_iternext */
2377 immutable_list_methods, /* tp_methods */
2378 0, /* tp_members */
2379 0, /* tp_getset */
2380 0, /* tp_base */
2381 0, /* tp_dict */
2382 0, /* tp_descr_get */
2383 0, /* tp_descr_set */
2384 0, /* tp_init */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002385 /* NOTE: This is *not* the standard list_type struct! */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002386};
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002387
2388
2389/*********************** List Iterator **************************/
2390
2391typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002392 PyObject_HEAD
2393 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002394 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002395} listiterobject;
2396
2397PyTypeObject PyListIter_Type;
2398
Guido van Rossum5086e492002-07-16 15:56:52 +00002399static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002400list_iter(PyObject *seq)
2401{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002402 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002403
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002404 if (!PyList_Check(seq)) {
2405 PyErr_BadInternalCall();
2406 return NULL;
2407 }
2408 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2409 if (it == NULL)
2410 return NULL;
2411 it->it_index = 0;
2412 Py_INCREF(seq);
2413 it->it_seq = (PyListObject *)seq;
2414 _PyObject_GC_TRACK(it);
2415 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002416}
2417
2418static void
2419listiter_dealloc(listiterobject *it)
2420{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002421 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002422 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002423 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002424}
2425
2426static int
2427listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2428{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002429 if (it->it_seq == NULL)
2430 return 0;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002431 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002432}
2433
2434
2435static PyObject *
2436listiter_getiter(PyObject *it)
2437{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002438 Py_INCREF(it);
2439 return it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002440}
2441
2442static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002443listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002444{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002445 PyListObject *seq;
2446 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002447
Tim Peters93b2cc42002-06-01 05:22:55 +00002448 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002449 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002450 if (seq == NULL)
2451 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002452 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002453
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002454 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002455 item = PyList_GET_ITEM(seq, it->it_index);
2456 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002457 Py_INCREF(item);
2458 return item;
2459 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002460
2461 Py_DECREF(seq);
2462 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002463 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002464}
2465
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002466PyTypeObject PyListIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002467 PyObject_HEAD_INIT(&PyType_Type)
2468 0, /* ob_size */
2469 "listiterator", /* tp_name */
2470 sizeof(listiterobject), /* tp_basicsize */
2471 0, /* tp_itemsize */
2472 /* methods */
2473 (destructor)listiter_dealloc, /* tp_dealloc */
2474 0, /* tp_print */
2475 0, /* tp_getattr */
2476 0, /* tp_setattr */
2477 0, /* tp_compare */
2478 0, /* tp_repr */
2479 0, /* tp_as_number */
2480 0, /* tp_as_sequence */
2481 0, /* tp_as_mapping */
2482 0, /* tp_hash */
2483 0, /* tp_call */
2484 0, /* tp_str */
2485 PyObject_GenericGetAttr, /* tp_getattro */
2486 0, /* tp_setattro */
2487 0, /* tp_as_buffer */
2488 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2489 0, /* tp_doc */
2490 (traverseproc)listiter_traverse, /* tp_traverse */
2491 0, /* tp_clear */
2492 0, /* tp_richcompare */
2493 0, /* tp_weaklistoffset */
2494 (getiterfunc)listiter_getiter, /* tp_iter */
2495 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002496 0, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002497 0, /* tp_members */
2498 0, /* tp_getset */
2499 0, /* tp_base */
2500 0, /* tp_dict */
2501 0, /* tp_descr_get */
2502 0, /* tp_descr_set */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002503};