blob: 7166ced8cb4fa074463910a7927a7a240ae2d435 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* List object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
5
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00006#ifdef STDC_HEADERS
7#include <stddef.h>
8#else
9#include <sys/types.h> /* For size_t */
10#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Guido van Rossuma46d51d1995-01-26 22:59:43 +000012static int
Fred Drakea2f55112000-07-09 15:16:51 +000013roundupsize(int n)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000014{
Tim Peters65b8b842001-05-26 05:28:40 +000015 unsigned int nbits = 0;
16 unsigned int n2 = (unsigned int)n >> 5;
17
18 /* Round up:
19 * If n < 256, to a multiple of 8.
20 * If n < 2048, to a multiple of 64.
21 * If n < 16384, to a multiple of 512.
22 * If n < 131072, to a multiple of 4096.
23 * If n < 1048576, to a multiple of 32768.
24 * If n < 8388608, to a multiple of 262144.
25 * If n < 67108864, to a multiple of 2097152.
26 * If n < 536870912, to a multiple of 16777216.
27 * ...
28 * If n < 2**(5+3*i), to a multiple of 2**(3*i).
29 *
30 * This over-allocates proportional to the list size, making room
31 * for additional growth. The over-allocation is mild, but is
32 * enough to give linear-time amortized behavior over a long
33 * sequence of appends() in the presence of a poorly-performing
34 * system realloc() (which is a reality, e.g., across all flavors
35 * of Windows, with Win9x behavior being particularly bad -- and
36 * we've still got address space fragmentation problems on Win9x
37 * even with this scheme, although it requires much longer lists to
38 * provoke them than it used to).
39 */
40 do {
41 n2 >>= 3;
42 nbits += 3;
43 } while (n2);
44 return ((n >> nbits) + 1) << nbits;
45 }
Guido van Rossuma46d51d1995-01-26 22:59:43 +000046
Guido van Rossuma27d1121997-08-25 18:36:23 +000047#define NRESIZE(var, type, nitems) PyMem_RESIZE(var, type, roundupsize(nitems))
Guido van Rossuma46d51d1995-01-26 22:59:43 +000048
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000050PyList_New(int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051{
52 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000053 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000054 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 return NULL;
58 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000060 /* Check for overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 if (nbytes / sizeof(PyObject *) != (size_t)size) {
62 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000063 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000064 /* PyObject_NewVar is inlined */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +000065 op = (PyListObject *) PyObject_MALLOC(sizeof(PyListObject)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000066 + PyGC_HEAD_SIZE);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000070 op = (PyListObject *) PyObject_FROM_GC(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071 if (size <= 0) {
72 op->ob_item = NULL;
73 }
74 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +000075 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 if (op->ob_item == NULL) {
Vladimir Marangozov467a67e2000-07-15 03:31:31 +000077 PyObject_FREE(PyObject_AS_GC(op));
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079 }
80 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000081 PyObject_INIT_VAR(op, &PyList_Type, size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 for (i = 0; i < size; i++)
83 op->ob_item[i] = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000084 PyObject_GC_Init(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 Rossumd724b232000-03-13 16:01:29 +0000202 Py_TRASHCAN_SAFE_BEGIN(op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000203 PyObject_GC_Fini(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 Rossum4cc6ac72000-07-01 01:00:38 +0000215 op = (PyListObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000216 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000217 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218}
219
Guido van Rossum90933611991-06-07 16:10:43 +0000220static int
Fred Drakea2f55112000-07-09 15:16:51 +0000221list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222{
223 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000224
225 i = Py_ReprEnter((PyObject*)op);
226 if (i != 0) {
227 if (i < 0)
228 return i;
229 fprintf(fp, "[...]");
230 return 0;
231 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000233 for (i = 0; i < op->ob_size; i++) {
234 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000236 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
237 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000238 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000239 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 }
241 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000242 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000243 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244}
245
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000247list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000250 PyObject *s, *temp;
251 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000252
253 i = Py_ReprEnter((PyObject*)v);
254 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000255 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000256 }
Tim Petersa7259592001-06-16 05:11:17 +0000257
258 if (v->ob_size == 0) {
259 result = PyString_FromString("[]");
260 goto Done;
261 }
262
263 pieces = PyList_New(0);
264 if (pieces == NULL)
265 goto Done;
266
267 /* Do repr() on each element. Note that this may mutate the list,
268 so must refetch the list size on each iteration. */
269 for (i = 0; i < v->ob_size; ++i) {
270 int status;
271 s = PyObject_Repr(v->ob_item[i]);
272 if (s == NULL)
273 goto Done;
274 status = PyList_Append(pieces, s);
275 Py_DECREF(s); /* append created a new ref */
276 if (status < 0)
277 goto Done;
278 }
279
280 /* Add "[]" decorations to the first and last items. */
281 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000283 if (s == NULL)
284 goto Done;
285 temp = PyList_GET_ITEM(pieces, 0);
286 PyString_ConcatAndDel(&s, temp);
287 PyList_SET_ITEM(pieces, 0, s);
288 if (s == NULL)
289 goto Done;
290
291 s = PyString_FromString("]");
292 if (s == NULL)
293 goto Done;
294 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
295 PyString_ConcatAndDel(&temp, s);
296 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
297 if (temp == NULL)
298 goto Done;
299
300 /* Paste them all together with ", " between. */
301 s = PyString_FromString(", ");
302 if (s == NULL)
303 goto Done;
304 result = _PyString_Join(s, pieces);
305 Py_DECREF(s);
306
307Done:
308 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000309 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000310 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311}
312
313static int
Fred Drakea2f55112000-07-09 15:16:51 +0000314list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315{
316 return a->ob_size;
317}
318
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000319
320
321static int
Fred Drakea2f55112000-07-09 15:16:51 +0000322list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000323{
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000324 int i;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000325
326 for (i = 0; i < a->ob_size; ++i) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000327 int cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
328 Py_EQ);
329 if (cmp > 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000330 return 1;
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000331 else if (cmp < 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000332 return -1;
333 }
334 return 0;
335}
336
337
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000339list_item(PyListObject *a, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340{
341 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000342 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 indexerr = PyString_FromString(
344 "list index out of range");
345 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346 return NULL;
347 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349 return a->ob_item[i];
350}
351
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000353list_slice(PyListObject *a, int ilow, int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356 int i;
357 if (ilow < 0)
358 ilow = 0;
359 else if (ilow > a->ob_size)
360 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361 if (ihigh < ilow)
362 ihigh = ilow;
363 else if (ihigh > a->ob_size)
364 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 if (np == NULL)
367 return NULL;
368 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 PyObject *v = a->ob_item[i];
370 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 np->ob_item[i - ilow] = v;
372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374}
375
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000377PyList_GetSlice(PyObject *a, int ilow, int ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000378{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 if (!PyList_Check(a)) {
380 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000381 return NULL;
382 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000384}
385
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000387list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388{
389 int size;
390 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 PyListObject *np;
392 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000393 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000394 "can only concatenate list (not \"%.200s\") to list",
395 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 return NULL;
397 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000402 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403 }
404 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 PyObject *v = a->ob_item[i];
406 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 np->ob_item[i] = v;
408 }
409 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 PyObject *v = b->ob_item[i];
411 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412 np->ob_item[i + a->ob_size] = v;
413 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415#undef b
416}
417
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000419list_repeat(PyListObject *a, int n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000420{
421 int i, j;
422 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 PyListObject *np;
424 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000425 if (n < 0)
426 n = 0;
427 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000429 if (np == NULL)
430 return NULL;
431 p = np->ob_item;
432 for (i = 0; i < n; i++) {
433 for (j = 0; j < a->ob_size; j++) {
434 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000436 p++;
437 }
438 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000440}
441
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442static int
Fred Drakea2f55112000-07-09 15:16:51 +0000443list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000445 /* Because [X]DECREF can recursively invoke list operations on
446 this list, we must postpone all [X]DECREF activity until
447 after the list is back in its canonical shape. Therefore
448 we must allocate an additional array, 'recycle', into which
449 we temporarily copy the items that are deleted from the
450 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 PyObject **recycle, **p;
452 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 int n; /* Size of replacement list */
454 int d; /* Change in size */
455 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 if (v == NULL)
458 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000461 if (a == b) {
462 /* Special case "a[i:j] = a" -- copy b first */
463 int ret;
464 v = list_slice(b, 0, n);
465 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000467 return ret;
468 }
469 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000470 else {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000471 PyErr_Format(PyExc_TypeError,
472 "must assign list (not \"%.200s\") to slice",
473 v->ob_type->tp_name);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000474 return -1;
475 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476 if (ilow < 0)
477 ilow = 0;
478 else if (ilow > a->ob_size)
479 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480 if (ihigh < ilow)
481 ihigh = ilow;
482 else if (ihigh > a->ob_size)
483 ihigh = a->ob_size;
484 item = a->ob_item;
485 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000486 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000488 else
489 p = recycle = NULL;
490 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000492 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493 if (d < 0) {
494 for (/*k = ihigh*/; k < a->ob_size; k++)
495 item[k+d] = item[k];
496 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 a->ob_item = item;
499 }
500 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000501 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000503 if (item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000504 if (recycle != NULL)
505 PyMem_DEL(recycle);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000507 return -1;
508 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509 for (k = a->ob_size; --k >= ihigh; )
510 item[k+d] = item[k];
511 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000512 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513 a->ob_item = item;
514 a->ob_size += d;
515 }
516 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyObject *w = b->ob_item[k];
518 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519 item[ilow] = w;
520 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000521 if (recycle) {
522 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 Py_XDECREF(*p);
524 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000525 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526 return 0;
527#undef b
528}
529
Guido van Rossum234f9421993-06-17 12:35:49 +0000530int
Fred Drakea2f55112000-07-09 15:16:51 +0000531PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000532{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 if (!PyList_Check(a)) {
534 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000535 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000536 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000538}
539
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000540static PyObject *
541list_inplace_repeat(PyListObject *self, int n)
542{
543 PyObject **items;
544 int size, i, j;
545
546
547 size = PyList_GET_SIZE(self);
548 if (size == 0) {
549 Py_INCREF(self);
550 return (PyObject *)self;
551 }
552
553 items = self->ob_item;
554
555 if (n < 1) {
556 self->ob_item = NULL;
557 self->ob_size = 0;
558 for (i = 0; i < size; i++)
559 Py_XDECREF(items[i]);
560 PyMem_DEL(items);
561 Py_INCREF(self);
562 return (PyObject *)self;
563 }
564
565 NRESIZE(items, PyObject*, size*n);
566 if (items == NULL) {
567 PyErr_NoMemory();
568 goto finally;
569 }
570 self->ob_item = items;
571 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
572 for (j = 0; j < size; j++) {
573 PyObject *o = PyList_GET_ITEM(self, j);
574 Py_INCREF(o);
575 PyList_SET_ITEM(self, self->ob_size++, o);
576 }
577 }
578 Py_INCREF(self);
579 return (PyObject *)self;
580 finally:
581 return NULL;
582}
583
Guido van Rossum4a450d01991-04-03 19:05:18 +0000584static int
Fred Drakea2f55112000-07-09 15:16:51 +0000585list_ass_item(PyListObject *a, int i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000586{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000588 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 PyErr_SetString(PyExc_IndexError,
590 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000591 return -1;
592 }
593 if (v == NULL)
594 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000596 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000597 a->ob_item[i] = v;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000599 return 0;
600}
601
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000603ins(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604{
605 if (ins1(self, where, v) != 0)
606 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 Py_INCREF(Py_None);
608 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609}
610
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000612listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613{
614 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000616 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000617 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000618 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619}
620
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000622listappend(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 PyObject *v;
Tim Peters442914d2001-05-26 05:50:03 +0000625 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossumbf80e541993-02-08 15:49:17 +0000626 return NULL;
627 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 *
701listextend(PyListObject *self, PyObject *args)
702{
703
704 PyObject *b;
705
706 if (!PyArg_ParseTuple(args, "O:extend", &b))
707 return NULL;
708
Tim Peters1af03e92001-05-26 19:37:54 +0000709 b = PySequence_Fast(b, "list.extend() argument must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710 if (!b)
711 return NULL;
712
713 if (listextend_internal(self, b) < 0)
714 return NULL;
715
716 Py_INCREF(Py_None);
717 return Py_None;
718}
719
720static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000721listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000722{
723 int i = -1;
724 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000725 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000726 return NULL;
727 if (self->ob_size == 0) {
728 /* Special-case most common failure cause */
729 PyErr_SetString(PyExc_IndexError, "pop from empty list");
730 return NULL;
731 }
732 if (i < 0)
733 i += self->ob_size;
734 if (i < 0 || i >= self->ob_size) {
735 PyErr_SetString(PyExc_IndexError, "pop index out of range");
736 return NULL;
737 }
738 v = self->ob_item[i];
739 Py_INCREF(v);
740 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
741 Py_DECREF(v);
742 return NULL;
743 }
744 return v;
745}
746
Guido van Rossum3f236de1996-12-10 23:55:39 +0000747/* New quicksort implementation for arrays of object pointers.
748 Thanks to discussions with Tim Peters. */
749
750/* CMPERROR is returned by our comparison function when an error
751 occurred. This is the largest negative integer (0x80000000 on a
752 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000753#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000754
755/* Comparison function. Takes care of calling a user-supplied
756 comparison function (any callable Python object). Calls the
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000757 standard comparison function, PyObject_Compare(), if the user-
758 supplied function is NULL. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000759
760static int
Fred Drakea2f55112000-07-09 15:16:51 +0000761docompare(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000762{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 PyObject *args, *res;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000764 int i;
765
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000766 if (compare == NULL) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000767 /* NOTE: we rely on the fact here that the sorting algorithm
768 only ever checks whether k<0, i.e., whether x<y. So we
769 invoke the rich comparison function with Py_LT ('<'), and
770 return -1 when it returns true and 0 when it returns
771 false. */
772 i = PyObject_RichCompareBool(x, y, Py_LT);
773 if (i < 0)
774 return CMPERROR;
775 else
776 return -i;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000777 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000778
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 args = Py_BuildValue("(OO)", x, y);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000780 if (args == NULL)
781 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 res = PyEval_CallObject(compare, args);
783 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;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001292
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001293 if (args != NULL) {
Guido van Rossumc00a9382000-02-24 21:48:29 +00001294 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001295 return NULL;
1296 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001297 self->ob_type = &immutable_list_type;
1298 err = samplesortslice(self->ob_item,
1299 self->ob_item + self->ob_size,
Guido van Rossum42812581998-06-17 14:15:44 +00001300 compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001301 self->ob_type = &PyList_Type;
1302 if (err < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001303 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 Py_INCREF(Py_None);
1305 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001306}
1307
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001308int
Fred Drakea2f55112000-07-09 15:16:51 +00001309PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001310{
1311 if (v == NULL || !PyList_Check(v)) {
1312 PyErr_BadInternalCall();
1313 return -1;
1314 }
1315 v = listsort((PyListObject *)v, (PyObject *)NULL);
1316 if (v == NULL)
1317 return -1;
1318 Py_DECREF(v);
1319 return 0;
1320}
1321
Guido van Rossumb86c5492001-02-12 22:06:02 +00001322static void
1323_listreverse(PyListObject *self)
Guido van Rossumed98d481991-03-06 13:07:53 +00001324{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 register PyObject **p, **q;
1326 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +00001327
Guido van Rossumed98d481991-03-06 13:07:53 +00001328 if (self->ob_size > 1) {
1329 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
Guido van Rossumb86c5492001-02-12 22:06:02 +00001330 p < q;
1331 p++, q--)
1332 {
Guido van Rossumed98d481991-03-06 13:07:53 +00001333 tmp = *p;
1334 *p = *q;
1335 *q = tmp;
1336 }
1337 }
Guido van Rossumb86c5492001-02-12 22:06:02 +00001338}
1339
1340static PyObject *
1341listreverse(PyListObject *self, PyObject *args)
1342{
1343 if (!PyArg_ParseTuple(args, ":reverse"))
1344 return NULL;
1345 _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 *
Fred Drakea2f55112000-07-09 15:16:51 +00001387listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00001388{
1389 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001390 PyObject *v;
1391
Tim Peters442914d2001-05-26 05:50:03 +00001392 if (!PyArg_ParseTuple(args, "O:index", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001393 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001394 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001395 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1396 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001398 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001399 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001400 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001402 return NULL;
1403}
1404
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001406listcount(PyListObject *self, PyObject *args)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001407{
1408 int count = 0;
1409 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001410 PyObject *v;
1411
Tim Peters442914d2001-05-26 05:50:03 +00001412 if (!PyArg_ParseTuple(args, "O:count", &v))
Guido van Rossume6f7d181991-10-20 20:20:40 +00001413 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001414 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001415 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1416 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001417 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001418 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001419 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001420 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001422}
1423
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001425listremove(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00001426{
1427 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001428 PyObject *v;
1429
Tim Peters442914d2001-05-26 05:50:03 +00001430 if (!PyArg_ParseTuple(args, "O:remove", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001431 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001432 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001433 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1434 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 if (list_ass_slice(self, i, i+1,
1436 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001437 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 Py_INCREF(Py_None);
1439 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001440 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001441 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001442 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001443 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001445 return NULL;
1446}
1447
Jeremy Hylton8caad492000-06-23 14:18:11 +00001448static int
1449list_traverse(PyListObject *o, visitproc visit, void *arg)
1450{
1451 int i, err;
1452 PyObject *x;
1453
1454 for (i = o->ob_size; --i >= 0; ) {
1455 x = o->ob_item[i];
1456 if (x != NULL) {
1457 err = visit(x, arg);
1458 if (err)
1459 return err;
1460 }
1461 }
1462 return 0;
1463}
1464
1465static int
1466list_clear(PyListObject *lp)
1467{
1468 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1469 return 0;
1470}
1471
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001472static PyObject *
1473list_richcompare(PyObject *v, PyObject *w, int op)
1474{
1475 PyListObject *vl, *wl;
1476 int i;
1477
1478 if (!PyList_Check(v) || !PyList_Check(w)) {
1479 Py_INCREF(Py_NotImplemented);
1480 return Py_NotImplemented;
1481 }
1482
1483 vl = (PyListObject *)v;
1484 wl = (PyListObject *)w;
1485
1486 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1487 /* Shortcut: if the lengths differ, the lists differ */
1488 PyObject *res;
1489 if (op == Py_EQ)
1490 res = Py_False;
1491 else
1492 res = Py_True;
1493 Py_INCREF(res);
1494 return res;
1495 }
1496
1497 /* Search for the first index where items are different */
1498 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1499 int k = PyObject_RichCompareBool(vl->ob_item[i],
1500 wl->ob_item[i], Py_EQ);
1501 if (k < 0)
1502 return NULL;
1503 if (!k)
1504 break;
1505 }
1506
1507 if (i >= vl->ob_size || i >= wl->ob_size) {
1508 /* No more items to compare -- compare sizes */
1509 int vs = vl->ob_size;
1510 int ws = wl->ob_size;
1511 int cmp;
1512 PyObject *res;
1513 switch (op) {
1514 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001515 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001516 case Py_EQ: cmp = vs == ws; break;
1517 case Py_NE: cmp = vs != ws; break;
1518 case Py_GT: cmp = vs > ws; break;
1519 case Py_GE: cmp = vs >= ws; break;
1520 default: return NULL; /* cannot happen */
1521 }
1522 if (cmp)
1523 res = Py_True;
1524 else
1525 res = Py_False;
1526 Py_INCREF(res);
1527 return res;
1528 }
1529
1530 /* We have an item that differs -- shortcuts for EQ/NE */
1531 if (op == Py_EQ) {
1532 Py_INCREF(Py_False);
1533 return Py_False;
1534 }
1535 if (op == Py_NE) {
1536 Py_INCREF(Py_True);
1537 return Py_True;
1538 }
1539
1540 /* Compare the final item again using the proper operator */
1541 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1542}
1543
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001544static char append_doc[] =
1545"L.append(object) -- append object to end";
Barry Warsawdedf6d61998-10-09 16:37:25 +00001546static char extend_doc[] =
1547"L.extend(list) -- extend list by appending list elements";
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001548static char insert_doc[] =
1549"L.insert(index, object) -- insert object before index";
1550static char pop_doc[] =
1551"L.pop([index]) -> item -- remove and return item at index (default last)";
1552static char remove_doc[] =
1553"L.remove(value) -- remove first occurrence of value";
1554static char index_doc[] =
1555"L.index(value) -> integer -- return index of first occurrence of value";
1556static char count_doc[] =
1557"L.count(value) -> integer -- return number of occurrences of value";
1558static char reverse_doc[] =
1559"L.reverse() -- reverse *IN PLACE*";
1560static char sort_doc[] =
1561"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1";
1562
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563static PyMethodDef list_methods[] = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001564 {"append", (PyCFunction)listappend, METH_VARARGS, append_doc},
1565 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
1566 {"extend", (PyCFunction)listextend, METH_VARARGS, extend_doc},
1567 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
1568 {"remove", (PyCFunction)listremove, METH_VARARGS, remove_doc},
1569 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
1570 {"count", (PyCFunction)listcount, METH_VARARGS, count_doc},
Tim Peters0e76ab22000-12-13 22:35:46 +00001571 {"reverse", (PyCFunction)listreverse, METH_VARARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001572 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001573 {NULL, NULL} /* sentinel */
1574};
1575
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001577list_getattr(PyListObject *f, char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001578{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 return Py_FindMethod(list_methods, (PyObject *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001580}
1581
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001583 (inquiry)list_length, /* sq_length */
1584 (binaryfunc)list_concat, /* sq_concat */
1585 (intargfunc)list_repeat, /* sq_repeat */
1586 (intargfunc)list_item, /* sq_item */
1587 (intintargfunc)list_slice, /* sq_slice */
1588 (intobjargproc)list_ass_item, /* sq_ass_item */
1589 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
1590 (objobjproc)list_contains, /* sq_contains */
1591 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
1592 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001593};
1594
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595PyTypeObject PyList_Type = {
1596 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001597 0,
1598 "list",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001599 sizeof(PyListObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001600 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001601 (destructor)list_dealloc, /* tp_dealloc */
1602 (printfunc)list_print, /* tp_print */
1603 (getattrfunc)list_getattr, /* tp_getattr */
1604 0, /* tp_setattr */
1605 0, /* tp_compare */
1606 (reprfunc)list_repr, /* tp_repr */
1607 0, /* tp_as_number */
1608 &list_as_sequence, /* tp_as_sequence */
1609 0, /* tp_as_mapping */
1610 0, /* tp_hash */
1611 0, /* tp_call */
1612 0, /* tp_str */
1613 0, /* tp_getattro */
1614 0, /* tp_setattro */
1615 0, /* tp_as_buffer */
1616 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
1617 0, /* tp_doc */
1618 (traverseproc)list_traverse, /* tp_traverse */
1619 (inquiry)list_clear, /* tp_clear */
1620 list_richcompare, /* tp_richcompare */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001621};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001622
1623
1624/* During a sort, we really can't have anyone modifying the list; it could
1625 cause core dumps. Thus, we substitute a dummy type that raises an
1626 explanatory exception when a modifying operation is used. Caveat:
1627 comparisons may behave differently; but I guess it's a bad idea anyway to
1628 compare a list that's being sorted... */
1629
1630static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001631immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001632{
1633 PyErr_SetString(PyExc_TypeError,
1634 "a list cannot be modified while it is being sorted");
1635 return NULL;
1636}
1637
1638static PyMethodDef immutable_list_methods[] = {
1639 {"append", (PyCFunction)immutable_list_op},
1640 {"insert", (PyCFunction)immutable_list_op},
1641 {"remove", (PyCFunction)immutable_list_op},
1642 {"index", (PyCFunction)listindex},
1643 {"count", (PyCFunction)listcount},
1644 {"reverse", (PyCFunction)immutable_list_op},
1645 {"sort", (PyCFunction)immutable_list_op},
1646 {NULL, NULL} /* sentinel */
1647};
1648
1649static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001650immutable_list_getattr(PyListObject *f, char *name)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001651{
1652 return Py_FindMethod(immutable_list_methods, (PyObject *)f, name);
1653}
1654
1655static int
Fred Drakea2f55112000-07-09 15:16:51 +00001656immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001657{
1658 immutable_list_op();
1659 return -1;
1660}
1661
1662static PySequenceMethods immutable_list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001663 (inquiry)list_length, /* sq_length */
1664 (binaryfunc)list_concat, /* sq_concat */
1665 (intargfunc)list_repeat, /* sq_repeat */
1666 (intargfunc)list_item, /* sq_item */
1667 (intintargfunc)list_slice, /* sq_slice */
1668 (intobjargproc)immutable_list_ass, /* sq_ass_item */
1669 (intintobjargproc)immutable_list_ass, /* sq_ass_slice */
1670 (objobjproc)list_contains, /* sq_contains */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001671};
1672
1673static PyTypeObject immutable_list_type = {
1674 PyObject_HEAD_INIT(&PyType_Type)
1675 0,
1676 "list (immutable, during sort)",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001677 sizeof(PyListObject) + PyGC_HEAD_SIZE,
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001678 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001679 0, /* Cannot happen */ /* tp_dealloc */
1680 (printfunc)list_print, /* tp_print */
1681 (getattrfunc)immutable_list_getattr, /* tp_getattr */
1682 0, /* tp_setattr */
1683 0, /* Won't be called */ /* tp_compare */
1684 (reprfunc)list_repr, /* tp_repr */
1685 0, /* tp_as_number */
1686 &immutable_list_as_sequence, /* tp_as_sequence */
1687 0, /* tp_as_mapping */
1688 0, /* tp_hash */
1689 0, /* tp_call */
1690 0, /* tp_str */
1691 0, /* tp_getattro */
1692 0, /* tp_setattro */
1693 0, /* tp_as_buffer */
1694 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
1695 0, /* tp_doc */
1696 (traverseproc)list_traverse, /* tp_traverse */
1697 0, /* tp_clear */
1698 list_richcompare, /* tp_richcompare */
1699 /* NOTE: This is *not* the standard list_type struct! */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001700};