blob: cea8597f2311982a30193ea754aad2a0ab921893 [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
Tim Peterse05f65a2002-08-10 05:21:15 +00001125/* When we get into galloping mode, we stay there until both runs win less
1126 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001127 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001128#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001129
1130/* Avoid malloc for small temp arrays. */
1131#define MERGESTATE_TEMP_SIZE 256
1132
1133/* One MergeState exists on the stack per invocation of mergesort. It's just
1134 * a convenient way to pass state around among the helper functions.
1135 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001136struct s_slice {
1137 PyObject **base;
1138 int len;
1139};
1140
Tim Petersa64dc242002-08-01 02:13:36 +00001141typedef struct s_MergeState {
1142 /* The user-supplied comparison function. or NULL if none given. */
1143 PyObject *compare;
1144
Tim Peterse05f65a2002-08-10 05:21:15 +00001145 /* This controls when we get *into* galloping mode. It's initialized
1146 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1147 * random data, and lower for highly structured data.
1148 */
1149 int min_gallop;
1150
Tim Petersa64dc242002-08-01 02:13:36 +00001151 /* 'a' is temp storage to help with merges. It contains room for
1152 * alloced entries.
1153 */
1154 PyObject **a; /* may point to temparray below */
1155 int alloced;
1156
1157 /* A stack of n pending runs yet to be merged. Run #i starts at
1158 * address base[i] and extends for len[i] elements. It's always
1159 * true (so long as the indices are in bounds) that
1160 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001161 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001162 *
1163 * so we could cut the storage for this, but it's a minor amount,
1164 * and keeping all the info explicit simplifies the code.
1165 */
1166 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001167 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001168
1169 /* 'a' points to this when possible, rather than muck with malloc. */
1170 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1171} MergeState;
1172
1173/* Conceptually a MergeState's constructor. */
1174static void
1175merge_init(MergeState *ms, PyObject *compare)
1176{
1177 assert(ms != NULL);
1178 ms->compare = compare;
1179 ms->a = ms->temparray;
1180 ms->alloced = MERGESTATE_TEMP_SIZE;
1181 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001182 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001183}
1184
1185/* Free all the temp memory owned by the MergeState. This must be called
1186 * when you're done with a MergeState, and may be called before then if
1187 * you want to free the temp memory early.
1188 */
1189static void
1190merge_freemem(MergeState *ms)
1191{
1192 assert(ms != NULL);
1193 if (ms->a != ms->temparray)
1194 PyMem_Free(ms->a);
1195 ms->a = ms->temparray;
1196 ms->alloced = MERGESTATE_TEMP_SIZE;
1197}
1198
1199/* Ensure enough temp memory for 'need' array slots is available.
1200 * Returns 0 on success and -1 if the memory can't be gotten.
1201 */
1202static int
1203merge_getmem(MergeState *ms, int need)
1204{
1205 assert(ms != NULL);
1206 if (need <= ms->alloced)
1207 return 0;
1208 /* Don't realloc! That can cost cycles to copy the old data, but
1209 * we don't care what's in the block.
1210 */
1211 merge_freemem(ms);
1212 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1213 if (ms->a) {
1214 ms->alloced = need;
1215 return 0;
1216 }
1217 PyErr_NoMemory();
1218 merge_freemem(ms); /* reset to sane state */
1219 return -1;
1220}
1221#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1222 merge_getmem(MS, NEED))
1223
1224/* Merge the na elements starting at pa with the nb elements starting at pb
1225 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1226 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1227 * merge, and should have na <= nb. See listsort.txt for more info.
1228 * Return 0 if successful, -1 if error.
1229 */
1230static int
1231merge_lo(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1232{
1233 int k;
1234 PyObject *compare;
1235 PyObject **dest;
1236 int result = -1; /* guilty until proved innocent */
Tim Peterse05f65a2002-08-10 05:21:15 +00001237 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001238
1239 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1240 if (MERGE_GETMEM(ms, na) < 0)
1241 return -1;
1242 memcpy(ms->a, pa, na * sizeof(PyObject*));
1243 dest = pa;
1244 pa = ms->a;
1245
1246 *dest++ = *pb++;
1247 --nb;
1248 if (nb == 0)
1249 goto Succeed;
1250 if (na == 1)
1251 goto CopyB;
1252
1253 compare = ms->compare;
1254 for (;;) {
1255 int acount = 0; /* # of times A won in a row */
1256 int bcount = 0; /* # of times B won in a row */
1257
1258 /* Do the straightforward thing until (if ever) one run
1259 * appears to win consistently.
1260 */
1261 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001262 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001263 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001264 if (k) {
1265 if (k < 0)
1266 goto Fail;
1267 *dest++ = *pb++;
1268 ++bcount;
1269 acount = 0;
1270 --nb;
1271 if (nb == 0)
1272 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001273 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001274 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001275 }
1276 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001277 *dest++ = *pa++;
1278 ++acount;
1279 bcount = 0;
1280 --na;
1281 if (na == 1)
1282 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001283 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001284 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001285 }
Tim Petersa64dc242002-08-01 02:13:36 +00001286 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001287
Tim Petersa64dc242002-08-01 02:13:36 +00001288 /* One run is winning so consistently that galloping may
1289 * be a huge win. So try that, and continue galloping until
1290 * (if ever) neither run appears to be winning consistently
1291 * anymore.
1292 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001293 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001294 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001295 assert(na > 1 && nb > 0);
1296 min_gallop -= min_gallop > 1;
1297 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001298 k = gallop_right(*pb, pa, na, 0, compare);
1299 acount = k;
1300 if (k) {
1301 if (k < 0)
1302 goto Fail;
1303 memcpy(dest, pa, k * sizeof(PyObject *));
1304 dest += k;
1305 pa += k;
1306 na -= k;
1307 if (na == 1)
1308 goto CopyB;
1309 /* na==0 is impossible now if the comparison
1310 * function is consistent, but we can't assume
1311 * that it is.
1312 */
1313 if (na == 0)
1314 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001315 }
Tim Petersa64dc242002-08-01 02:13:36 +00001316 *dest++ = *pb++;
1317 --nb;
1318 if (nb == 0)
1319 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001320
Tim Petersa64dc242002-08-01 02:13:36 +00001321 k = gallop_left(*pa, pb, nb, 0, compare);
1322 bcount = k;
1323 if (k) {
1324 if (k < 0)
1325 goto Fail;
1326 memmove(dest, pb, k * sizeof(PyObject *));
1327 dest += k;
1328 pb += k;
1329 nb -= k;
1330 if (nb == 0)
1331 goto Succeed;
1332 }
1333 *dest++ = *pa++;
1334 --na;
1335 if (na == 1)
1336 goto CopyB;
1337 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001338 ++min_gallop; /* penalize it for leaving galloping mode */
1339 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001340 }
1341Succeed:
1342 result = 0;
1343Fail:
1344 if (na)
1345 memcpy(dest, pa, na * sizeof(PyObject*));
1346 return result;
1347CopyB:
1348 assert(na == 1 && nb > 0);
1349 /* The last element of pa belongs at the end of the merge. */
1350 memmove(dest, pb, nb * sizeof(PyObject *));
1351 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001352 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001353}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001354
Tim Petersa64dc242002-08-01 02:13:36 +00001355/* Merge the na elements starting at pa with the nb elements starting at pb
1356 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1357 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1358 * merge, and should have na >= nb. See listsort.txt for more info.
1359 * Return 0 if successful, -1 if error.
1360 */
1361static int
1362merge_hi(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1363{
1364 int k;
1365 PyObject *compare;
1366 PyObject **dest;
1367 int result = -1; /* guilty until proved innocent */
1368 PyObject **basea;
1369 PyObject **baseb;
Tim Peterse05f65a2002-08-10 05:21:15 +00001370 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001371
1372 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1373 if (MERGE_GETMEM(ms, nb) < 0)
1374 return -1;
1375 dest = pb + nb - 1;
1376 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1377 basea = pa;
1378 baseb = ms->a;
1379 pb = ms->a + nb - 1;
1380 pa += na - 1;
1381
1382 *dest-- = *pa--;
1383 --na;
1384 if (na == 0)
1385 goto Succeed;
1386 if (nb == 1)
1387 goto CopyA;
1388
1389 compare = ms->compare;
1390 for (;;) {
1391 int acount = 0; /* # of times A won in a row */
1392 int bcount = 0; /* # of times B won in a row */
1393
1394 /* Do the straightforward thing until (if ever) one run
1395 * appears to win consistently.
1396 */
1397 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001398 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001399 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001400 if (k) {
1401 if (k < 0)
1402 goto Fail;
1403 *dest-- = *pa--;
1404 ++acount;
1405 bcount = 0;
1406 --na;
1407 if (na == 0)
1408 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001409 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001410 break;
1411 }
1412 else {
1413 *dest-- = *pb--;
1414 ++bcount;
1415 acount = 0;
1416 --nb;
1417 if (nb == 1)
1418 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001419 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001420 break;
1421 }
1422 }
1423
1424 /* One run is winning so consistently that galloping may
1425 * be a huge win. So try that, and continue galloping until
1426 * (if ever) neither run appears to be winning consistently
1427 * anymore.
1428 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001429 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001430 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001431 assert(na > 0 && nb > 1);
1432 min_gallop -= min_gallop > 1;
1433 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001434 k = gallop_right(*pb, basea, na, na-1, compare);
1435 if (k < 0)
1436 goto Fail;
1437 k = na - k;
1438 acount = k;
1439 if (k) {
1440 dest -= k;
1441 pa -= k;
1442 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1443 na -= k;
1444 if (na == 0)
1445 goto Succeed;
1446 }
1447 *dest-- = *pb--;
1448 --nb;
1449 if (nb == 1)
1450 goto CopyA;
1451
1452 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1453 if (k < 0)
1454 goto Fail;
1455 k = nb - k;
1456 bcount = k;
1457 if (k) {
1458 dest -= k;
1459 pb -= k;
1460 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1461 nb -= k;
1462 if (nb == 1)
1463 goto CopyA;
1464 /* nb==0 is impossible now if the comparison
1465 * function is consistent, but we can't assume
1466 * that it is.
1467 */
1468 if (nb == 0)
1469 goto Succeed;
1470 }
1471 *dest-- = *pa--;
1472 --na;
1473 if (na == 0)
1474 goto Succeed;
1475 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001476 ++min_gallop; /* penalize it for leaving galloping mode */
1477 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001478 }
1479Succeed:
1480 result = 0;
1481Fail:
1482 if (nb)
1483 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1484 return result;
1485CopyA:
1486 assert(nb == 1 && na > 0);
1487 /* The first element of pb belongs at the front of the merge. */
1488 dest -= na;
1489 pa -= na;
1490 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1491 *dest = *pb;
1492 return 0;
1493}
1494
1495/* Merge the two runs at stack indices i and i+1.
1496 * Returns 0 on success, -1 on error.
1497 */
1498static int
1499merge_at(MergeState *ms, int i)
1500{
1501 PyObject **pa, **pb;
1502 int na, nb;
1503 int k;
1504 PyObject *compare;
1505
1506 assert(ms != NULL);
1507 assert(ms->n >= 2);
1508 assert(i >= 0);
1509 assert(i == ms->n - 2 || i == ms->n - 3);
1510
Tim Peterse05f65a2002-08-10 05:21:15 +00001511 pa = ms->pending[i].base;
1512 na = ms->pending[i].len;
1513 pb = ms->pending[i+1].base;
1514 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001515 assert(na > 0 && nb > 0);
1516 assert(pa + na == pb);
1517
1518 /* Record the length of the combined runs; if i is the 3rd-last
1519 * run now, also slide over the last run (which isn't involved
1520 * in this merge). The current run i+1 goes away in any case.
1521 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001522 ms->pending[i].len = na + nb;
1523 if (i == ms->n - 3)
1524 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001525 --ms->n;
1526
1527 /* Where does b start in a? Elements in a before that can be
1528 * ignored (already in place).
1529 */
1530 compare = ms->compare;
1531 k = gallop_right(*pb, pa, na, 0, compare);
1532 if (k < 0)
1533 return -1;
1534 pa += k;
1535 na -= k;
1536 if (na == 0)
1537 return 0;
1538
1539 /* Where does a end in b? Elements in b after that can be
1540 * ignored (already in place).
1541 */
1542 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1543 if (nb <= 0)
1544 return nb;
1545
1546 /* Merge what remains of the runs, using a temp array with
1547 * min(na, nb) elements.
1548 */
1549 if (na <= nb)
1550 return merge_lo(ms, pa, na, pb, nb);
1551 else
1552 return merge_hi(ms, pa, na, pb, nb);
1553}
1554
1555/* Examine the stack of runs waiting to be merged, merging adjacent runs
1556 * until the stack invariants are re-established:
1557 *
1558 * 1. len[-3] > len[-2] + len[-1]
1559 * 2. len[-2] > len[-1]
1560 *
1561 * See listsort.txt for more info.
1562 *
1563 * Returns 0 on success, -1 on error.
1564 */
1565static int
1566merge_collapse(MergeState *ms)
1567{
Tim Peterse05f65a2002-08-10 05:21:15 +00001568 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001569
1570 assert(ms);
1571 while (ms->n > 1) {
1572 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001573 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1574 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001575 --n;
1576 if (merge_at(ms, n) < 0)
1577 return -1;
1578 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001579 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001580 if (merge_at(ms, n) < 0)
1581 return -1;
1582 }
1583 else
1584 break;
1585 }
1586 return 0;
1587}
1588
1589/* Regardless of invariants, merge all runs on the stack until only one
1590 * remains. This is used at the end of the mergesort.
1591 *
1592 * Returns 0 on success, -1 on error.
1593 */
1594static int
1595merge_force_collapse(MergeState *ms)
1596{
Tim Peterse05f65a2002-08-10 05:21:15 +00001597 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001598
1599 assert(ms);
1600 while (ms->n > 1) {
1601 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001602 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001603 --n;
1604 if (merge_at(ms, n) < 0)
1605 return -1;
1606 }
1607 return 0;
1608}
1609
1610/* Compute a good value for the minimum run length; natural runs shorter
1611 * than this are boosted artificially via binary insertion.
1612 *
1613 * If n < 64, return n (it's too small to bother with fancy stuff).
1614 * Else if n is an exact power of 2, return 32.
1615 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1616 * strictly less than, an exact power of 2.
1617 *
1618 * See listsort.txt for more info.
1619 */
1620static int
1621merge_compute_minrun(int n)
1622{
1623 int r = 0; /* becomes 1 if any 1 bits are shifted off */
1624
1625 assert(n >= 0);
1626 while (n >= 64) {
1627 r |= n & 1;
1628 n >>= 1;
1629 }
1630 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001631}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001632
Jeremy Hylton938ace62002-07-17 16:30:39 +00001633static PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001634
Tim Petersa64dc242002-08-01 02:13:36 +00001635/* An adaptive, stable, natural mergesort. See listsort.txt.
1636 * Returns Py_None on success, NULL on error. Even in case of error, the
1637 * list will be some permutation of its input state (nothing is lost or
1638 * duplicated).
1639 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001640static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001641listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001642{
Tim Petersa64dc242002-08-01 02:13:36 +00001643 MergeState ms;
1644 PyObject **lo, **hi;
1645 int nremaining;
1646 int minrun;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001647 PyTypeObject *savetype;
Tim Petersa64dc242002-08-01 02:13:36 +00001648 PyObject *compare = NULL;
1649 PyObject *result = NULL; /* guilty until proved innocent */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001650
Tim Petersa64dc242002-08-01 02:13:36 +00001651 assert(self != NULL);
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001652 if (args != NULL) {
Tim Peters6bdbc9e2002-08-03 02:28:24 +00001653 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001654 return NULL;
1655 }
Tim Petersa64dc242002-08-01 02:13:36 +00001656 merge_init(&ms, compare);
Tim Peters330f9e92002-07-19 07:05:44 +00001657
Tim Peters6d6c1a32001-08-02 04:15:00 +00001658 savetype = self->ob_type;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001659 self->ob_type = &immutable_list_type;
Tim Peters330f9e92002-07-19 07:05:44 +00001660
Tim Petersa64dc242002-08-01 02:13:36 +00001661 nremaining = self->ob_size;
1662 if (nremaining < 2)
1663 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001664
Tim Petersa64dc242002-08-01 02:13:36 +00001665 /* March over the array once, left to right, finding natural runs,
1666 * and extending short natural runs to minrun elements.
1667 */
1668 lo = self->ob_item;
1669 hi = lo + nremaining;
1670 minrun = merge_compute_minrun(nremaining);
1671 do {
1672 int descending;
1673 int n;
Tim Peters330f9e92002-07-19 07:05:44 +00001674
Tim Petersa64dc242002-08-01 02:13:36 +00001675 /* Identify next run. */
1676 n = count_run(lo, hi, compare, &descending);
1677 if (n < 0)
1678 goto fail;
1679 if (descending)
1680 reverse_slice(lo, lo + n);
1681 /* If short, extend to min(minrun, nremaining). */
1682 if (n < minrun) {
1683 const int force = nremaining <= minrun ?
1684 nremaining : minrun;
1685 if (binarysort(lo, lo + force, lo + n, compare) < 0)
1686 goto fail;
1687 n = force;
1688 }
1689 /* Push run onto pending-runs stack, and maybe merge. */
1690 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00001691 ms.pending[ms.n].base = lo;
1692 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00001693 ++ms.n;
1694 if (merge_collapse(&ms) < 0)
1695 goto fail;
1696 /* Advance to find next run. */
1697 lo += n;
1698 nremaining -= n;
1699 } while (nremaining);
1700 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00001701
Tim Petersa64dc242002-08-01 02:13:36 +00001702 if (merge_force_collapse(&ms) < 0)
1703 goto fail;
1704 assert(ms.n == 1);
Tim Peterse05f65a2002-08-10 05:21:15 +00001705 assert(ms.pending[0].base == self->ob_item);
1706 assert(ms.pending[0].len == self->ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00001707
1708succeed:
1709 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00001710fail:
1711 self->ob_type = savetype;
Tim Petersa64dc242002-08-01 02:13:36 +00001712 merge_freemem(&ms);
1713 Py_XINCREF(result);
1714 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001715}
Tim Peters330f9e92002-07-19 07:05:44 +00001716#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00001717#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00001718
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001719int
Fred Drakea2f55112000-07-09 15:16:51 +00001720PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001721{
1722 if (v == NULL || !PyList_Check(v)) {
1723 PyErr_BadInternalCall();
1724 return -1;
1725 }
1726 v = listsort((PyListObject *)v, (PyObject *)NULL);
1727 if (v == NULL)
1728 return -1;
1729 Py_DECREF(v);
1730 return 0;
1731}
1732
Guido van Rossumb86c5492001-02-12 22:06:02 +00001733static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001734listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00001735{
Tim Peters326b4482002-07-19 04:04:16 +00001736 if (self->ob_size > 1)
1737 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001738 Py_INCREF(Py_None);
1739 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001740}
1741
Guido van Rossum84c76f51990-10-30 13:32:20 +00001742int
Fred Drakea2f55112000-07-09 15:16:51 +00001743PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001744{
Tim Peters6063e262002-08-08 01:06:39 +00001745 PyListObject *self = (PyListObject *)v;
1746
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001747 if (v == NULL || !PyList_Check(v)) {
1748 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001749 return -1;
1750 }
Tim Peters6063e262002-08-08 01:06:39 +00001751 if (self->ob_size > 1)
1752 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001753 return 0;
1754}
1755
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001756PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001757PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001758{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001759 PyObject *w;
1760 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001761 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762 if (v == NULL || !PyList_Check(v)) {
1763 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001764 return NULL;
1765 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001766 n = ((PyListObject *)v)->ob_size;
1767 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001768 if (w == NULL)
1769 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001770 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001771 memcpy((void *)p,
1772 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001773 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001774 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001775 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001776 p++;
1777 }
1778 return w;
1779}
1780
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001782listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001783{
1784 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001785
Guido van Rossumed98d481991-03-06 13:07:53 +00001786 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001787 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1788 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001790 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001791 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001792 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001793 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001794 return NULL;
1795}
1796
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001797static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001798listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001799{
1800 int count = 0;
1801 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001802
Guido van Rossume6f7d181991-10-20 20:20:40 +00001803 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001804 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1805 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001806 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001807 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001808 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001809 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001810 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001811}
1812
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001813static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001814listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001815{
1816 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001817
Guido van Rossumed98d481991-03-06 13:07:53 +00001818 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001819 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1820 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001821 if (list_ass_slice(self, i, i+1,
1822 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001823 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001824 Py_INCREF(Py_None);
1825 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001826 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001827 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001828 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001829 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001830 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001831 return NULL;
1832}
1833
Jeremy Hylton8caad492000-06-23 14:18:11 +00001834static int
1835list_traverse(PyListObject *o, visitproc visit, void *arg)
1836{
1837 int i, err;
1838 PyObject *x;
1839
1840 for (i = o->ob_size; --i >= 0; ) {
1841 x = o->ob_item[i];
1842 if (x != NULL) {
1843 err = visit(x, arg);
1844 if (err)
1845 return err;
1846 }
1847 }
1848 return 0;
1849}
1850
1851static int
1852list_clear(PyListObject *lp)
1853{
1854 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1855 return 0;
1856}
1857
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001858static PyObject *
1859list_richcompare(PyObject *v, PyObject *w, int op)
1860{
1861 PyListObject *vl, *wl;
1862 int i;
1863
1864 if (!PyList_Check(v) || !PyList_Check(w)) {
1865 Py_INCREF(Py_NotImplemented);
1866 return Py_NotImplemented;
1867 }
1868
1869 vl = (PyListObject *)v;
1870 wl = (PyListObject *)w;
1871
1872 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1873 /* Shortcut: if the lengths differ, the lists differ */
1874 PyObject *res;
1875 if (op == Py_EQ)
1876 res = Py_False;
1877 else
1878 res = Py_True;
1879 Py_INCREF(res);
1880 return res;
1881 }
1882
1883 /* Search for the first index where items are different */
1884 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1885 int k = PyObject_RichCompareBool(vl->ob_item[i],
1886 wl->ob_item[i], Py_EQ);
1887 if (k < 0)
1888 return NULL;
1889 if (!k)
1890 break;
1891 }
1892
1893 if (i >= vl->ob_size || i >= wl->ob_size) {
1894 /* No more items to compare -- compare sizes */
1895 int vs = vl->ob_size;
1896 int ws = wl->ob_size;
1897 int cmp;
1898 PyObject *res;
1899 switch (op) {
1900 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001901 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001902 case Py_EQ: cmp = vs == ws; break;
1903 case Py_NE: cmp = vs != ws; break;
1904 case Py_GT: cmp = vs > ws; break;
1905 case Py_GE: cmp = vs >= ws; break;
1906 default: return NULL; /* cannot happen */
1907 }
1908 if (cmp)
1909 res = Py_True;
1910 else
1911 res = Py_False;
1912 Py_INCREF(res);
1913 return res;
1914 }
1915
1916 /* We have an item that differs -- shortcuts for EQ/NE */
1917 if (op == Py_EQ) {
1918 Py_INCREF(Py_False);
1919 return Py_False;
1920 }
1921 if (op == Py_NE) {
1922 Py_INCREF(Py_True);
1923 return Py_True;
1924 }
1925
1926 /* Compare the final item again using the proper operator */
1927 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1928}
1929
Tim Peters6d6c1a32001-08-02 04:15:00 +00001930/* Adapted from newer code by Tim */
1931static int
1932list_fill(PyListObject *result, PyObject *v)
1933{
1934 PyObject *it; /* iter(v) */
1935 int n; /* guess for result list size */
1936 int i;
1937
1938 n = result->ob_size;
1939
1940 /* Special-case list(a_list), for speed. */
1941 if (PyList_Check(v)) {
1942 if (v == (PyObject *)result)
1943 return 0; /* source is destination, we're done */
1944 return list_ass_slice(result, 0, n, v);
1945 }
1946
1947 /* Empty previous contents */
1948 if (n != 0) {
1949 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1950 return -1;
1951 }
1952
1953 /* Get iterator. There may be some low-level efficiency to be gained
1954 * by caching the tp_iternext slot instead of using PyIter_Next()
1955 * later, but premature optimization is the root etc.
1956 */
1957 it = PyObject_GetIter(v);
1958 if (it == NULL)
1959 return -1;
1960
1961 /* Guess a result list size. */
1962 n = -1; /* unknown */
1963 if (PySequence_Check(v) &&
1964 v->ob_type->tp_as_sequence->sq_length) {
1965 n = PySequence_Size(v);
1966 if (n < 0)
1967 PyErr_Clear();
1968 }
1969 if (n < 0)
1970 n = 8; /* arbitrary */
1971 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001972 if (result->ob_item == NULL) {
1973 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001974 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001975 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00001976 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001977 result->ob_size = n;
1978
1979 /* Run iterator to exhaustion. */
1980 for (i = 0; ; i++) {
1981 PyObject *item = PyIter_Next(it);
1982 if (item == NULL) {
1983 if (PyErr_Occurred())
1984 goto error;
1985 break;
1986 }
1987 if (i < n)
1988 PyList_SET_ITEM(result, i, item); /* steals ref */
1989 else {
1990 int status = ins1(result, result->ob_size, item);
1991 Py_DECREF(item); /* append creates a new ref */
1992 if (status < 0)
1993 goto error;
1994 }
1995 }
1996
1997 /* Cut back result list if initial guess was too large. */
1998 if (i < n && result != NULL) {
1999 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
2000 goto error;
2001 }
2002 Py_DECREF(it);
2003 return 0;
2004
2005 error:
2006 Py_DECREF(it);
2007 return -1;
2008}
2009
2010static int
2011list_init(PyListObject *self, PyObject *args, PyObject *kw)
2012{
2013 PyObject *arg = NULL;
2014 static char *kwlist[] = {"sequence", 0};
2015
2016 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2017 return -1;
2018 if (arg != NULL)
2019 return list_fill(self, arg);
2020 if (self->ob_size > 0)
2021 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
2022 return 0;
2023}
2024
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002025static long
2026list_nohash(PyObject *self)
2027{
2028 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2029 return -1;
2030}
2031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002032PyDoc_STRVAR(append_doc,
2033"L.append(object) -- append object to end");
2034PyDoc_STRVAR(extend_doc,
Martin v. Löwis673c0a22002-07-28 16:35:57 +00002035"L.extend(sequence) -- extend list by appending sequence elements");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002036PyDoc_STRVAR(insert_doc,
2037"L.insert(index, object) -- insert object before index");
2038PyDoc_STRVAR(pop_doc,
2039"L.pop([index]) -> item -- remove and return item at index (default last)");
2040PyDoc_STRVAR(remove_doc,
2041"L.remove(value) -- remove first occurrence of value");
2042PyDoc_STRVAR(index_doc,
2043"L.index(value) -> integer -- return index of first occurrence of value");
2044PyDoc_STRVAR(count_doc,
2045"L.count(value) -> integer -- return number of occurrences of value");
2046PyDoc_STRVAR(reverse_doc,
2047"L.reverse() -- reverse *IN PLACE*");
2048PyDoc_STRVAR(sort_doc,
Tim Petersa64dc242002-08-01 02:13:36 +00002049"L.sort([cmpfunc]) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002050
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002051static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002052 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002053 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002054 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002055 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002056 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2057 {"index", (PyCFunction)listindex, METH_O, index_doc},
2058 {"count", (PyCFunction)listcount, METH_O, count_doc},
2059 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002060 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002061 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002062};
2063
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002064static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002065 (inquiry)list_length, /* sq_length */
2066 (binaryfunc)list_concat, /* sq_concat */
2067 (intargfunc)list_repeat, /* sq_repeat */
2068 (intargfunc)list_item, /* sq_item */
2069 (intintargfunc)list_slice, /* sq_slice */
2070 (intobjargproc)list_ass_item, /* sq_ass_item */
2071 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
2072 (objobjproc)list_contains, /* sq_contains */
2073 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2074 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002075};
2076
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002077PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002078"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002079"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002080
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002081static PyObject *list_iter(PyObject *seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002082
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002083static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002084list_subscript(PyListObject* self, PyObject* item)
2085{
2086 if (PyInt_Check(item)) {
2087 long i = PyInt_AS_LONG(item);
2088 if (i < 0)
2089 i += PyList_GET_SIZE(self);
2090 return list_item(self, i);
2091 }
2092 else if (PyLong_Check(item)) {
2093 long i = PyLong_AsLong(item);
2094 if (i == -1 && PyErr_Occurred())
2095 return NULL;
2096 if (i < 0)
2097 i += PyList_GET_SIZE(self);
2098 return list_item(self, i);
2099 }
2100 else if (PySlice_Check(item)) {
2101 int start, stop, step, slicelength, cur, i;
2102 PyObject* result;
2103 PyObject* it;
2104
2105 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2106 &start, &stop, &step, &slicelength) < 0) {
2107 return NULL;
2108 }
2109
2110 if (slicelength <= 0) {
2111 return PyList_New(0);
2112 }
2113 else {
2114 result = PyList_New(slicelength);
2115 if (!result) return NULL;
2116
Tim Peters3b01a122002-07-19 02:35:45 +00002117 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002118 cur += step, i++) {
2119 it = PyList_GET_ITEM(self, cur);
2120 Py_INCREF(it);
2121 PyList_SET_ITEM(result, i, it);
2122 }
Tim Peters3b01a122002-07-19 02:35:45 +00002123
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002124 return result;
2125 }
2126 }
2127 else {
2128 PyErr_SetString(PyExc_TypeError,
2129 "list indices must be integers");
2130 return NULL;
2131 }
2132}
2133
Tim Peters3b01a122002-07-19 02:35:45 +00002134static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002135list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2136{
2137 if (PyInt_Check(item)) {
2138 long i = PyInt_AS_LONG(item);
2139 if (i < 0)
2140 i += PyList_GET_SIZE(self);
2141 return list_ass_item(self, i, value);
2142 }
2143 else if (PyLong_Check(item)) {
2144 long i = PyLong_AsLong(item);
2145 if (i == -1 && PyErr_Occurred())
2146 return -1;
2147 if (i < 0)
2148 i += PyList_GET_SIZE(self);
2149 return list_ass_item(self, i, value);
2150 }
2151 else if (PySlice_Check(item)) {
2152 int start, stop, step, slicelength;
2153
2154 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2155 &start, &stop, &step, &slicelength) < 0) {
2156 return -1;
2157 }
2158
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002159 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2160 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2161 return list_ass_slice(self, start, stop, value);
2162
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002163 if (value == NULL) {
2164 /* delete slice */
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002165 PyObject **garbage, **it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002166 int cur, i, j;
Tim Peters3b01a122002-07-19 02:35:45 +00002167
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002168 if (slicelength <= 0)
2169 return 0;
2170
2171 if (step < 0) {
2172 stop = start + 1;
2173 start = stop + step*(slicelength - 1) - 1;
2174 step = -step;
2175 }
2176
2177 garbage = (PyObject**)
2178 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002179
2180 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002181 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002182 for (cur = start, i = 0;
2183 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002184 cur += step, i++) {
2185 int lim = step;
2186
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002187 garbage[i] = PyList_GET_ITEM(self, cur);
2188
Michael W. Hudson56796f62002-07-29 14:35:04 +00002189 if (cur + step >= self->ob_size) {
2190 lim = self->ob_size - cur - 1;
2191 }
2192
2193 for (j = 0; j < lim; j++) {
Tim Peters3b01a122002-07-19 02:35:45 +00002194 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00002195 PyList_GET_ITEM(self,
2196 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002197 }
2198 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002199 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002200 cur < self->ob_size; cur++) {
2201 PyList_SET_ITEM(self, cur - slicelength,
2202 PyList_GET_ITEM(self, cur));
2203 }
2204 self->ob_size -= slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002205 it = self->ob_item;
2206 NRESIZE(it, PyObject*, self->ob_size);
2207 self->ob_item = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002208
2209 for (i = 0; i < slicelength; i++) {
2210 Py_DECREF(garbage[i]);
2211 }
2212 PyMem_FREE(garbage);
2213
2214 return 0;
2215 }
2216 else {
2217 /* assign slice */
2218 PyObject **garbage, *ins;
2219 int cur, i;
2220
2221 if (!PyList_Check(value)) {
2222 PyErr_Format(PyExc_TypeError,
2223 "must assign list (not \"%.200s\") to slice",
2224 value->ob_type->tp_name);
2225 return -1;
2226 }
2227
2228 if (PyList_GET_SIZE(value) != slicelength) {
2229 PyErr_Format(PyExc_ValueError,
2230 "attempt to assign list of size %d to extended slice of size %d",
2231 PyList_Size(value), slicelength);
2232 return -1;
2233 }
2234
2235 if (!slicelength)
2236 return 0;
2237
2238 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002239 if (self == (PyListObject*)value) {
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002240 value = list_slice((PyListObject*)value, 0,
2241 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002242 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002243 else {
2244 Py_INCREF(value);
2245 }
2246
2247 garbage = (PyObject**)
2248 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002249
2250 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002251 cur += step, i++) {
2252 garbage[i] = PyList_GET_ITEM(self, cur);
Tim Peters3b01a122002-07-19 02:35:45 +00002253
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002254 ins = PyList_GET_ITEM(value, i);
2255 Py_INCREF(ins);
2256 PyList_SET_ITEM(self, cur, ins);
2257 }
2258
2259 for (i = 0; i < slicelength; i++) {
2260 Py_DECREF(garbage[i]);
2261 }
Tim Peters3b01a122002-07-19 02:35:45 +00002262
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002263 PyMem_FREE(garbage);
2264 Py_DECREF(value);
Tim Peters3b01a122002-07-19 02:35:45 +00002265
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002266 return 0;
2267 }
Tim Peters3b01a122002-07-19 02:35:45 +00002268 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002269 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002270 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002271 "list indices must be integers");
2272 return -1;
2273 }
2274}
2275
2276static PyMappingMethods list_as_mapping = {
2277 (inquiry)list_length,
2278 (binaryfunc)list_subscript,
2279 (objobjargproc)list_ass_subscript
2280};
2281
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002282PyTypeObject PyList_Type = {
2283 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002284 0,
2285 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002286 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002287 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002288 (destructor)list_dealloc, /* tp_dealloc */
2289 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002290 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002291 0, /* tp_setattr */
2292 0, /* tp_compare */
2293 (reprfunc)list_repr, /* tp_repr */
2294 0, /* tp_as_number */
2295 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002296 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002297 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002298 0, /* tp_call */
2299 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002300 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002301 0, /* tp_setattro */
2302 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002303 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002304 Py_TPFLAGS_BASETYPE, /* tp_flags */
2305 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002306 (traverseproc)list_traverse, /* tp_traverse */
2307 (inquiry)list_clear, /* tp_clear */
2308 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002309 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002310 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002311 0, /* tp_iternext */
2312 list_methods, /* tp_methods */
2313 0, /* tp_members */
2314 0, /* tp_getset */
2315 0, /* tp_base */
2316 0, /* tp_dict */
2317 0, /* tp_descr_get */
2318 0, /* tp_descr_set */
2319 0, /* tp_dictoffset */
2320 (initproc)list_init, /* tp_init */
2321 PyType_GenericAlloc, /* tp_alloc */
2322 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002323 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002324};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002325
2326
2327/* During a sort, we really can't have anyone modifying the list; it could
2328 cause core dumps. Thus, we substitute a dummy type that raises an
2329 explanatory exception when a modifying operation is used. Caveat:
2330 comparisons may behave differently; but I guess it's a bad idea anyway to
2331 compare a list that's being sorted... */
2332
2333static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002334immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002335{
2336 PyErr_SetString(PyExc_TypeError,
2337 "a list cannot be modified while it is being sorted");
2338 return NULL;
2339}
2340
2341static PyMethodDef immutable_list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002342 {"append", (PyCFunction)immutable_list_op, METH_VARARGS},
2343 {"insert", (PyCFunction)immutable_list_op, METH_VARARGS},
Tim Peters52e07172001-08-30 06:15:32 +00002344 {"extend", (PyCFunction)immutable_list_op, METH_O},
2345 {"pop", (PyCFunction)immutable_list_op, METH_VARARGS},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002346 {"remove", (PyCFunction)immutable_list_op, METH_VARARGS},
2347 {"index", (PyCFunction)listindex, METH_O},
2348 {"count", (PyCFunction)listcount, METH_O},
2349 {"reverse", (PyCFunction)immutable_list_op, METH_VARARGS},
2350 {"sort", (PyCFunction)immutable_list_op, METH_VARARGS},
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002351 {NULL, NULL} /* sentinel */
2352};
2353
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002354static int
Fred Drakea2f55112000-07-09 15:16:51 +00002355immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002356{
2357 immutable_list_op();
2358 return -1;
2359}
2360
2361static PySequenceMethods immutable_list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002362 (inquiry)list_length, /* sq_length */
2363 (binaryfunc)list_concat, /* sq_concat */
2364 (intargfunc)list_repeat, /* sq_repeat */
2365 (intargfunc)list_item, /* sq_item */
2366 (intintargfunc)list_slice, /* sq_slice */
2367 (intobjargproc)immutable_list_ass, /* sq_ass_item */
2368 (intintobjargproc)immutable_list_ass, /* sq_ass_slice */
2369 (objobjproc)list_contains, /* sq_contains */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002370};
2371
2372static PyTypeObject immutable_list_type = {
2373 PyObject_HEAD_INIT(&PyType_Type)
2374 0,
2375 "list (immutable, during sort)",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002376 sizeof(PyListObject),
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002377 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002378 0, /* Cannot happen */ /* tp_dealloc */
2379 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002380 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002381 0, /* tp_setattr */
2382 0, /* Won't be called */ /* tp_compare */
2383 (reprfunc)list_repr, /* tp_repr */
2384 0, /* tp_as_number */
2385 &immutable_list_as_sequence, /* tp_as_sequence */
2386 0, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002387 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002388 0, /* tp_call */
2389 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002390 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002391 0, /* tp_setattro */
2392 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002393 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002394 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002395 (traverseproc)list_traverse, /* tp_traverse */
2396 0, /* tp_clear */
2397 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002398 0, /* tp_weaklistoffset */
2399 0, /* tp_iter */
2400 0, /* tp_iternext */
2401 immutable_list_methods, /* tp_methods */
2402 0, /* tp_members */
2403 0, /* tp_getset */
2404 0, /* tp_base */
2405 0, /* tp_dict */
2406 0, /* tp_descr_get */
2407 0, /* tp_descr_set */
2408 0, /* tp_init */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002409 /* NOTE: This is *not* the standard list_type struct! */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002410};
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002411
2412
2413/*********************** List Iterator **************************/
2414
2415typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002416 PyObject_HEAD
2417 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002418 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002419} listiterobject;
2420
2421PyTypeObject PyListIter_Type;
2422
Guido van Rossum5086e492002-07-16 15:56:52 +00002423static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002424list_iter(PyObject *seq)
2425{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002426 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002427
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002428 if (!PyList_Check(seq)) {
2429 PyErr_BadInternalCall();
2430 return NULL;
2431 }
2432 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2433 if (it == NULL)
2434 return NULL;
2435 it->it_index = 0;
2436 Py_INCREF(seq);
2437 it->it_seq = (PyListObject *)seq;
2438 _PyObject_GC_TRACK(it);
2439 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002440}
2441
2442static void
2443listiter_dealloc(listiterobject *it)
2444{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002445 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002446 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002447 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002448}
2449
2450static int
2451listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2452{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002453 if (it->it_seq == NULL)
2454 return 0;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002455 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002456}
2457
2458
2459static PyObject *
2460listiter_getiter(PyObject *it)
2461{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002462 Py_INCREF(it);
2463 return it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002464}
2465
2466static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002467listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002468{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002469 PyListObject *seq;
2470 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002471
Tim Peters93b2cc42002-06-01 05:22:55 +00002472 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002473 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002474 if (seq == NULL)
2475 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002476 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002477
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002478 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002479 item = PyList_GET_ITEM(seq, it->it_index);
2480 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002481 Py_INCREF(item);
2482 return item;
2483 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002484
2485 Py_DECREF(seq);
2486 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002487 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002488}
2489
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002490PyTypeObject PyListIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002491 PyObject_HEAD_INIT(&PyType_Type)
2492 0, /* ob_size */
2493 "listiterator", /* tp_name */
2494 sizeof(listiterobject), /* tp_basicsize */
2495 0, /* tp_itemsize */
2496 /* methods */
2497 (destructor)listiter_dealloc, /* tp_dealloc */
2498 0, /* tp_print */
2499 0, /* tp_getattr */
2500 0, /* tp_setattr */
2501 0, /* tp_compare */
2502 0, /* tp_repr */
2503 0, /* tp_as_number */
2504 0, /* tp_as_sequence */
2505 0, /* tp_as_mapping */
2506 0, /* tp_hash */
2507 0, /* tp_call */
2508 0, /* tp_str */
2509 PyObject_GenericGetAttr, /* tp_getattro */
2510 0, /* tp_setattro */
2511 0, /* tp_as_buffer */
2512 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2513 0, /* tp_doc */
2514 (traverseproc)listiter_traverse, /* tp_traverse */
2515 0, /* tp_clear */
2516 0, /* tp_richcompare */
2517 0, /* tp_weaklistoffset */
2518 (getiterfunc)listiter_getiter, /* tp_iter */
2519 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002520 0, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002521 0, /* tp_members */
2522 0, /* tp_getset */
2523 0, /* tp_base */
2524 0, /* tp_dict */
2525 0, /* tp_descr_get */
2526 0, /* tp_descr_set */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002527};