blob: f2132b4193b644fcb96e35cd761c9205cb85f142 [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
Guido van Rossum3f236de1996-12-10 23:55:39 +0000758/* New quicksort implementation for arrays of object pointers.
759 Thanks to discussions with Tim Peters. */
760
Guido van Rossum3f236de1996-12-10 23:55:39 +0000761/* Comparison function. Takes care of calling a user-supplied
762 comparison function (any callable Python object). Calls the
Tim Petersa8c974c2002-07-19 03:30:57 +0000763 standard comparison function, PyObject_RichCompareBool(), if the user-
764 supplied function is NULL.
765 Returns <0 on error, >0 if x < y, 0 if x >= y. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000766
767static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000768islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000769{
Tim Petersf2a04732002-07-11 21:46:16 +0000770 PyObject *res;
771 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000772 int i;
773
Tim Petersa8c974c2002-07-19 03:30:57 +0000774 if (compare == NULL)
775 return PyObject_RichCompareBool(x, y, Py_LT);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000776
Tim Petersa8c974c2002-07-19 03:30:57 +0000777 /* Call the user's comparison function and translate the 3-way
778 * result into true or false (or error).
779 */
Tim Petersf2a04732002-07-11 21:46:16 +0000780 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000781 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000782 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000783 Py_INCREF(x);
784 Py_INCREF(y);
785 PyTuple_SET_ITEM(args, 0, x);
786 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000787 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000789 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000790 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 if (!PyInt_Check(res)) {
792 Py_DECREF(res);
793 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000794 "comparison function must return int");
Tim Petersa8c974c2002-07-19 03:30:57 +0000795 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000796 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 i = PyInt_AsLong(res);
798 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000799 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000800}
801
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000802/* MINSIZE is the smallest array that will get a full-blown samplesort
803 treatment; smaller arrays are sorted using binary insertion. It must
804 be at least 7 for the samplesort implementation to work. Binary
805 insertion does fewer compares, but can suffer O(N**2) data movement.
806 The more expensive compares, the larger MINSIZE should be. */
807#define MINSIZE 100
808
809/* MINPARTITIONSIZE is the smallest array slice samplesort will bother to
810 partition; smaller slices are passed to binarysort. It must be at
811 least 2, and no larger than MINSIZE. Setting it higher reduces the #
812 of compares slowly, but increases the amount of data movement quickly.
813 The value here was chosen assuming a compare costs ~25x more than
814 swapping a pair of memory-resident pointers -- but under that assumption,
815 changing the value by a few dozen more or less has aggregate effect
816 under 1%. So the value is crucial, but not touchy <wink>. */
817#define MINPARTITIONSIZE 40
818
819/* MAXMERGE is the largest number of elements we'll always merge into
820 a known-to-be sorted chunk via binary insertion, regardless of the
821 size of that chunk. Given a chunk of N sorted elements, and a group
822 of K unknowns, the largest K for which it's better to do insertion
823 (than a full-blown sort) is a complicated function of N and K mostly
824 involving the expected number of compares and data moves under each
825 approach, and the relative cost of those operations on a specific
826 architecure. The fixed value here is conservative, and should be a
827 clear win regardless of architecture or N. */
828#define MAXMERGE 15
Guido van Rossum3f236de1996-12-10 23:55:39 +0000829
Guido van Rossum3f236de1996-12-10 23:55:39 +0000830/* STACKSIZE is the size of our work stack. A rough estimate is that
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000831 this allows us to sort arrays of size N where
832 N / ln(N) = MINPARTITIONSIZE * 2**STACKSIZE, so 60 is more than enough
833 for arrays of size 2**64. Because we push the biggest partition
834 first, the worst case occurs when all subarrays are always partitioned
835 exactly in two. */
836#define STACKSIZE 60
Guido van Rossum3f236de1996-12-10 23:55:39 +0000837
Tim Petersa8c974c2002-07-19 03:30:57 +0000838/* Compare X to Y via islt(). Goto "fail" if the comparison raises an
839 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
840 started. It makes more sense in context <wink>. X and Y are PyObject*s.
841*/
842#define IFLT(X, Y) if ((k = islt(X, Y, compare)) < 0) goto fail; \
843 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000844
845/* binarysort is the best method for sorting small arrays: it does
846 few compares, but can do data movement quadratic in the number of
847 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000848 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000849 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000850 On entry, must have lo <= start <= hi, and that [lo, start) is already
851 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000852 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000853 Even in case of error, the output slice will be some permutation of
854 the input (nothing is lost or duplicated).
855*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000856
857static int
Fred Drakea2f55112000-07-09 15:16:51 +0000858binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
859 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000860{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000861 register int k;
862 register PyObject **l, **p, **r;
863 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000864
Tim Petersa8c974c2002-07-19 03:30:57 +0000865 assert(lo <= start && start <= hi);
866 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000867 if (lo == start)
868 ++start;
869 for (; start < hi; ++start) {
870 /* set l to where *start belongs */
871 l = lo;
872 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000873 pivot = *r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000874 do {
875 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000876 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000877 r = p;
878 else
879 l = p + 1;
880 } while (l < r);
881 /* Pivot should go at l -- slide over to make room.
882 Caution: using memmove is much slower under MSVC 5;
883 we're not usually moving many slots. */
884 for (p = start; p > l; --p)
885 *p = *(p-1);
886 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000887 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000888 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000889
890 fail:
891 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000892}
893
894/* samplesortslice is the sorting workhorse.
Guido van Rossum42812581998-06-17 14:15:44 +0000895 [lo, hi) is a contiguous slice of a list, to be sorted in place.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000896 On entry, must have lo <= hi,
Tim Petersa8c974c2002-07-19 03:30:57 +0000897 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000898 Even in case of error, the output slice will be some permutation of
899 the input (nothing is lost or duplicated).
900
901 samplesort is basically quicksort on steroids: a power of 2 close
902 to n/ln(n) is computed, and that many elements (less 1) are picked at
903 random from the array and sorted. These 2**k - 1 elements are then
904 used as preselected pivots for an equal number of quicksort
905 partitioning steps, partitioning the slice into 2**k chunks each of
906 size about ln(n). These small final chunks are then usually handled
907 by binarysort. Note that when k=1, this is roughly the same as an
908 ordinary quicksort using a random pivot, and when k=2 this is roughly
909 a median-of-3 quicksort. From that view, using k ~= lg(n/ln(n)) makes
910 this a "median of n/ln(n)" quicksort. You can also view it as a kind
911 of bucket sort, where 2**k-1 bucket boundaries are picked dynamically.
912
913 The large number of samples makes a quadratic-time case almost
914 impossible, and asymptotically drives the average-case number of
915 compares from quicksort's 2 N ln N (or 12/7 N ln N for the median-of-
916 3 variant) down to N lg N.
917
918 We also play lots of low-level tricks to cut the number of compares.
Tim Peters3b01a122002-07-19 02:35:45 +0000919
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000920 Very obscure: To avoid using extra memory, the PPs are stored in the
921 array and shuffled around as partitioning proceeds. At the start of a
922 partitioning step, we'll have 2**m-1 (for some m) PPs in sorted order,
923 adjacent (either on the left or the right!) to a chunk of X elements
924 that are to be partitioned: P X or X P. In either case we need to
925 shuffle things *in place* so that the 2**(m-1) smaller PPs are on the
926 left, followed by the PP to be used for this step (that's the middle
927 of the PPs), followed by X, followed by the 2**(m-1) larger PPs:
928 P X or X P -> Psmall pivot X Plarge
929 and the order of the PPs must not be altered. It can take a while
930 to realize this isn't trivial! It can take even longer <wink> to
931 understand why the simple code below works, using only 2**(m-1) swaps.
932 The key is that the order of the X elements isn't necessarily
933 preserved: X can end up as some cyclic permutation of its original
934 order. That's OK, because X is unsorted anyway. If the order of X
935 had to be preserved too, the simplest method I know of using O(1)
936 scratch storage requires len(X) + 2**(m-1) swaps, spread over 2 passes.
937 Since len(X) is typically several times larger than 2**(m-1), that
938 would slow things down.
939*/
940
941struct SamplesortStackNode {
942 /* Represents a slice of the array, from (& including) lo up
943 to (but excluding) hi. "extra" additional & adjacent elements
944 are pre-selected pivots (PPs), spanning [lo-extra, lo) if
945 extra > 0, or [hi, hi-extra) if extra < 0. The PPs are
946 already sorted, but nothing is known about the other elements
947 in [lo, hi). |extra| is always one less than a power of 2.
948 When extra is 0, we're out of PPs, and the slice must be
949 sorted by some other means. */
950 PyObject **lo;
951 PyObject **hi;
952 int extra;
953};
954
955/* The number of PPs we want is 2**k - 1, where 2**k is as close to
Guido van Rossum42812581998-06-17 14:15:44 +0000956 N / ln(N) as possible. So k ~= lg(N / ln(N)). Calling libm routines
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000957 is undesirable, so cutoff values are canned in the "cutoff" table
958 below: cutoff[i] is the smallest N such that k == CUTOFFBASE + i. */
959#define CUTOFFBASE 4
Guido van Rossum3aa23fd1999-01-14 19:01:53 +0000960static long cutoff[] = {
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000961 43, /* smallest N such that k == 4 */
962 106, /* etc */
963 250,
964 576,
965 1298,
966 2885,
967 6339,
968 13805,
969 29843,
970 64116,
971 137030,
972 291554,
973 617916,
974 1305130,
975 2748295,
976 5771662,
977 12091672,
978 25276798,
979 52734615,
980 109820537,
981 228324027,
982 473977813,
983 982548444, /* smallest N such that k == 26 */
984 2034159050 /* largest N that fits in signed 32-bit; k == 27 */
985};
986
987static int
Fred Drakea2f55112000-07-09 15:16:51 +0000988samplesortslice(PyObject **lo, PyObject **hi, PyObject *compare)
989 /* compare -- comparison function object, or NULL for default */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000990{
991 register PyObject **l, **r;
992 register PyObject *tmp, *pivot;
993 register int k;
994 int n, extra, top, extraOnRight;
995 struct SamplesortStackNode stack[STACKSIZE];
996
997 /* assert lo <= hi */
998 n = hi - lo;
999
1000 /* ----------------------------------------------------------
1001 * Special cases
1002 * --------------------------------------------------------*/
1003 if (n < 2)
1004 return 0;
1005
1006 /* Set r to the largest value such that [lo,r) is sorted.
1007 This catches the already-sorted case, the all-the-same
1008 case, and the appended-a-few-elements-to-a-sorted-list case.
1009 If the array is unsorted, we're very likely to get out of
1010 the loop fast, so the test is cheap if it doesn't pay off.
1011 */
1012 /* assert lo < hi */
1013 for (r = lo+1; r < hi; ++r) {
Tim Petersa8c974c2002-07-19 03:30:57 +00001014 IFLT(*r, *(r-1))
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001015 break;
1016 }
1017 /* [lo,r) is sorted, [r,hi) unknown. Get out cheap if there are
1018 few unknowns, or few elements in total. */
1019 if (hi - r <= MAXMERGE || n < MINSIZE)
Guido van Rossum42812581998-06-17 14:15:44 +00001020 return binarysort(lo, hi, r, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001021
1022 /* Check for the array already being reverse-sorted. Typical
1023 benchmark-driven silliness <wink>. */
1024 /* assert lo < hi */
1025 for (r = lo+1; r < hi; ++r) {
Tim Petersa8c974c2002-07-19 03:30:57 +00001026 IFLT(*(r-1), *r)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001027 break;
1028 }
1029 if (hi - r <= MAXMERGE) {
1030 /* Reverse the reversed prefix, then insert the tail */
Tim Peters8e2e7ca2002-07-19 02:33:08 +00001031 reverse_slice(lo, r);
1032 return binarysort(lo, hi, r, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001033 }
1034
1035 /* ----------------------------------------------------------
1036 * Normal case setup: a large array without obvious pattern.
1037 * --------------------------------------------------------*/
1038
1039 /* extra := a power of 2 ~= n/ln(n), less 1.
1040 First find the smallest extra s.t. n < cutoff[extra] */
1041 for (extra = 0;
1042 extra < sizeof(cutoff) / sizeof(cutoff[0]);
1043 ++extra) {
1044 if (n < cutoff[extra])
1045 break;
1046 /* note that if we fall out of the loop, the value of
1047 extra still makes *sense*, but may be smaller than
1048 we would like (but the array has more than ~= 2**31
Tim Peters3b01a122002-07-19 02:35:45 +00001049 elements in this case!) */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001050 }
1051 /* Now k == extra - 1 + CUTOFFBASE. The smallest value k can
1052 have is CUTOFFBASE-1, so
1053 assert MINSIZE >= 2**(CUTOFFBASE-1) - 1 */
1054 extra = (1 << (extra - 1 + CUTOFFBASE)) - 1;
1055 /* assert extra > 0 and n >= extra */
1056
1057 /* Swap that many values to the start of the array. The
1058 selection of elements is pseudo-random, but the same on
1059 every run (this is intentional! timing algorithm changes is
1060 a pain if timing varies across runs). */
1061 {
1062 unsigned int seed = n / extra; /* arbitrary */
1063 unsigned int i;
1064 for (i = 0; i < (unsigned)extra; ++i) {
1065 /* j := random int in [i, n) */
1066 unsigned int j;
1067 seed = seed * 69069 + 7;
1068 j = i + seed % (n - i);
1069 tmp = lo[i]; lo[i] = lo[j]; lo[j] = tmp;
1070 }
1071 }
1072
1073 /* Recursively sort the preselected pivots. */
Guido van Rossum42812581998-06-17 14:15:44 +00001074 if (samplesortslice(lo, lo + extra, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001075 goto fail;
1076
1077 top = 0; /* index of available stack slot */
1078 lo += extra; /* point to first unknown */
1079 extraOnRight = 0; /* the PPs are at the left end */
1080
1081 /* ----------------------------------------------------------
1082 * Partition [lo, hi), and repeat until out of work.
1083 * --------------------------------------------------------*/
1084 for (;;) {
1085 /* assert lo <= hi, so n >= 0 */
1086 n = hi - lo;
1087
1088 /* We may not want, or may not be able, to partition:
1089 If n is small, it's quicker to insert.
1090 If extra is 0, we're out of pivots, and *must* use
1091 another method.
1092 */
1093 if (n < MINPARTITIONSIZE || extra == 0) {
1094 if (n >= MINSIZE) {
1095 /* assert extra == 0
1096 This is rare, since the average size
1097 of a final block is only about
1098 ln(original n). */
Guido van Rossum42812581998-06-17 14:15:44 +00001099 if (samplesortslice(lo, hi, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001100 goto fail;
1101 }
1102 else {
1103 /* Binary insertion should be quicker,
1104 and we can take advantage of the PPs
1105 already being sorted. */
1106 if (extraOnRight && extra) {
1107 /* swap the PPs to the left end */
1108 k = extra;
1109 do {
1110 tmp = *lo;
1111 *lo = *hi;
1112 *hi = tmp;
1113 ++lo; ++hi;
1114 } while (--k);
1115 }
1116 if (binarysort(lo - extra, hi, lo,
Guido van Rossum42812581998-06-17 14:15:44 +00001117 compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001118 goto fail;
1119 }
1120
1121 /* Find another slice to work on. */
1122 if (--top < 0)
1123 break; /* no more -- done! */
1124 lo = stack[top].lo;
1125 hi = stack[top].hi;
1126 extra = stack[top].extra;
1127 extraOnRight = 0;
1128 if (extra < 0) {
1129 extraOnRight = 1;
1130 extra = -extra;
1131 }
1132 continue;
1133 }
1134
1135 /* Pretend the PPs are indexed 0, 1, ..., extra-1.
1136 Then our preselected pivot is at (extra-1)/2, and we
1137 want to move the PPs before that to the left end of
1138 the slice, and the PPs after that to the right end.
1139 The following section changes extra, lo, hi, and the
1140 slice such that:
1141 [lo-extra, lo) contains the smaller PPs.
1142 *lo == our PP.
1143 (lo, hi) contains the unknown elements.
1144 [hi, hi+extra) contains the larger PPs.
1145 */
Tim Peters3b01a122002-07-19 02:35:45 +00001146 k = extra >>= 1; /* num PPs to move */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001147 if (extraOnRight) {
1148 /* Swap the smaller PPs to the left end.
1149 Note that this loop actually moves k+1 items:
1150 the last is our PP */
1151 do {
1152 tmp = *lo; *lo = *hi; *hi = tmp;
1153 ++lo; ++hi;
1154 } while (k--);
1155 }
1156 else {
1157 /* Swap the larger PPs to the right end. */
1158 while (k--) {
1159 --lo; --hi;
1160 tmp = *lo; *lo = *hi; *hi = tmp;
1161 }
1162 }
1163 --lo; /* *lo is now our PP */
1164 pivot = *lo;
1165
1166 /* Now an almost-ordinary quicksort partition step.
1167 Note that most of the time is spent here!
1168 Only odd thing is that we partition into < and >=,
1169 instead of the usual <= and >=. This helps when
1170 there are lots of duplicates of different values,
1171 because it eventually tends to make subfiles
1172 "pure" (all duplicates), and we special-case for
1173 duplicates later. */
1174 l = lo + 1;
1175 r = hi - 1;
1176 /* assert lo < l < r < hi (small n weeded out above) */
1177
1178 do {
1179 /* slide l right, looking for key >= pivot */
1180 do {
Tim Petersa8c974c2002-07-19 03:30:57 +00001181 IFLT(*l, pivot)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001182 ++l;
1183 else
1184 break;
1185 } while (l < r);
1186
1187 /* slide r left, looking for key < pivot */
1188 while (l < r) {
Guido van Rossum42812581998-06-17 14:15:44 +00001189 register PyObject *rval = *r--;
Tim Petersa8c974c2002-07-19 03:30:57 +00001190 IFLT(rval, pivot) {
Guido van Rossum42812581998-06-17 14:15:44 +00001191 /* swap and advance */
1192 r[1] = *l;
1193 *l++ = rval;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001194 break;
Guido van Rossum42812581998-06-17 14:15:44 +00001195 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001196 }
1197
1198 } while (l < r);
1199
1200 /* assert lo < r <= l < hi
1201 assert r == l or r+1 == l
1202 everything to the left of l is < pivot, and
1203 everything to the right of r is >= pivot */
1204
1205 if (l == r) {
Tim Petersa8c974c2002-07-19 03:30:57 +00001206 IFLT(*r, pivot)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001207 ++l;
1208 else
1209 --r;
1210 }
1211 /* assert lo <= r and r+1 == l and l <= hi
1212 assert r == lo or a[r] < pivot
1213 assert a[lo] is pivot
1214 assert l == hi or a[l] >= pivot
1215 Swap the pivot into "the middle", so we can henceforth
1216 ignore it.
1217 */
1218 *lo = *r;
1219 *r = pivot;
1220
1221 /* The following is true now, & will be preserved:
1222 All in [lo,r) are < pivot
1223 All in [r,l) == pivot (& so can be ignored)
1224 All in [l,hi) are >= pivot */
1225
1226 /* Check for duplicates of the pivot. One compare is
1227 wasted if there are no duplicates, but can win big
1228 when there are.
1229 Tricky: we're sticking to "<" compares, so deduce
1230 equality indirectly. We know pivot <= *l, so they're
1231 equal iff not pivot < *l.
1232 */
1233 while (l < hi) {
1234 /* pivot <= *l known */
Tim Petersa8c974c2002-07-19 03:30:57 +00001235 IFLT(pivot, *l)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001236 break;
1237 else
1238 /* <= and not < implies == */
1239 ++l;
1240 }
1241
1242 /* assert lo <= r < l <= hi
1243 Partitions are [lo, r) and [l, hi) */
1244
1245 /* push fattest first; remember we still have extra PPs
1246 to the left of the left chunk and to the right of
1247 the right chunk! */
1248 /* assert top < STACKSIZE */
1249 if (r - lo <= hi - l) {
1250 /* second is bigger */
1251 stack[top].lo = l;
1252 stack[top].hi = hi;
1253 stack[top].extra = -extra;
1254 hi = r;
1255 extraOnRight = 0;
1256 }
1257 else {
1258 /* first is bigger */
1259 stack[top].lo = lo;
1260 stack[top].hi = r;
1261 stack[top].extra = extra;
1262 lo = l;
1263 extraOnRight = 1;
1264 }
1265 ++top;
1266
1267 } /* end of partitioning loop */
1268
1269 return 0;
1270
1271 fail:
1272 return -1;
1273}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001274
Tim Petersa8c974c2002-07-19 03:30:57 +00001275#undef IFLT
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001276
Jeremy Hylton938ace62002-07-17 16:30:39 +00001277static PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001278
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001279static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001280listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001281{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001282 int err;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001283 PyObject *compare = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001284 PyTypeObject *savetype;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001285
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001286 if (args != NULL) {
Guido van Rossumc00a9382000-02-24 21:48:29 +00001287 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001288 return NULL;
1289 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001290 savetype = self->ob_type;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001291 self->ob_type = &immutable_list_type;
1292 err = samplesortslice(self->ob_item,
1293 self->ob_item + self->ob_size,
Guido van Rossum42812581998-06-17 14:15:44 +00001294 compare);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001295 self->ob_type = savetype;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001296 if (err < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001297 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 Py_INCREF(Py_None);
1299 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001300}
1301
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001302int
Fred Drakea2f55112000-07-09 15:16:51 +00001303PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001304{
1305 if (v == NULL || !PyList_Check(v)) {
1306 PyErr_BadInternalCall();
1307 return -1;
1308 }
1309 v = listsort((PyListObject *)v, (PyObject *)NULL);
1310 if (v == NULL)
1311 return -1;
1312 Py_DECREF(v);
1313 return 0;
1314}
1315
Guido van Rossumb86c5492001-02-12 22:06:02 +00001316static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001317listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00001318{
Tim Peters8e2e7ca2002-07-19 02:33:08 +00001319 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 Py_INCREF(Py_None);
1321 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001322}
1323
Guido van Rossum84c76f51990-10-30 13:32:20 +00001324int
Fred Drakea2f55112000-07-09 15:16:51 +00001325PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001326{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 if (v == NULL || !PyList_Check(v)) {
1328 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001329 return -1;
1330 }
Tim Peters8e2e7ca2002-07-19 02:33:08 +00001331 listreverse((PyListObject *)v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001332 return 0;
1333}
1334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001336PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001337{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 PyObject *w;
1339 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001340 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 if (v == NULL || !PyList_Check(v)) {
1342 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001343 return NULL;
1344 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 n = ((PyListObject *)v)->ob_size;
1346 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001347 if (w == NULL)
1348 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001350 memcpy((void *)p,
1351 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001353 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001355 p++;
1356 }
1357 return w;
1358}
1359
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001361listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001362{
1363 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001364
Guido van Rossumed98d481991-03-06 13:07:53 +00001365 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001366 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1367 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001369 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001370 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001373 return NULL;
1374}
1375
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001377listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001378{
1379 int count = 0;
1380 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001381
Guido van Rossume6f7d181991-10-20 20:20:40 +00001382 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001383 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1384 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001385 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001386 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001387 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001388 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001390}
1391
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001393listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001394{
1395 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001396
Guido van Rossumed98d481991-03-06 13:07:53 +00001397 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001398 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1399 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 if (list_ass_slice(self, i, i+1,
1401 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001402 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 Py_INCREF(Py_None);
1404 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001405 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001406 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001407 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001408 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001410 return NULL;
1411}
1412
Jeremy Hylton8caad492000-06-23 14:18:11 +00001413static int
1414list_traverse(PyListObject *o, visitproc visit, void *arg)
1415{
1416 int i, err;
1417 PyObject *x;
1418
1419 for (i = o->ob_size; --i >= 0; ) {
1420 x = o->ob_item[i];
1421 if (x != NULL) {
1422 err = visit(x, arg);
1423 if (err)
1424 return err;
1425 }
1426 }
1427 return 0;
1428}
1429
1430static int
1431list_clear(PyListObject *lp)
1432{
1433 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1434 return 0;
1435}
1436
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001437static PyObject *
1438list_richcompare(PyObject *v, PyObject *w, int op)
1439{
1440 PyListObject *vl, *wl;
1441 int i;
1442
1443 if (!PyList_Check(v) || !PyList_Check(w)) {
1444 Py_INCREF(Py_NotImplemented);
1445 return Py_NotImplemented;
1446 }
1447
1448 vl = (PyListObject *)v;
1449 wl = (PyListObject *)w;
1450
1451 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1452 /* Shortcut: if the lengths differ, the lists differ */
1453 PyObject *res;
1454 if (op == Py_EQ)
1455 res = Py_False;
1456 else
1457 res = Py_True;
1458 Py_INCREF(res);
1459 return res;
1460 }
1461
1462 /* Search for the first index where items are different */
1463 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1464 int k = PyObject_RichCompareBool(vl->ob_item[i],
1465 wl->ob_item[i], Py_EQ);
1466 if (k < 0)
1467 return NULL;
1468 if (!k)
1469 break;
1470 }
1471
1472 if (i >= vl->ob_size || i >= wl->ob_size) {
1473 /* No more items to compare -- compare sizes */
1474 int vs = vl->ob_size;
1475 int ws = wl->ob_size;
1476 int cmp;
1477 PyObject *res;
1478 switch (op) {
1479 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001480 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001481 case Py_EQ: cmp = vs == ws; break;
1482 case Py_NE: cmp = vs != ws; break;
1483 case Py_GT: cmp = vs > ws; break;
1484 case Py_GE: cmp = vs >= ws; break;
1485 default: return NULL; /* cannot happen */
1486 }
1487 if (cmp)
1488 res = Py_True;
1489 else
1490 res = Py_False;
1491 Py_INCREF(res);
1492 return res;
1493 }
1494
1495 /* We have an item that differs -- shortcuts for EQ/NE */
1496 if (op == Py_EQ) {
1497 Py_INCREF(Py_False);
1498 return Py_False;
1499 }
1500 if (op == Py_NE) {
1501 Py_INCREF(Py_True);
1502 return Py_True;
1503 }
1504
1505 /* Compare the final item again using the proper operator */
1506 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1507}
1508
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509/* Adapted from newer code by Tim */
1510static int
1511list_fill(PyListObject *result, PyObject *v)
1512{
1513 PyObject *it; /* iter(v) */
1514 int n; /* guess for result list size */
1515 int i;
1516
1517 n = result->ob_size;
1518
1519 /* Special-case list(a_list), for speed. */
1520 if (PyList_Check(v)) {
1521 if (v == (PyObject *)result)
1522 return 0; /* source is destination, we're done */
1523 return list_ass_slice(result, 0, n, v);
1524 }
1525
1526 /* Empty previous contents */
1527 if (n != 0) {
1528 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1529 return -1;
1530 }
1531
1532 /* Get iterator. There may be some low-level efficiency to be gained
1533 * by caching the tp_iternext slot instead of using PyIter_Next()
1534 * later, but premature optimization is the root etc.
1535 */
1536 it = PyObject_GetIter(v);
1537 if (it == NULL)
1538 return -1;
1539
1540 /* Guess a result list size. */
1541 n = -1; /* unknown */
1542 if (PySequence_Check(v) &&
1543 v->ob_type->tp_as_sequence->sq_length) {
1544 n = PySequence_Size(v);
1545 if (n < 0)
1546 PyErr_Clear();
1547 }
1548 if (n < 0)
1549 n = 8; /* arbitrary */
1550 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001551 if (result->ob_item == NULL) {
1552 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001553 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001554 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00001555 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001556 result->ob_size = n;
1557
1558 /* Run iterator to exhaustion. */
1559 for (i = 0; ; i++) {
1560 PyObject *item = PyIter_Next(it);
1561 if (item == NULL) {
1562 if (PyErr_Occurred())
1563 goto error;
1564 break;
1565 }
1566 if (i < n)
1567 PyList_SET_ITEM(result, i, item); /* steals ref */
1568 else {
1569 int status = ins1(result, result->ob_size, item);
1570 Py_DECREF(item); /* append creates a new ref */
1571 if (status < 0)
1572 goto error;
1573 }
1574 }
1575
1576 /* Cut back result list if initial guess was too large. */
1577 if (i < n && result != NULL) {
1578 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
1579 goto error;
1580 }
1581 Py_DECREF(it);
1582 return 0;
1583
1584 error:
1585 Py_DECREF(it);
1586 return -1;
1587}
1588
1589static int
1590list_init(PyListObject *self, PyObject *args, PyObject *kw)
1591{
1592 PyObject *arg = NULL;
1593 static char *kwlist[] = {"sequence", 0};
1594
1595 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
1596 return -1;
1597 if (arg != NULL)
1598 return list_fill(self, arg);
1599 if (self->ob_size > 0)
1600 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
1601 return 0;
1602}
1603
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001604static long
1605list_nohash(PyObject *self)
1606{
1607 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
1608 return -1;
1609}
1610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001611PyDoc_STRVAR(append_doc,
1612"L.append(object) -- append object to end");
1613PyDoc_STRVAR(extend_doc,
1614"L.extend(list) -- extend list by appending list elements");
1615PyDoc_STRVAR(insert_doc,
1616"L.insert(index, object) -- insert object before index");
1617PyDoc_STRVAR(pop_doc,
1618"L.pop([index]) -> item -- remove and return item at index (default last)");
1619PyDoc_STRVAR(remove_doc,
1620"L.remove(value) -- remove first occurrence of value");
1621PyDoc_STRVAR(index_doc,
1622"L.index(value) -> integer -- return index of first occurrence of value");
1623PyDoc_STRVAR(count_doc,
1624"L.count(value) -> integer -- return number of occurrences of value");
1625PyDoc_STRVAR(reverse_doc,
1626"L.reverse() -- reverse *IN PLACE*");
1627PyDoc_STRVAR(sort_doc,
1628"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001629
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001631 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001632 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001633 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001634 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001635 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
1636 {"index", (PyCFunction)listindex, METH_O, index_doc},
1637 {"count", (PyCFunction)listcount, METH_O, count_doc},
1638 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001639 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001640 {NULL, NULL} /* sentinel */
1641};
1642
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001644 (inquiry)list_length, /* sq_length */
1645 (binaryfunc)list_concat, /* sq_concat */
1646 (intargfunc)list_repeat, /* sq_repeat */
1647 (intargfunc)list_item, /* sq_item */
1648 (intintargfunc)list_slice, /* sq_slice */
1649 (intobjargproc)list_ass_item, /* sq_ass_item */
1650 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
1651 (objobjproc)list_contains, /* sq_contains */
1652 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
1653 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001654};
1655
Neal Norwitz2c2e8272002-06-14 02:04:18 +00001656PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001657"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00001658"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001659
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00001660static PyObject *list_iter(PyObject *seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001661
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00001662static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001663list_subscript(PyListObject* self, PyObject* item)
1664{
1665 if (PyInt_Check(item)) {
1666 long i = PyInt_AS_LONG(item);
1667 if (i < 0)
1668 i += PyList_GET_SIZE(self);
1669 return list_item(self, i);
1670 }
1671 else if (PyLong_Check(item)) {
1672 long i = PyLong_AsLong(item);
1673 if (i == -1 && PyErr_Occurred())
1674 return NULL;
1675 if (i < 0)
1676 i += PyList_GET_SIZE(self);
1677 return list_item(self, i);
1678 }
1679 else if (PySlice_Check(item)) {
1680 int start, stop, step, slicelength, cur, i;
1681 PyObject* result;
1682 PyObject* it;
1683
1684 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1685 &start, &stop, &step, &slicelength) < 0) {
1686 return NULL;
1687 }
1688
1689 if (slicelength <= 0) {
1690 return PyList_New(0);
1691 }
1692 else {
1693 result = PyList_New(slicelength);
1694 if (!result) return NULL;
1695
Tim Peters3b01a122002-07-19 02:35:45 +00001696 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001697 cur += step, i++) {
1698 it = PyList_GET_ITEM(self, cur);
1699 Py_INCREF(it);
1700 PyList_SET_ITEM(result, i, it);
1701 }
Tim Peters3b01a122002-07-19 02:35:45 +00001702
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001703 return result;
1704 }
1705 }
1706 else {
1707 PyErr_SetString(PyExc_TypeError,
1708 "list indices must be integers");
1709 return NULL;
1710 }
1711}
1712
Tim Peters3b01a122002-07-19 02:35:45 +00001713static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001714list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
1715{
1716 if (PyInt_Check(item)) {
1717 long i = PyInt_AS_LONG(item);
1718 if (i < 0)
1719 i += PyList_GET_SIZE(self);
1720 return list_ass_item(self, i, value);
1721 }
1722 else if (PyLong_Check(item)) {
1723 long i = PyLong_AsLong(item);
1724 if (i == -1 && PyErr_Occurred())
1725 return -1;
1726 if (i < 0)
1727 i += PyList_GET_SIZE(self);
1728 return list_ass_item(self, i, value);
1729 }
1730 else if (PySlice_Check(item)) {
1731 int start, stop, step, slicelength;
1732
1733 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1734 &start, &stop, &step, &slicelength) < 0) {
1735 return -1;
1736 }
1737
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001738 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
1739 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1740 return list_ass_slice(self, start, stop, value);
1741
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001742 if (value == NULL) {
1743 /* delete slice */
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001744 PyObject **garbage, **it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001745 int cur, i, j;
Tim Peters3b01a122002-07-19 02:35:45 +00001746
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001747 if (slicelength <= 0)
1748 return 0;
1749
1750 if (step < 0) {
1751 stop = start + 1;
1752 start = stop + step*(slicelength - 1) - 1;
1753 step = -step;
1754 }
1755
1756 garbage = (PyObject**)
1757 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00001758
1759 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001760 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00001761 for (cur = start, i = 0;
1762 cur < stop;
1763 cur += step, i++)
1764 {
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001765 garbage[i] = PyList_GET_ITEM(self, cur);
1766
1767 for (j = 0; j < step; j++) {
Tim Peters3b01a122002-07-19 02:35:45 +00001768 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00001769 PyList_GET_ITEM(self,
1770 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001771 }
1772 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001773 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001774 cur < self->ob_size; cur++) {
1775 PyList_SET_ITEM(self, cur - slicelength,
1776 PyList_GET_ITEM(self, cur));
1777 }
1778 self->ob_size -= slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001779 it = self->ob_item;
1780 NRESIZE(it, PyObject*, self->ob_size);
1781 self->ob_item = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001782
1783 for (i = 0; i < slicelength; i++) {
1784 Py_DECREF(garbage[i]);
1785 }
1786 PyMem_FREE(garbage);
1787
1788 return 0;
1789 }
1790 else {
1791 /* assign slice */
1792 PyObject **garbage, *ins;
1793 int cur, i;
1794
1795 if (!PyList_Check(value)) {
1796 PyErr_Format(PyExc_TypeError,
1797 "must assign list (not \"%.200s\") to slice",
1798 value->ob_type->tp_name);
1799 return -1;
1800 }
1801
1802 if (PyList_GET_SIZE(value) != slicelength) {
1803 PyErr_Format(PyExc_ValueError,
1804 "attempt to assign list of size %d to extended slice of size %d",
1805 PyList_Size(value), slicelength);
1806 return -1;
1807 }
1808
1809 if (!slicelength)
1810 return 0;
1811
1812 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00001813 if (self == (PyListObject*)value) {
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001814 value = list_slice((PyListObject*)value, 0,
1815 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00001816 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001817 else {
1818 Py_INCREF(value);
1819 }
1820
1821 garbage = (PyObject**)
1822 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00001823
1824 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001825 cur += step, i++) {
1826 garbage[i] = PyList_GET_ITEM(self, cur);
Tim Peters3b01a122002-07-19 02:35:45 +00001827
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001828 ins = PyList_GET_ITEM(value, i);
1829 Py_INCREF(ins);
1830 PyList_SET_ITEM(self, cur, ins);
1831 }
1832
1833 for (i = 0; i < slicelength; i++) {
1834 Py_DECREF(garbage[i]);
1835 }
Tim Peters3b01a122002-07-19 02:35:45 +00001836
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001837 PyMem_FREE(garbage);
1838 Py_DECREF(value);
Tim Peters3b01a122002-07-19 02:35:45 +00001839
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001840 return 0;
1841 }
Tim Peters3b01a122002-07-19 02:35:45 +00001842 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001843 else {
Tim Peters3b01a122002-07-19 02:35:45 +00001844 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001845 "list indices must be integers");
1846 return -1;
1847 }
1848}
1849
1850static PyMappingMethods list_as_mapping = {
1851 (inquiry)list_length,
1852 (binaryfunc)list_subscript,
1853 (objobjargproc)list_ass_subscript
1854};
1855
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001856PyTypeObject PyList_Type = {
1857 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001858 0,
1859 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001860 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001861 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001862 (destructor)list_dealloc, /* tp_dealloc */
1863 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001864 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001865 0, /* tp_setattr */
1866 0, /* tp_compare */
1867 (reprfunc)list_repr, /* tp_repr */
1868 0, /* tp_as_number */
1869 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001870 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001871 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001872 0, /* tp_call */
1873 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001874 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001875 0, /* tp_setattro */
1876 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001877 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001878 Py_TPFLAGS_BASETYPE, /* tp_flags */
1879 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001880 (traverseproc)list_traverse, /* tp_traverse */
1881 (inquiry)list_clear, /* tp_clear */
1882 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001883 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001884 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001885 0, /* tp_iternext */
1886 list_methods, /* tp_methods */
1887 0, /* tp_members */
1888 0, /* tp_getset */
1889 0, /* tp_base */
1890 0, /* tp_dict */
1891 0, /* tp_descr_get */
1892 0, /* tp_descr_set */
1893 0, /* tp_dictoffset */
1894 (initproc)list_init, /* tp_init */
1895 PyType_GenericAlloc, /* tp_alloc */
1896 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00001897 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001898};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001899
1900
1901/* During a sort, we really can't have anyone modifying the list; it could
1902 cause core dumps. Thus, we substitute a dummy type that raises an
1903 explanatory exception when a modifying operation is used. Caveat:
1904 comparisons may behave differently; but I guess it's a bad idea anyway to
1905 compare a list that's being sorted... */
1906
1907static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001908immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001909{
1910 PyErr_SetString(PyExc_TypeError,
1911 "a list cannot be modified while it is being sorted");
1912 return NULL;
1913}
1914
1915static PyMethodDef immutable_list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001916 {"append", (PyCFunction)immutable_list_op, METH_VARARGS},
1917 {"insert", (PyCFunction)immutable_list_op, METH_VARARGS},
Tim Peters52e07172001-08-30 06:15:32 +00001918 {"extend", (PyCFunction)immutable_list_op, METH_O},
1919 {"pop", (PyCFunction)immutable_list_op, METH_VARARGS},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001920 {"remove", (PyCFunction)immutable_list_op, METH_VARARGS},
1921 {"index", (PyCFunction)listindex, METH_O},
1922 {"count", (PyCFunction)listcount, METH_O},
1923 {"reverse", (PyCFunction)immutable_list_op, METH_VARARGS},
1924 {"sort", (PyCFunction)immutable_list_op, METH_VARARGS},
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001925 {NULL, NULL} /* sentinel */
1926};
1927
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001928static int
Fred Drakea2f55112000-07-09 15:16:51 +00001929immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001930{
1931 immutable_list_op();
1932 return -1;
1933}
1934
1935static PySequenceMethods immutable_list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001936 (inquiry)list_length, /* sq_length */
1937 (binaryfunc)list_concat, /* sq_concat */
1938 (intargfunc)list_repeat, /* sq_repeat */
1939 (intargfunc)list_item, /* sq_item */
1940 (intintargfunc)list_slice, /* sq_slice */
1941 (intobjargproc)immutable_list_ass, /* sq_ass_item */
1942 (intintobjargproc)immutable_list_ass, /* sq_ass_slice */
1943 (objobjproc)list_contains, /* sq_contains */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001944};
1945
1946static PyTypeObject immutable_list_type = {
1947 PyObject_HEAD_INIT(&PyType_Type)
1948 0,
1949 "list (immutable, during sort)",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001950 sizeof(PyListObject),
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001951 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001952 0, /* Cannot happen */ /* tp_dealloc */
1953 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001954 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001955 0, /* tp_setattr */
1956 0, /* Won't be called */ /* tp_compare */
1957 (reprfunc)list_repr, /* tp_repr */
1958 0, /* tp_as_number */
1959 &immutable_list_as_sequence, /* tp_as_sequence */
1960 0, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001961 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001962 0, /* tp_call */
1963 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001964 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001965 0, /* tp_setattro */
1966 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001967 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001968 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001969 (traverseproc)list_traverse, /* tp_traverse */
1970 0, /* tp_clear */
1971 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001972 0, /* tp_weaklistoffset */
1973 0, /* tp_iter */
1974 0, /* tp_iternext */
1975 immutable_list_methods, /* tp_methods */
1976 0, /* tp_members */
1977 0, /* tp_getset */
1978 0, /* tp_base */
1979 0, /* tp_dict */
1980 0, /* tp_descr_get */
1981 0, /* tp_descr_set */
1982 0, /* tp_init */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001983 /* NOTE: This is *not* the standard list_type struct! */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001984};
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001985
1986
1987/*********************** List Iterator **************************/
1988
1989typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00001990 PyObject_HEAD
1991 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00001992 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001993} listiterobject;
1994
1995PyTypeObject PyListIter_Type;
1996
Guido van Rossum5086e492002-07-16 15:56:52 +00001997static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001998list_iter(PyObject *seq)
1999{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002000 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002001
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002002 if (!PyList_Check(seq)) {
2003 PyErr_BadInternalCall();
2004 return NULL;
2005 }
2006 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2007 if (it == NULL)
2008 return NULL;
2009 it->it_index = 0;
2010 Py_INCREF(seq);
2011 it->it_seq = (PyListObject *)seq;
2012 _PyObject_GC_TRACK(it);
2013 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002014}
2015
2016static void
2017listiter_dealloc(listiterobject *it)
2018{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002019 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002020 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002021 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002022}
2023
2024static int
2025listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2026{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002027 if (it->it_seq == NULL)
2028 return 0;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002029 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002030}
2031
2032
2033static PyObject *
2034listiter_getiter(PyObject *it)
2035{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002036 Py_INCREF(it);
2037 return it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002038}
2039
2040static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002041listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002042{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002043 PyListObject *seq;
2044 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002045
Tim Peters93b2cc42002-06-01 05:22:55 +00002046 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002047 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002048 if (seq == NULL)
2049 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002050 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002051
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002052 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002053 item = PyList_GET_ITEM(seq, it->it_index);
2054 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002055 Py_INCREF(item);
2056 return item;
2057 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002058
2059 Py_DECREF(seq);
2060 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002061 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002062}
2063
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002064PyTypeObject PyListIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002065 PyObject_HEAD_INIT(&PyType_Type)
2066 0, /* ob_size */
2067 "listiterator", /* tp_name */
2068 sizeof(listiterobject), /* tp_basicsize */
2069 0, /* tp_itemsize */
2070 /* methods */
2071 (destructor)listiter_dealloc, /* tp_dealloc */
2072 0, /* tp_print */
2073 0, /* tp_getattr */
2074 0, /* tp_setattr */
2075 0, /* tp_compare */
2076 0, /* tp_repr */
2077 0, /* tp_as_number */
2078 0, /* tp_as_sequence */
2079 0, /* tp_as_mapping */
2080 0, /* tp_hash */
2081 0, /* tp_call */
2082 0, /* tp_str */
2083 PyObject_GenericGetAttr, /* tp_getattro */
2084 0, /* tp_setattro */
2085 0, /* tp_as_buffer */
2086 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2087 0, /* tp_doc */
2088 (traverseproc)listiter_traverse, /* tp_traverse */
2089 0, /* tp_clear */
2090 0, /* tp_richcompare */
2091 0, /* tp_weaklistoffset */
2092 (getiterfunc)listiter_getiter, /* tp_iter */
2093 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002094 0, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002095 0, /* tp_members */
2096 0, /* tp_getset */
2097 0, /* tp_base */
2098 0, /* tp_dict */
2099 0, /* tp_descr_get */
2100 0, /* tp_descr_set */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002101};