blob: b80e395a116ef8d924031c0f38fbb686210d8c77 [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
17 /* Round up:
18 * 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);
304 Py_DECREF(s);
305
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;
Guido van Rossumc0b618a1997-05-02 03:12:38 +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
Guido van Rossum3f236de1996-12-10 23:55:39 +0000742/* New quicksort implementation for arrays of object pointers.
743 Thanks to discussions with Tim Peters. */
744
745/* CMPERROR is returned by our comparison function when an error
746 occurred. This is the largest negative integer (0x80000000 on a
747 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000748#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000749
750/* Comparison function. Takes care of calling a user-supplied
751 comparison function (any callable Python object). Calls the
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000752 standard comparison function, PyObject_Compare(), if the user-
753 supplied function is NULL. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000754
755static int
Fred Drakea2f55112000-07-09 15:16:51 +0000756docompare(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000757{
Tim Petersf2a04732002-07-11 21:46:16 +0000758 PyObject *res;
759 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000760 int i;
761
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000762 if (compare == NULL) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000763 /* NOTE: we rely on the fact here that the sorting algorithm
764 only ever checks whether k<0, i.e., whether x<y. So we
765 invoke the rich comparison function with Py_LT ('<'), and
766 return -1 when it returns true and 0 when it returns
767 false. */
768 i = PyObject_RichCompareBool(x, y, Py_LT);
769 if (i < 0)
770 return CMPERROR;
771 else
772 return -i;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000773 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000774
Tim Petersf2a04732002-07-11 21:46:16 +0000775 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000776 if (args == NULL)
777 return CMPERROR;
Tim Petersf2a04732002-07-11 21:46:16 +0000778 Py_INCREF(x);
779 Py_INCREF(y);
780 PyTuple_SET_ITEM(args, 0, x);
781 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000782 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000784 if (res == NULL)
785 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 if (!PyInt_Check(res)) {
787 Py_DECREF(res);
788 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000789 "comparison function must return int");
Guido van Rossum3f236de1996-12-10 23:55:39 +0000790 return CMPERROR;
791 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 i = PyInt_AsLong(res);
793 Py_DECREF(res);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000794 if (i < 0)
795 return -1;
796 if (i > 0)
797 return 1;
798 return 0;
799}
800
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000801/* MINSIZE is the smallest array that will get a full-blown samplesort
802 treatment; smaller arrays are sorted using binary insertion. It must
803 be at least 7 for the samplesort implementation to work. Binary
804 insertion does fewer compares, but can suffer O(N**2) data movement.
805 The more expensive compares, the larger MINSIZE should be. */
806#define MINSIZE 100
807
808/* MINPARTITIONSIZE is the smallest array slice samplesort will bother to
809 partition; smaller slices are passed to binarysort. It must be at
810 least 2, and no larger than MINSIZE. Setting it higher reduces the #
811 of compares slowly, but increases the amount of data movement quickly.
812 The value here was chosen assuming a compare costs ~25x more than
813 swapping a pair of memory-resident pointers -- but under that assumption,
814 changing the value by a few dozen more or less has aggregate effect
815 under 1%. So the value is crucial, but not touchy <wink>. */
816#define MINPARTITIONSIZE 40
817
818/* MAXMERGE is the largest number of elements we'll always merge into
819 a known-to-be sorted chunk via binary insertion, regardless of the
820 size of that chunk. Given a chunk of N sorted elements, and a group
821 of K unknowns, the largest K for which it's better to do insertion
822 (than a full-blown sort) is a complicated function of N and K mostly
823 involving the expected number of compares and data moves under each
824 approach, and the relative cost of those operations on a specific
825 architecure. The fixed value here is conservative, and should be a
826 clear win regardless of architecture or N. */
827#define MAXMERGE 15
Guido van Rossum3f236de1996-12-10 23:55:39 +0000828
Guido van Rossum3f236de1996-12-10 23:55:39 +0000829/* STACKSIZE is the size of our work stack. A rough estimate is that
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000830 this allows us to sort arrays of size N where
831 N / ln(N) = MINPARTITIONSIZE * 2**STACKSIZE, so 60 is more than enough
832 for arrays of size 2**64. Because we push the biggest partition
833 first, the worst case occurs when all subarrays are always partitioned
834 exactly in two. */
835#define STACKSIZE 60
Guido van Rossum3f236de1996-12-10 23:55:39 +0000836
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000837
838#define SETK(X,Y) if ((k = docompare(X,Y,compare))==CMPERROR) goto fail
839
840/* binarysort is the best method for sorting small arrays: it does
841 few compares, but can do data movement quadratic in the number of
842 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000843 [lo, hi) is a contiguous slice of a list, and is sorted via
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000844 binary insertion.
845 On entry, must have lo <= start <= hi, and that [lo, start) is already
846 sorted (pass start == lo if you don't know!).
847 If docompare complains (returns CMPERROR) return -1, else 0.
848 Even in case of error, the output slice will be some permutation of
849 the input (nothing is lost or duplicated).
850*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000851
852static int
Fred Drakea2f55112000-07-09 15:16:51 +0000853binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
854 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000855{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000856 /* assert lo <= start <= hi
857 assert [lo, start) is sorted */
858 register int k;
859 register PyObject **l, **p, **r;
860 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000861
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000862 if (lo == start)
863 ++start;
864 for (; start < hi; ++start) {
865 /* set l to where *start belongs */
866 l = lo;
867 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000868 pivot = *r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000869 do {
870 p = l + ((r - l) >> 1);
871 SETK(pivot, *p);
872 if (k < 0)
873 r = p;
874 else
875 l = p + 1;
876 } while (l < r);
877 /* Pivot should go at l -- slide over to make room.
878 Caution: using memmove is much slower under MSVC 5;
879 we're not usually moving many slots. */
880 for (p = start; p > l; --p)
881 *p = *(p-1);
882 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000883 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000884 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000885
886 fail:
887 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000888}
889
890/* samplesortslice is the sorting workhorse.
Guido van Rossum42812581998-06-17 14:15:44 +0000891 [lo, hi) is a contiguous slice of a list, to be sorted in place.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000892 On entry, must have lo <= hi,
893 If docompare complains (returns CMPERROR) return -1, else 0.
894 Even in case of error, the output slice will be some permutation of
895 the input (nothing is lost or duplicated).
896
897 samplesort is basically quicksort on steroids: a power of 2 close
898 to n/ln(n) is computed, and that many elements (less 1) are picked at
899 random from the array and sorted. These 2**k - 1 elements are then
900 used as preselected pivots for an equal number of quicksort
901 partitioning steps, partitioning the slice into 2**k chunks each of
902 size about ln(n). These small final chunks are then usually handled
903 by binarysort. Note that when k=1, this is roughly the same as an
904 ordinary quicksort using a random pivot, and when k=2 this is roughly
905 a median-of-3 quicksort. From that view, using k ~= lg(n/ln(n)) makes
906 this a "median of n/ln(n)" quicksort. You can also view it as a kind
907 of bucket sort, where 2**k-1 bucket boundaries are picked dynamically.
908
909 The large number of samples makes a quadratic-time case almost
910 impossible, and asymptotically drives the average-case number of
911 compares from quicksort's 2 N ln N (or 12/7 N ln N for the median-of-
912 3 variant) down to N lg N.
913
914 We also play lots of low-level tricks to cut the number of compares.
915
916 Very obscure: To avoid using extra memory, the PPs are stored in the
917 array and shuffled around as partitioning proceeds. At the start of a
918 partitioning step, we'll have 2**m-1 (for some m) PPs in sorted order,
919 adjacent (either on the left or the right!) to a chunk of X elements
920 that are to be partitioned: P X or X P. In either case we need to
921 shuffle things *in place* so that the 2**(m-1) smaller PPs are on the
922 left, followed by the PP to be used for this step (that's the middle
923 of the PPs), followed by X, followed by the 2**(m-1) larger PPs:
924 P X or X P -> Psmall pivot X Plarge
925 and the order of the PPs must not be altered. It can take a while
926 to realize this isn't trivial! It can take even longer <wink> to
927 understand why the simple code below works, using only 2**(m-1) swaps.
928 The key is that the order of the X elements isn't necessarily
929 preserved: X can end up as some cyclic permutation of its original
930 order. That's OK, because X is unsorted anyway. If the order of X
931 had to be preserved too, the simplest method I know of using O(1)
932 scratch storage requires len(X) + 2**(m-1) swaps, spread over 2 passes.
933 Since len(X) is typically several times larger than 2**(m-1), that
934 would slow things down.
935*/
936
937struct SamplesortStackNode {
938 /* Represents a slice of the array, from (& including) lo up
939 to (but excluding) hi. "extra" additional & adjacent elements
940 are pre-selected pivots (PPs), spanning [lo-extra, lo) if
941 extra > 0, or [hi, hi-extra) if extra < 0. The PPs are
942 already sorted, but nothing is known about the other elements
943 in [lo, hi). |extra| is always one less than a power of 2.
944 When extra is 0, we're out of PPs, and the slice must be
945 sorted by some other means. */
946 PyObject **lo;
947 PyObject **hi;
948 int extra;
949};
950
951/* 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 +0000952 N / ln(N) as possible. So k ~= lg(N / ln(N)). Calling libm routines
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000953 is undesirable, so cutoff values are canned in the "cutoff" table
954 below: cutoff[i] is the smallest N such that k == CUTOFFBASE + i. */
955#define CUTOFFBASE 4
Guido van Rossum3aa23fd1999-01-14 19:01:53 +0000956static long cutoff[] = {
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000957 43, /* smallest N such that k == 4 */
958 106, /* etc */
959 250,
960 576,
961 1298,
962 2885,
963 6339,
964 13805,
965 29843,
966 64116,
967 137030,
968 291554,
969 617916,
970 1305130,
971 2748295,
972 5771662,
973 12091672,
974 25276798,
975 52734615,
976 109820537,
977 228324027,
978 473977813,
979 982548444, /* smallest N such that k == 26 */
980 2034159050 /* largest N that fits in signed 32-bit; k == 27 */
981};
982
983static int
Fred Drakea2f55112000-07-09 15:16:51 +0000984samplesortslice(PyObject **lo, PyObject **hi, PyObject *compare)
985 /* compare -- comparison function object, or NULL for default */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000986{
987 register PyObject **l, **r;
988 register PyObject *tmp, *pivot;
989 register int k;
990 int n, extra, top, extraOnRight;
991 struct SamplesortStackNode stack[STACKSIZE];
992
993 /* assert lo <= hi */
994 n = hi - lo;
995
996 /* ----------------------------------------------------------
997 * Special cases
998 * --------------------------------------------------------*/
999 if (n < 2)
1000 return 0;
1001
1002 /* Set r to the largest value such that [lo,r) is sorted.
1003 This catches the already-sorted case, the all-the-same
1004 case, and the appended-a-few-elements-to-a-sorted-list case.
1005 If the array is unsorted, we're very likely to get out of
1006 the loop fast, so the test is cheap if it doesn't pay off.
1007 */
1008 /* assert lo < hi */
1009 for (r = lo+1; r < hi; ++r) {
1010 SETK(*r, *(r-1));
1011 if (k < 0)
1012 break;
1013 }
1014 /* [lo,r) is sorted, [r,hi) unknown. Get out cheap if there are
1015 few unknowns, or few elements in total. */
1016 if (hi - r <= MAXMERGE || n < MINSIZE)
Guido van Rossum42812581998-06-17 14:15:44 +00001017 return binarysort(lo, hi, r, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001018
1019 /* Check for the array already being reverse-sorted. Typical
1020 benchmark-driven silliness <wink>. */
1021 /* assert lo < hi */
1022 for (r = lo+1; r < hi; ++r) {
1023 SETK(*(r-1), *r);
1024 if (k < 0)
1025 break;
1026 }
1027 if (hi - r <= MAXMERGE) {
1028 /* Reverse the reversed prefix, then insert the tail */
1029 PyObject **originalr = r;
1030 l = lo;
1031 do {
1032 --r;
1033 tmp = *l; *l = *r; *r = tmp;
1034 ++l;
1035 } while (l < r);
Guido van Rossum42812581998-06-17 14:15:44 +00001036 return binarysort(lo, hi, originalr, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001037 }
1038
1039 /* ----------------------------------------------------------
1040 * Normal case setup: a large array without obvious pattern.
1041 * --------------------------------------------------------*/
1042
1043 /* extra := a power of 2 ~= n/ln(n), less 1.
1044 First find the smallest extra s.t. n < cutoff[extra] */
1045 for (extra = 0;
1046 extra < sizeof(cutoff) / sizeof(cutoff[0]);
1047 ++extra) {
1048 if (n < cutoff[extra])
1049 break;
1050 /* note that if we fall out of the loop, the value of
1051 extra still makes *sense*, but may be smaller than
1052 we would like (but the array has more than ~= 2**31
1053 elements in this case!) */
1054 }
1055 /* Now k == extra - 1 + CUTOFFBASE. The smallest value k can
1056 have is CUTOFFBASE-1, so
1057 assert MINSIZE >= 2**(CUTOFFBASE-1) - 1 */
1058 extra = (1 << (extra - 1 + CUTOFFBASE)) - 1;
1059 /* assert extra > 0 and n >= extra */
1060
1061 /* Swap that many values to the start of the array. The
1062 selection of elements is pseudo-random, but the same on
1063 every run (this is intentional! timing algorithm changes is
1064 a pain if timing varies across runs). */
1065 {
1066 unsigned int seed = n / extra; /* arbitrary */
1067 unsigned int i;
1068 for (i = 0; i < (unsigned)extra; ++i) {
1069 /* j := random int in [i, n) */
1070 unsigned int j;
1071 seed = seed * 69069 + 7;
1072 j = i + seed % (n - i);
1073 tmp = lo[i]; lo[i] = lo[j]; lo[j] = tmp;
1074 }
1075 }
1076
1077 /* Recursively sort the preselected pivots. */
Guido van Rossum42812581998-06-17 14:15:44 +00001078 if (samplesortslice(lo, lo + extra, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001079 goto fail;
1080
1081 top = 0; /* index of available stack slot */
1082 lo += extra; /* point to first unknown */
1083 extraOnRight = 0; /* the PPs are at the left end */
1084
1085 /* ----------------------------------------------------------
1086 * Partition [lo, hi), and repeat until out of work.
1087 * --------------------------------------------------------*/
1088 for (;;) {
1089 /* assert lo <= hi, so n >= 0 */
1090 n = hi - lo;
1091
1092 /* We may not want, or may not be able, to partition:
1093 If n is small, it's quicker to insert.
1094 If extra is 0, we're out of pivots, and *must* use
1095 another method.
1096 */
1097 if (n < MINPARTITIONSIZE || extra == 0) {
1098 if (n >= MINSIZE) {
1099 /* assert extra == 0
1100 This is rare, since the average size
1101 of a final block is only about
1102 ln(original n). */
Guido van Rossum42812581998-06-17 14:15:44 +00001103 if (samplesortslice(lo, hi, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001104 goto fail;
1105 }
1106 else {
1107 /* Binary insertion should be quicker,
1108 and we can take advantage of the PPs
1109 already being sorted. */
1110 if (extraOnRight && extra) {
1111 /* swap the PPs to the left end */
1112 k = extra;
1113 do {
1114 tmp = *lo;
1115 *lo = *hi;
1116 *hi = tmp;
1117 ++lo; ++hi;
1118 } while (--k);
1119 }
1120 if (binarysort(lo - extra, hi, lo,
Guido van Rossum42812581998-06-17 14:15:44 +00001121 compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001122 goto fail;
1123 }
1124
1125 /* Find another slice to work on. */
1126 if (--top < 0)
1127 break; /* no more -- done! */
1128 lo = stack[top].lo;
1129 hi = stack[top].hi;
1130 extra = stack[top].extra;
1131 extraOnRight = 0;
1132 if (extra < 0) {
1133 extraOnRight = 1;
1134 extra = -extra;
1135 }
1136 continue;
1137 }
1138
1139 /* Pretend the PPs are indexed 0, 1, ..., extra-1.
1140 Then our preselected pivot is at (extra-1)/2, and we
1141 want to move the PPs before that to the left end of
1142 the slice, and the PPs after that to the right end.
1143 The following section changes extra, lo, hi, and the
1144 slice such that:
1145 [lo-extra, lo) contains the smaller PPs.
1146 *lo == our PP.
1147 (lo, hi) contains the unknown elements.
1148 [hi, hi+extra) contains the larger PPs.
1149 */
1150 k = extra >>= 1; /* num PPs to move */
1151 if (extraOnRight) {
1152 /* Swap the smaller PPs to the left end.
1153 Note that this loop actually moves k+1 items:
1154 the last is our PP */
1155 do {
1156 tmp = *lo; *lo = *hi; *hi = tmp;
1157 ++lo; ++hi;
1158 } while (k--);
1159 }
1160 else {
1161 /* Swap the larger PPs to the right end. */
1162 while (k--) {
1163 --lo; --hi;
1164 tmp = *lo; *lo = *hi; *hi = tmp;
1165 }
1166 }
1167 --lo; /* *lo is now our PP */
1168 pivot = *lo;
1169
1170 /* Now an almost-ordinary quicksort partition step.
1171 Note that most of the time is spent here!
1172 Only odd thing is that we partition into < and >=,
1173 instead of the usual <= and >=. This helps when
1174 there are lots of duplicates of different values,
1175 because it eventually tends to make subfiles
1176 "pure" (all duplicates), and we special-case for
1177 duplicates later. */
1178 l = lo + 1;
1179 r = hi - 1;
1180 /* assert lo < l < r < hi (small n weeded out above) */
1181
1182 do {
1183 /* slide l right, looking for key >= pivot */
1184 do {
1185 SETK(*l, pivot);
1186 if (k < 0)
1187 ++l;
1188 else
1189 break;
1190 } while (l < r);
1191
1192 /* slide r left, looking for key < pivot */
1193 while (l < r) {
Guido van Rossum42812581998-06-17 14:15:44 +00001194 register PyObject *rval = *r--;
1195 SETK(rval, pivot);
1196 if (k < 0) {
1197 /* swap and advance */
1198 r[1] = *l;
1199 *l++ = rval;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001200 break;
Guido van Rossum42812581998-06-17 14:15:44 +00001201 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001202 }
1203
1204 } while (l < r);
1205
1206 /* assert lo < r <= l < hi
1207 assert r == l or r+1 == l
1208 everything to the left of l is < pivot, and
1209 everything to the right of r is >= pivot */
1210
1211 if (l == r) {
1212 SETK(*r, pivot);
1213 if (k < 0)
1214 ++l;
1215 else
1216 --r;
1217 }
1218 /* assert lo <= r and r+1 == l and l <= hi
1219 assert r == lo or a[r] < pivot
1220 assert a[lo] is pivot
1221 assert l == hi or a[l] >= pivot
1222 Swap the pivot into "the middle", so we can henceforth
1223 ignore it.
1224 */
1225 *lo = *r;
1226 *r = pivot;
1227
1228 /* The following is true now, & will be preserved:
1229 All in [lo,r) are < pivot
1230 All in [r,l) == pivot (& so can be ignored)
1231 All in [l,hi) are >= pivot */
1232
1233 /* Check for duplicates of the pivot. One compare is
1234 wasted if there are no duplicates, but can win big
1235 when there are.
1236 Tricky: we're sticking to "<" compares, so deduce
1237 equality indirectly. We know pivot <= *l, so they're
1238 equal iff not pivot < *l.
1239 */
1240 while (l < hi) {
1241 /* pivot <= *l known */
1242 SETK(pivot, *l);
1243 if (k < 0)
1244 break;
1245 else
1246 /* <= and not < implies == */
1247 ++l;
1248 }
1249
1250 /* assert lo <= r < l <= hi
1251 Partitions are [lo, r) and [l, hi) */
1252
1253 /* push fattest first; remember we still have extra PPs
1254 to the left of the left chunk and to the right of
1255 the right chunk! */
1256 /* assert top < STACKSIZE */
1257 if (r - lo <= hi - l) {
1258 /* second is bigger */
1259 stack[top].lo = l;
1260 stack[top].hi = hi;
1261 stack[top].extra = -extra;
1262 hi = r;
1263 extraOnRight = 0;
1264 }
1265 else {
1266 /* first is bigger */
1267 stack[top].lo = lo;
1268 stack[top].hi = r;
1269 stack[top].extra = extra;
1270 lo = l;
1271 extraOnRight = 1;
1272 }
1273 ++top;
1274
1275 } /* end of partitioning loop */
1276
1277 return 0;
1278
1279 fail:
1280 return -1;
1281}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001282
1283#undef SETK
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001284
1285staticforward PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001286
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001288listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001289{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001290 int err;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001291 PyObject *compare = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001292 PyTypeObject *savetype;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001293
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001294 if (args != NULL) {
Guido van Rossumc00a9382000-02-24 21:48:29 +00001295 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001296 return NULL;
1297 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001298 savetype = self->ob_type;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001299 self->ob_type = &immutable_list_type;
1300 err = samplesortslice(self->ob_item,
1301 self->ob_item + self->ob_size,
Guido van Rossum42812581998-06-17 14:15:44 +00001302 compare);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001303 self->ob_type = savetype;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001304 if (err < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001305 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 Py_INCREF(Py_None);
1307 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001308}
1309
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001310int
Fred Drakea2f55112000-07-09 15:16:51 +00001311PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001312{
1313 if (v == NULL || !PyList_Check(v)) {
1314 PyErr_BadInternalCall();
1315 return -1;
1316 }
1317 v = listsort((PyListObject *)v, (PyObject *)NULL);
1318 if (v == NULL)
1319 return -1;
1320 Py_DECREF(v);
1321 return 0;
1322}
1323
Guido van Rossumb86c5492001-02-12 22:06:02 +00001324static void
1325_listreverse(PyListObject *self)
Guido van Rossumed98d481991-03-06 13:07:53 +00001326{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 register PyObject **p, **q;
1328 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +00001329
Guido van Rossumed98d481991-03-06 13:07:53 +00001330 if (self->ob_size > 1) {
1331 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
Guido van Rossumb86c5492001-02-12 22:06:02 +00001332 p < q;
1333 p++, q--)
1334 {
Guido van Rossumed98d481991-03-06 13:07:53 +00001335 tmp = *p;
1336 *p = *q;
1337 *q = tmp;
1338 }
1339 }
Guido van Rossumb86c5492001-02-12 22:06:02 +00001340}
1341
1342static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001343listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00001344{
Guido van Rossumb86c5492001-02-12 22:06:02 +00001345 _listreverse(self);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 Py_INCREF(Py_None);
1347 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001348}
1349
Guido van Rossum84c76f51990-10-30 13:32:20 +00001350int
Fred Drakea2f55112000-07-09 15:16:51 +00001351PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001352{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 if (v == NULL || !PyList_Check(v)) {
1354 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001355 return -1;
1356 }
Guido van Rossumb86c5492001-02-12 22:06:02 +00001357 _listreverse((PyListObject *)v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001358 return 0;
1359}
1360
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001362PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001363{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 PyObject *w;
1365 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001366 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 if (v == NULL || !PyList_Check(v)) {
1368 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001369 return NULL;
1370 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 n = ((PyListObject *)v)->ob_size;
1372 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001373 if (w == NULL)
1374 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001376 memcpy((void *)p,
1377 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001379 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001381 p++;
1382 }
1383 return w;
1384}
1385
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001387listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001388{
1389 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001390
Guido van Rossumed98d481991-03-06 13:07:53 +00001391 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001392 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1393 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001395 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001396 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001397 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001399 return NULL;
1400}
1401
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001403listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001404{
1405 int count = 0;
1406 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001407
Guido van Rossume6f7d181991-10-20 20:20:40 +00001408 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001409 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1410 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001411 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001412 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001413 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001414 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001416}
1417
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001419listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001420{
1421 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001422
Guido van Rossumed98d481991-03-06 13:07:53 +00001423 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001424 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1425 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 if (list_ass_slice(self, i, i+1,
1427 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001428 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001429 Py_INCREF(Py_None);
1430 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001431 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001432 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001433 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001434 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001436 return NULL;
1437}
1438
Jeremy Hylton8caad492000-06-23 14:18:11 +00001439static int
1440list_traverse(PyListObject *o, visitproc visit, void *arg)
1441{
1442 int i, err;
1443 PyObject *x;
1444
1445 for (i = o->ob_size; --i >= 0; ) {
1446 x = o->ob_item[i];
1447 if (x != NULL) {
1448 err = visit(x, arg);
1449 if (err)
1450 return err;
1451 }
1452 }
1453 return 0;
1454}
1455
1456static int
1457list_clear(PyListObject *lp)
1458{
1459 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1460 return 0;
1461}
1462
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001463static PyObject *
1464list_richcompare(PyObject *v, PyObject *w, int op)
1465{
1466 PyListObject *vl, *wl;
1467 int i;
1468
1469 if (!PyList_Check(v) || !PyList_Check(w)) {
1470 Py_INCREF(Py_NotImplemented);
1471 return Py_NotImplemented;
1472 }
1473
1474 vl = (PyListObject *)v;
1475 wl = (PyListObject *)w;
1476
1477 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1478 /* Shortcut: if the lengths differ, the lists differ */
1479 PyObject *res;
1480 if (op == Py_EQ)
1481 res = Py_False;
1482 else
1483 res = Py_True;
1484 Py_INCREF(res);
1485 return res;
1486 }
1487
1488 /* Search for the first index where items are different */
1489 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1490 int k = PyObject_RichCompareBool(vl->ob_item[i],
1491 wl->ob_item[i], Py_EQ);
1492 if (k < 0)
1493 return NULL;
1494 if (!k)
1495 break;
1496 }
1497
1498 if (i >= vl->ob_size || i >= wl->ob_size) {
1499 /* No more items to compare -- compare sizes */
1500 int vs = vl->ob_size;
1501 int ws = wl->ob_size;
1502 int cmp;
1503 PyObject *res;
1504 switch (op) {
1505 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001506 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001507 case Py_EQ: cmp = vs == ws; break;
1508 case Py_NE: cmp = vs != ws; break;
1509 case Py_GT: cmp = vs > ws; break;
1510 case Py_GE: cmp = vs >= ws; break;
1511 default: return NULL; /* cannot happen */
1512 }
1513 if (cmp)
1514 res = Py_True;
1515 else
1516 res = Py_False;
1517 Py_INCREF(res);
1518 return res;
1519 }
1520
1521 /* We have an item that differs -- shortcuts for EQ/NE */
1522 if (op == Py_EQ) {
1523 Py_INCREF(Py_False);
1524 return Py_False;
1525 }
1526 if (op == Py_NE) {
1527 Py_INCREF(Py_True);
1528 return Py_True;
1529 }
1530
1531 /* Compare the final item again using the proper operator */
1532 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1533}
1534
Tim Peters6d6c1a32001-08-02 04:15:00 +00001535/* Adapted from newer code by Tim */
1536static int
1537list_fill(PyListObject *result, PyObject *v)
1538{
1539 PyObject *it; /* iter(v) */
1540 int n; /* guess for result list size */
1541 int i;
1542
1543 n = result->ob_size;
1544
1545 /* Special-case list(a_list), for speed. */
1546 if (PyList_Check(v)) {
1547 if (v == (PyObject *)result)
1548 return 0; /* source is destination, we're done */
1549 return list_ass_slice(result, 0, n, v);
1550 }
1551
1552 /* Empty previous contents */
1553 if (n != 0) {
1554 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1555 return -1;
1556 }
1557
1558 /* Get iterator. There may be some low-level efficiency to be gained
1559 * by caching the tp_iternext slot instead of using PyIter_Next()
1560 * later, but premature optimization is the root etc.
1561 */
1562 it = PyObject_GetIter(v);
1563 if (it == NULL)
1564 return -1;
1565
1566 /* Guess a result list size. */
1567 n = -1; /* unknown */
1568 if (PySequence_Check(v) &&
1569 v->ob_type->tp_as_sequence->sq_length) {
1570 n = PySequence_Size(v);
1571 if (n < 0)
1572 PyErr_Clear();
1573 }
1574 if (n < 0)
1575 n = 8; /* arbitrary */
1576 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001577 if (result->ob_item == NULL) {
1578 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001579 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00001580 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00001581 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001582 result->ob_size = n;
1583
1584 /* Run iterator to exhaustion. */
1585 for (i = 0; ; i++) {
1586 PyObject *item = PyIter_Next(it);
1587 if (item == NULL) {
1588 if (PyErr_Occurred())
1589 goto error;
1590 break;
1591 }
1592 if (i < n)
1593 PyList_SET_ITEM(result, i, item); /* steals ref */
1594 else {
1595 int status = ins1(result, result->ob_size, item);
1596 Py_DECREF(item); /* append creates a new ref */
1597 if (status < 0)
1598 goto error;
1599 }
1600 }
1601
1602 /* Cut back result list if initial guess was too large. */
1603 if (i < n && result != NULL) {
1604 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
1605 goto error;
1606 }
1607 Py_DECREF(it);
1608 return 0;
1609
1610 error:
1611 Py_DECREF(it);
1612 return -1;
1613}
1614
1615static int
1616list_init(PyListObject *self, PyObject *args, PyObject *kw)
1617{
1618 PyObject *arg = NULL;
1619 static char *kwlist[] = {"sequence", 0};
1620
1621 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
1622 return -1;
1623 if (arg != NULL)
1624 return list_fill(self, arg);
1625 if (self->ob_size > 0)
1626 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
1627 return 0;
1628}
1629
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001630static long
1631list_nohash(PyObject *self)
1632{
1633 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
1634 return -1;
1635}
1636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001637PyDoc_STRVAR(append_doc,
1638"L.append(object) -- append object to end");
1639PyDoc_STRVAR(extend_doc,
1640"L.extend(list) -- extend list by appending list elements");
1641PyDoc_STRVAR(insert_doc,
1642"L.insert(index, object) -- insert object before index");
1643PyDoc_STRVAR(pop_doc,
1644"L.pop([index]) -> item -- remove and return item at index (default last)");
1645PyDoc_STRVAR(remove_doc,
1646"L.remove(value) -- remove first occurrence of value");
1647PyDoc_STRVAR(index_doc,
1648"L.index(value) -> integer -- return index of first occurrence of value");
1649PyDoc_STRVAR(count_doc,
1650"L.count(value) -> integer -- return number of occurrences of value");
1651PyDoc_STRVAR(reverse_doc,
1652"L.reverse() -- reverse *IN PLACE*");
1653PyDoc_STRVAR(sort_doc,
1654"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001655
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001657 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001658 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001659 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001660 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001661 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
1662 {"index", (PyCFunction)listindex, METH_O, index_doc},
1663 {"count", (PyCFunction)listcount, METH_O, count_doc},
1664 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001665 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001666 {NULL, NULL} /* sentinel */
1667};
1668
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001670 (inquiry)list_length, /* sq_length */
1671 (binaryfunc)list_concat, /* sq_concat */
1672 (intargfunc)list_repeat, /* sq_repeat */
1673 (intargfunc)list_item, /* sq_item */
1674 (intintargfunc)list_slice, /* sq_slice */
1675 (intobjargproc)list_ass_item, /* sq_ass_item */
1676 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
1677 (objobjproc)list_contains, /* sq_contains */
1678 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
1679 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001680};
1681
Neal Norwitz2c2e8272002-06-14 02:04:18 +00001682PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001683"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00001684"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001685
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00001686static PyObject *list_iter(PyObject *seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001687
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00001688static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001689list_subscript(PyListObject* self, PyObject* item)
1690{
1691 if (PyInt_Check(item)) {
1692 long i = PyInt_AS_LONG(item);
1693 if (i < 0)
1694 i += PyList_GET_SIZE(self);
1695 return list_item(self, i);
1696 }
1697 else if (PyLong_Check(item)) {
1698 long i = PyLong_AsLong(item);
1699 if (i == -1 && PyErr_Occurred())
1700 return NULL;
1701 if (i < 0)
1702 i += PyList_GET_SIZE(self);
1703 return list_item(self, i);
1704 }
1705 else if (PySlice_Check(item)) {
1706 int start, stop, step, slicelength, cur, i;
1707 PyObject* result;
1708 PyObject* it;
1709
1710 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1711 &start, &stop, &step, &slicelength) < 0) {
1712 return NULL;
1713 }
1714
1715 if (slicelength <= 0) {
1716 return PyList_New(0);
1717 }
1718 else {
1719 result = PyList_New(slicelength);
1720 if (!result) return NULL;
1721
1722 for (cur = start, i = 0; i < slicelength;
1723 cur += step, i++) {
1724 it = PyList_GET_ITEM(self, cur);
1725 Py_INCREF(it);
1726 PyList_SET_ITEM(result, i, it);
1727 }
1728
1729 return result;
1730 }
1731 }
1732 else {
1733 PyErr_SetString(PyExc_TypeError,
1734 "list indices must be integers");
1735 return NULL;
1736 }
1737}
1738
1739static int
1740list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
1741{
1742 if (PyInt_Check(item)) {
1743 long i = PyInt_AS_LONG(item);
1744 if (i < 0)
1745 i += PyList_GET_SIZE(self);
1746 return list_ass_item(self, i, value);
1747 }
1748 else if (PyLong_Check(item)) {
1749 long i = PyLong_AsLong(item);
1750 if (i == -1 && PyErr_Occurred())
1751 return -1;
1752 if (i < 0)
1753 i += PyList_GET_SIZE(self);
1754 return list_ass_item(self, i, value);
1755 }
1756 else if (PySlice_Check(item)) {
1757 int start, stop, step, slicelength;
1758
1759 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1760 &start, &stop, &step, &slicelength) < 0) {
1761 return -1;
1762 }
1763
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001764 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
1765 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1766 return list_ass_slice(self, start, stop, value);
1767
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001768 if (value == NULL) {
1769 /* delete slice */
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001770 PyObject **garbage, **it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001771 int cur, i, j;
1772
1773 if (slicelength <= 0)
1774 return 0;
1775
1776 if (step < 0) {
1777 stop = start + 1;
1778 start = stop + step*(slicelength - 1) - 1;
1779 step = -step;
1780 }
1781
1782 garbage = (PyObject**)
1783 PyMem_MALLOC(slicelength*sizeof(PyObject*));
1784
1785 /* drawing pictures might help
1786 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00001787 for (cur = start, i = 0;
1788 cur < stop;
1789 cur += step, i++)
1790 {
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001791 garbage[i] = PyList_GET_ITEM(self, cur);
1792
1793 for (j = 0; j < step; j++) {
1794 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00001795 PyList_GET_ITEM(self,
1796 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001797 }
1798 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001799 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001800 cur < self->ob_size; cur++) {
1801 PyList_SET_ITEM(self, cur - slicelength,
1802 PyList_GET_ITEM(self, cur));
1803 }
1804 self->ob_size -= slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001805 it = self->ob_item;
1806 NRESIZE(it, PyObject*, self->ob_size);
1807 self->ob_item = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001808
1809 for (i = 0; i < slicelength; i++) {
1810 Py_DECREF(garbage[i]);
1811 }
1812 PyMem_FREE(garbage);
1813
1814 return 0;
1815 }
1816 else {
1817 /* assign slice */
1818 PyObject **garbage, *ins;
1819 int cur, i;
1820
1821 if (!PyList_Check(value)) {
1822 PyErr_Format(PyExc_TypeError,
1823 "must assign list (not \"%.200s\") to slice",
1824 value->ob_type->tp_name);
1825 return -1;
1826 }
1827
1828 if (PyList_GET_SIZE(value) != slicelength) {
1829 PyErr_Format(PyExc_ValueError,
1830 "attempt to assign list of size %d to extended slice of size %d",
1831 PyList_Size(value), slicelength);
1832 return -1;
1833 }
1834
1835 if (!slicelength)
1836 return 0;
1837
1838 /* protect against a[::-1] = a */
1839 if (self == (PyListObject*)value) {
1840 value = list_slice((PyListObject*)value, 0,
1841 PyList_GET_SIZE(value));
1842 }
1843 else {
1844 Py_INCREF(value);
1845 }
1846
1847 garbage = (PyObject**)
1848 PyMem_MALLOC(slicelength*sizeof(PyObject*));
1849
1850 for (cur = start, i = 0; i < slicelength;
1851 cur += step, i++) {
1852 garbage[i] = PyList_GET_ITEM(self, cur);
1853
1854 ins = PyList_GET_ITEM(value, i);
1855 Py_INCREF(ins);
1856 PyList_SET_ITEM(self, cur, ins);
1857 }
1858
1859 for (i = 0; i < slicelength; i++) {
1860 Py_DECREF(garbage[i]);
1861 }
1862
1863 PyMem_FREE(garbage);
1864 Py_DECREF(value);
1865
1866 return 0;
1867 }
1868 }
1869 else {
1870 PyErr_SetString(PyExc_TypeError,
1871 "list indices must be integers");
1872 return -1;
1873 }
1874}
1875
1876static PyMappingMethods list_as_mapping = {
1877 (inquiry)list_length,
1878 (binaryfunc)list_subscript,
1879 (objobjargproc)list_ass_subscript
1880};
1881
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001882PyTypeObject PyList_Type = {
1883 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001884 0,
1885 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001886 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001887 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001888 (destructor)list_dealloc, /* tp_dealloc */
1889 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001890 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001891 0, /* tp_setattr */
1892 0, /* tp_compare */
1893 (reprfunc)list_repr, /* tp_repr */
1894 0, /* tp_as_number */
1895 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00001896 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001897 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001898 0, /* tp_call */
1899 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001900 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001901 0, /* tp_setattro */
1902 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001903 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001904 Py_TPFLAGS_BASETYPE, /* tp_flags */
1905 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001906 (traverseproc)list_traverse, /* tp_traverse */
1907 (inquiry)list_clear, /* tp_clear */
1908 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001909 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00001910 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001911 0, /* tp_iternext */
1912 list_methods, /* tp_methods */
1913 0, /* tp_members */
1914 0, /* tp_getset */
1915 0, /* tp_base */
1916 0, /* tp_dict */
1917 0, /* tp_descr_get */
1918 0, /* tp_descr_set */
1919 0, /* tp_dictoffset */
1920 (initproc)list_init, /* tp_init */
1921 PyType_GenericAlloc, /* tp_alloc */
1922 PyType_GenericNew, /* tp_new */
Neil Schemenauer99b5d282002-04-12 02:44:22 +00001923 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001924};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001925
1926
1927/* During a sort, we really can't have anyone modifying the list; it could
1928 cause core dumps. Thus, we substitute a dummy type that raises an
1929 explanatory exception when a modifying operation is used. Caveat:
1930 comparisons may behave differently; but I guess it's a bad idea anyway to
1931 compare a list that's being sorted... */
1932
1933static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001934immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001935{
1936 PyErr_SetString(PyExc_TypeError,
1937 "a list cannot be modified while it is being sorted");
1938 return NULL;
1939}
1940
1941static PyMethodDef immutable_list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001942 {"append", (PyCFunction)immutable_list_op, METH_VARARGS},
1943 {"insert", (PyCFunction)immutable_list_op, METH_VARARGS},
Tim Peters52e07172001-08-30 06:15:32 +00001944 {"extend", (PyCFunction)immutable_list_op, METH_O},
1945 {"pop", (PyCFunction)immutable_list_op, METH_VARARGS},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001946 {"remove", (PyCFunction)immutable_list_op, METH_VARARGS},
1947 {"index", (PyCFunction)listindex, METH_O},
1948 {"count", (PyCFunction)listcount, METH_O},
1949 {"reverse", (PyCFunction)immutable_list_op, METH_VARARGS},
1950 {"sort", (PyCFunction)immutable_list_op, METH_VARARGS},
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001951 {NULL, NULL} /* sentinel */
1952};
1953
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001954static int
Fred Drakea2f55112000-07-09 15:16:51 +00001955immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001956{
1957 immutable_list_op();
1958 return -1;
1959}
1960
1961static PySequenceMethods immutable_list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001962 (inquiry)list_length, /* sq_length */
1963 (binaryfunc)list_concat, /* sq_concat */
1964 (intargfunc)list_repeat, /* sq_repeat */
1965 (intargfunc)list_item, /* sq_item */
1966 (intintargfunc)list_slice, /* sq_slice */
1967 (intobjargproc)immutable_list_ass, /* sq_ass_item */
1968 (intintobjargproc)immutable_list_ass, /* sq_ass_slice */
1969 (objobjproc)list_contains, /* sq_contains */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001970};
1971
1972static PyTypeObject immutable_list_type = {
1973 PyObject_HEAD_INIT(&PyType_Type)
1974 0,
1975 "list (immutable, during sort)",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001976 sizeof(PyListObject),
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001977 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001978 0, /* Cannot happen */ /* tp_dealloc */
1979 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001980 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001981 0, /* tp_setattr */
1982 0, /* Won't be called */ /* tp_compare */
1983 (reprfunc)list_repr, /* tp_repr */
1984 0, /* tp_as_number */
1985 &immutable_list_as_sequence, /* tp_as_sequence */
1986 0, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001987 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001988 0, /* tp_call */
1989 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001990 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001991 0, /* tp_setattro */
1992 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001993 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001994 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001995 (traverseproc)list_traverse, /* tp_traverse */
1996 0, /* tp_clear */
1997 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001998 0, /* tp_weaklistoffset */
1999 0, /* tp_iter */
2000 0, /* tp_iternext */
2001 immutable_list_methods, /* tp_methods */
2002 0, /* tp_members */
2003 0, /* tp_getset */
2004 0, /* tp_base */
2005 0, /* tp_dict */
2006 0, /* tp_descr_get */
2007 0, /* tp_descr_set */
2008 0, /* tp_init */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002009 /* NOTE: This is *not* the standard list_type struct! */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002010};
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002011
2012
2013/*********************** List Iterator **************************/
2014
2015typedef struct {
2016 PyObject_HEAD
Tim Peters93b2cc42002-06-01 05:22:55 +00002017 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002018 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002019} listiterobject;
2020
2021PyTypeObject PyListIter_Type;
2022
Guido van Rossum5086e492002-07-16 15:56:52 +00002023static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002024list_iter(PyObject *seq)
2025{
2026 listiterobject *it;
2027
2028 if (!PyList_Check(seq)) {
2029 PyErr_BadInternalCall();
2030 return NULL;
2031 }
2032 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2033 if (it == NULL)
2034 return NULL;
2035 it->it_index = 0;
2036 Py_INCREF(seq);
Tim Peters93b2cc42002-06-01 05:22:55 +00002037 it->it_seq = (PyListObject *)seq;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002038 _PyObject_GC_TRACK(it);
2039 return (PyObject *)it;
2040}
2041
2042static void
2043listiter_dealloc(listiterobject *it)
2044{
2045 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002046 Py_XDECREF(it->it_seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002047 PyObject_GC_Del(it);
2048}
2049
2050static int
2051listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2052{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002053 if (it->it_seq == NULL)
2054 return 0;
Tim Peters93b2cc42002-06-01 05:22:55 +00002055 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002056}
2057
2058
2059static PyObject *
2060listiter_getiter(PyObject *it)
2061{
2062 Py_INCREF(it);
2063 return it;
2064}
2065
2066static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002067listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002068{
Tim Peters93b2cc42002-06-01 05:22:55 +00002069 PyListObject *seq;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002070 PyObject *item;
2071
Tim Peters93b2cc42002-06-01 05:22:55 +00002072 assert(it != NULL);
2073 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002074 if (seq == NULL)
2075 return NULL;
Tim Peters93b2cc42002-06-01 05:22:55 +00002076 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002077
Tim Peters93b2cc42002-06-01 05:22:55 +00002078 if (it->it_index < PyList_GET_SIZE(seq)) {
2079 item = PyList_GET_ITEM(seq, it->it_index);
2080 ++it->it_index;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002081 Py_INCREF(item);
2082 return item;
2083 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002084
2085 Py_DECREF(seq);
2086 it->it_seq = NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002087 return NULL;
2088}
2089
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002090PyTypeObject PyListIter_Type = {
2091 PyObject_HEAD_INIT(&PyType_Type)
2092 0, /* ob_size */
2093 "listiterator", /* tp_name */
2094 sizeof(listiterobject), /* tp_basicsize */
2095 0, /* tp_itemsize */
2096 /* methods */
2097 (destructor)listiter_dealloc, /* tp_dealloc */
2098 0, /* tp_print */
2099 0, /* tp_getattr */
2100 0, /* tp_setattr */
2101 0, /* tp_compare */
2102 0, /* tp_repr */
2103 0, /* tp_as_number */
2104 0, /* tp_as_sequence */
2105 0, /* tp_as_mapping */
2106 0, /* tp_hash */
2107 0, /* tp_call */
2108 0, /* tp_str */
2109 PyObject_GenericGetAttr, /* tp_getattro */
2110 0, /* tp_setattro */
2111 0, /* tp_as_buffer */
2112 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2113 0, /* tp_doc */
2114 (traverseproc)listiter_traverse, /* tp_traverse */
2115 0, /* tp_clear */
2116 0, /* tp_richcompare */
2117 0, /* tp_weaklistoffset */
2118 (getiterfunc)listiter_getiter, /* tp_iter */
2119 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002120 0, /* tp_methods */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002121 0, /* tp_members */
2122 0, /* tp_getset */
2123 0, /* tp_base */
2124 0, /* tp_dict */
2125 0, /* tp_descr_get */
2126 0, /* tp_descr_set */
2127};