blob: 49d977ed0eb3100d5739316a8b5a9300aab4b4c7 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* List object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
4
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00005#ifdef STDC_HEADERS
6#include <stddef.h>
7#else
8#include <sys/types.h> /* For size_t */
9#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Guido van Rossuma46d51d1995-01-26 22:59:43 +000011static int
Fred Drakea2f55112000-07-09 15:16:51 +000012roundupsize(int n)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000013{
Tim Peters65b8b842001-05-26 05:28:40 +000014 unsigned int nbits = 0;
15 unsigned int n2 = (unsigned int)n >> 5;
16
Tim Peters3b01a122002-07-19 02:35:45 +000017 /* Round up:
Tim Peters65b8b842001-05-26 05:28:40 +000018 * If n < 256, to a multiple of 8.
19 * If n < 2048, to a multiple of 64.
20 * If n < 16384, to a multiple of 512.
21 * If n < 131072, to a multiple of 4096.
22 * If n < 1048576, to a multiple of 32768.
23 * If n < 8388608, to a multiple of 262144.
24 * If n < 67108864, to a multiple of 2097152.
25 * If n < 536870912, to a multiple of 16777216.
26 * ...
27 * If n < 2**(5+3*i), to a multiple of 2**(3*i).
28 *
29 * This over-allocates proportional to the list size, making room
30 * for additional growth. The over-allocation is mild, but is
31 * enough to give linear-time amortized behavior over a long
32 * sequence of appends() in the presence of a poorly-performing
33 * system realloc() (which is a reality, e.g., across all flavors
34 * of Windows, with Win9x behavior being particularly bad -- and
35 * we've still got address space fragmentation problems on Win9x
36 * even with this scheme, although it requires much longer lists to
37 * provoke them than it used to).
38 */
39 do {
40 n2 >>= 3;
41 nbits += 3;
42 } while (n2);
43 return ((n >> nbits) + 1) << nbits;
44 }
Guido van Rossuma46d51d1995-01-26 22:59:43 +000045
Neal Norwitzd4e5be52002-05-22 23:19:17 +000046#define NRESIZE(var, type, nitems) \
47do { \
48 size_t _new_size = roundupsize(nitems); \
49 if (_new_size <= ((~(size_t)0) / sizeof(type))) \
50 PyMem_RESIZE(var, type, _new_size); \
51 else \
52 var = NULL; \
53} while (0)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000054
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000056PyList_New(int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000059 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 return NULL;
63 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000065 /* Check for overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 if (nbytes / sizeof(PyObject *) != (size_t)size) {
67 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000068 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000069 op = PyObject_GC_New(PyListObject, &PyList_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 if (op == NULL) {
Neil Schemenauere83c00e2001-08-29 23:54:21 +000071 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 }
73 if (size <= 0) {
74 op->ob_item = NULL;
75 }
76 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +000077 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 if (op->ob_item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080 }
Neal Norwitz35fc7602002-06-13 21:11:11 +000081 memset(op->ob_item, 0, sizeof(*op->ob_item) * size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000083 op->ob_size = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000084 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086}
87
88int
Fred Drakea2f55112000-07-09 15:16:51 +000089PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 if (!PyList_Check(op)) {
92 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 return -1;
94 }
95 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097}
98
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000100
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000102PyList_GetItem(PyObject *op, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 if (!PyList_Check(op)) {
105 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 return NULL;
107 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000109 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 indexerr = PyString_FromString(
111 "list index out of range");
112 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113 return NULL;
114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116}
117
118int
Fred Drakea2f55112000-07-09 15:16:51 +0000119PyList_SetItem(register PyObject *op, register int i,
120 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 register PyObject *olditem;
123 register PyObject **p;
124 if (!PyList_Check(op)) {
125 Py_XDECREF(newitem);
126 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000127 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
130 Py_XDECREF(newitem);
131 PyErr_SetString(PyExc_IndexError,
132 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000133 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000136 olditem = *p;
137 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 return 0;
140}
141
142static int
Fred Drakea2f55112000-07-09 15:16:51 +0000143ins1(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144{
145 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000147 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000149 return -1;
150 }
Trent Micka5846642000-08-13 22:47:45 +0000151 if (self->ob_size == INT_MAX) {
152 PyErr_SetString(PyExc_OverflowError,
153 "cannot add more objects to list");
154 return -1;
155 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 items = self->ob_item;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 NRESIZE(items, PyObject *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000158 if (items == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000160 return -1;
161 }
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000162 if (where < 0) {
163 where += self->ob_size;
164 if (where < 0)
165 where = 0;
166 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 if (where > self->ob_size)
168 where = self->ob_size;
169 for (i = self->ob_size; --i >= where; )
170 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172 items[where] = v;
173 self->ob_item = items;
174 self->ob_size++;
175 return 0;
176}
177
178int
Fred Drakea2f55112000-07-09 15:16:51 +0000179PyList_Insert(PyObject *op, int where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 if (!PyList_Check(op)) {
182 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000183 return -1;
184 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
188int
Fred Drakea2f55112000-07-09 15:16:51 +0000189PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 if (!PyList_Check(op)) {
192 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000193 return -1;
194 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 return ins1((PyListObject *)op,
196 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
199/* Methods */
200
201static void
Fred Drakea2f55112000-07-09 15:16:51 +0000202list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203{
204 int i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000205 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000206 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000207 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000208 /* Do it backwards, for Christian Tismer.
209 There's a simple test case where somehow this reduces
210 thrashing when a *very* large list is created and
211 immediately deleted. */
212 i = op->ob_size;
213 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000215 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000216 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000217 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000218 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000219 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220}
221
Guido van Rossum90933611991-06-07 16:10:43 +0000222static int
Fred Drakea2f55112000-07-09 15:16:51 +0000223list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224{
225 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000226
227 i = Py_ReprEnter((PyObject*)op);
228 if (i != 0) {
229 if (i < 0)
230 return i;
231 fprintf(fp, "[...]");
232 return 0;
233 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000235 for (i = 0; i < op->ob_size; i++) {
236 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000238 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
239 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000240 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000241 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 }
243 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000244 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000245 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246}
247
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000249list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000252 PyObject *s, *temp;
253 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000254
255 i = Py_ReprEnter((PyObject*)v);
256 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000257 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000258 }
Tim Petersa7259592001-06-16 05:11:17 +0000259
260 if (v->ob_size == 0) {
261 result = PyString_FromString("[]");
262 goto Done;
263 }
264
265 pieces = PyList_New(0);
266 if (pieces == NULL)
267 goto Done;
268
269 /* Do repr() on each element. Note that this may mutate the list,
270 so must refetch the list size on each iteration. */
271 for (i = 0; i < v->ob_size; ++i) {
272 int status;
273 s = PyObject_Repr(v->ob_item[i]);
274 if (s == NULL)
275 goto Done;
276 status = PyList_Append(pieces, s);
277 Py_DECREF(s); /* append created a new ref */
278 if (status < 0)
279 goto Done;
280 }
281
282 /* Add "[]" decorations to the first and last items. */
283 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000285 if (s == NULL)
286 goto Done;
287 temp = PyList_GET_ITEM(pieces, 0);
288 PyString_ConcatAndDel(&s, temp);
289 PyList_SET_ITEM(pieces, 0, s);
290 if (s == NULL)
291 goto Done;
292
293 s = PyString_FromString("]");
294 if (s == NULL)
295 goto Done;
296 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
297 PyString_ConcatAndDel(&temp, s);
298 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
299 if (temp == NULL)
300 goto Done;
301
302 /* Paste them all together with ", " between. */
303 s = PyString_FromString(", ");
304 if (s == NULL)
305 goto Done;
306 result = _PyString_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000307 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000308
309Done:
310 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000311 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000312 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313}
314
315static int
Fred Drakea2f55112000-07-09 15:16:51 +0000316list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317{
318 return a->ob_size;
319}
320
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000321
322
323static int
Fred Drakea2f55112000-07-09 15:16:51 +0000324list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000325{
Raymond Hettingeraae59992002-09-05 14:23:49 +0000326 int i, cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000327
Raymond Hettingeraae59992002-09-05 14:23:49 +0000328 for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
329 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000330 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000331 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000332}
333
334
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000336list_item(PyListObject *a, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337{
338 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000339 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 indexerr = PyString_FromString(
341 "list index out of range");
342 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 return NULL;
344 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346 return a->ob_item[i];
347}
348
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000350list_slice(PyListObject *a, int ilow, int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 int i;
354 if (ilow < 0)
355 ilow = 0;
356 else if (ilow > a->ob_size)
357 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 if (ihigh < ilow)
359 ihigh = ilow;
360 else if (ihigh > a->ob_size)
361 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000363 if (np == NULL)
364 return NULL;
365 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 PyObject *v = a->ob_item[i];
367 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 np->ob_item[i - ilow] = v;
369 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371}
372
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000374PyList_GetSlice(PyObject *a, int ilow, int ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000375{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 if (!PyList_Check(a)) {
377 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000378 return NULL;
379 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000381}
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000384list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385{
386 int size;
387 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 PyListObject *np;
389 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000390 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000391 "can only concatenate list (not \"%.200s\") to list",
392 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 return NULL;
394 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 size = a->ob_size + b->ob_size;
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000397 if (size < 0)
398 return PyErr_NoMemory();
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 Rossumbfa5a142002-10-11 23:39:35 +0000427 if (n && size/n != a->ob_size)
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000428 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000430 if (np == NULL)
431 return NULL;
432 p = np->ob_item;
433 for (i = 0; i < n; i++) {
434 for (j = 0; j < a->ob_size; j++) {
435 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000437 p++;
438 }
439 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000441}
442
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443static int
Fred Drakea2f55112000-07-09 15:16:51 +0000444list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000446 /* Because [X]DECREF can recursively invoke list operations on
447 this list, we must postpone all [X]DECREF activity until
448 after the list is back in its canonical shape. Therefore
449 we must allocate an additional array, 'recycle', into which
450 we temporarily copy the items that are deleted from the
451 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 PyObject **recycle, **p;
453 PyObject **item;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000454 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455 int n; /* Size of replacement list */
456 int d; /* Change in size */
457 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 if (v == NULL)
460 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000461 else {
462 char msg[256];
Neal Norwitz03b109a2002-11-05 22:41:37 +0000463 PyOS_snprintf(msg, sizeof(msg),
464 "must assign sequence"
465 " (not \"%.200s\") to slice",
466 v->ob_type->tp_name);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000467 v_as_SF = PySequence_Fast(v, msg);
468 if(v_as_SF == NULL)
469 return -1;
470 n = PySequence_Fast_GET_SIZE(v_as_SF);
471
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000472 if (a == b) {
473 /* Special case "a[i:j] = a" -- copy b first */
474 int ret;
475 v = list_slice(b, 0, n);
476 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000478 return ret;
479 }
480 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481 if (ilow < 0)
482 ilow = 0;
483 else if (ilow > a->ob_size)
484 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485 if (ihigh < ilow)
486 ihigh = ilow;
487 else if (ihigh > a->ob_size)
488 ihigh = a->ob_size;
489 item = a->ob_item;
490 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000491 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000493 else
494 p = recycle = NULL;
495 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000496 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000497 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 if (d < 0) {
499 for (/*k = ihigh*/; k < a->ob_size; k++)
500 item[k+d] = item[k];
501 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000503 a->ob_item = item;
504 }
505 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000506 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000508 if (item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000509 if (recycle != NULL)
510 PyMem_DEL(recycle);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000512 return -1;
513 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000514 for (k = a->ob_size; --k >= ihigh; )
515 item[k+d] = item[k];
516 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000517 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518 a->ob_item = item;
519 a->ob_size += d;
520 }
521 for (k = 0; k < n; k++, ilow++) {
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000522 PyObject *w = PySequence_Fast_GET_ITEM(v_as_SF, k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000524 item[ilow] = w;
525 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000526 if (recycle) {
527 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 Py_XDECREF(*p);
529 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000530 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 if (a->ob_size == 0 && a->ob_item != NULL) {
532 PyMem_FREE(a->ob_item);
533 a->ob_item = NULL;
534 }
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000535 Py_XDECREF(v_as_SF);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000536 return 0;
537#undef b
538}
539
Guido van Rossum234f9421993-06-17 12:35:49 +0000540int
Fred Drakea2f55112000-07-09 15:16:51 +0000541PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000542{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 if (!PyList_Check(a)) {
544 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000545 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000546 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000548}
549
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000550static PyObject *
551list_inplace_repeat(PyListObject *self, int n)
552{
553 PyObject **items;
554 int size, i, j;
555
556
557 size = PyList_GET_SIZE(self);
558 if (size == 0) {
559 Py_INCREF(self);
560 return (PyObject *)self;
561 }
562
563 items = self->ob_item;
564
565 if (n < 1) {
566 self->ob_item = NULL;
567 self->ob_size = 0;
568 for (i = 0; i < size; i++)
569 Py_XDECREF(items[i]);
570 PyMem_DEL(items);
571 Py_INCREF(self);
572 return (PyObject *)self;
573 }
574
575 NRESIZE(items, PyObject*, size*n);
576 if (items == NULL) {
577 PyErr_NoMemory();
578 goto finally;
579 }
580 self->ob_item = items;
581 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
582 for (j = 0; j < size; j++) {
583 PyObject *o = PyList_GET_ITEM(self, j);
584 Py_INCREF(o);
585 PyList_SET_ITEM(self, self->ob_size++, o);
586 }
587 }
588 Py_INCREF(self);
589 return (PyObject *)self;
590 finally:
591 return NULL;
592}
593
Guido van Rossum4a450d01991-04-03 19:05:18 +0000594static int
Fred Drakea2f55112000-07-09 15:16:51 +0000595list_ass_item(PyListObject *a, int i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000596{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000598 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 PyErr_SetString(PyExc_IndexError,
600 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000601 return -1;
602 }
603 if (v == NULL)
604 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000606 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000607 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000608 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000609 return 0;
610}
611
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000613ins(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614{
615 if (ins1(self, where, v) != 0)
616 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 Py_INCREF(Py_None);
618 return Py_None;
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 +0000622listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623{
624 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000626 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000628 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000629}
630
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000632listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633{
Guido van Rossumbf80e541993-02-08 15:49:17 +0000634 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635}
636
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000637static int
638listextend_internal(PyListObject *self, PyObject *b)
Barry Warsawdedf6d61998-10-09 16:37:25 +0000639{
Barry Warsawdedf6d61998-10-09 16:37:25 +0000640 PyObject **items;
641 int selflen = PyList_GET_SIZE(self);
642 int blen;
643 register int i;
644
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000645 if (PyObject_Size(b) == 0) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000646 /* short circuit when b is empty */
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000647 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000648 return 0;
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000649 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000650
Barry Warsawdedf6d61998-10-09 16:37:25 +0000651 if (self == (PyListObject*)b) {
652 /* as in list_ass_slice() we must special case the
653 * situation: a.extend(a)
654 *
655 * XXX: I think this way ought to be faster than using
656 * list_slice() the way list_ass_slice() does.
657 */
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000658 Py_DECREF(b);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000659 b = PyList_New(selflen);
660 if (!b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000661 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000662 for (i = 0; i < selflen; i++) {
663 PyObject *o = PyList_GET_ITEM(self, i);
664 Py_INCREF(o);
665 PyList_SET_ITEM(b, i, o);
666 }
667 }
Barry Warsawdedf6d61998-10-09 16:37:25 +0000668
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000669 blen = PyObject_Size(b);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000670
Barry Warsawdedf6d61998-10-09 16:37:25 +0000671 /* resize a using idiom */
672 items = self->ob_item;
673 NRESIZE(items, PyObject*, selflen + blen);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000674 if (items == NULL) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000675 PyErr_NoMemory();
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000676 Py_DECREF(b);
677 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000678 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000679
Barry Warsawdedf6d61998-10-09 16:37:25 +0000680 self->ob_item = items;
681
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000682 /* populate the end of self with b's items */
Barry Warsawdedf6d61998-10-09 16:37:25 +0000683 for (i = 0; i < blen; i++) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000684 PyObject *o = PySequence_Fast_GET_ITEM(b, i);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000685 Py_INCREF(o);
686 PyList_SET_ITEM(self, self->ob_size++, o);
687 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000688 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000689 return 0;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000690}
691
692
693static PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000694list_inplace_concat(PyListObject *self, PyObject *other)
695{
Tim Peters1af03e92001-05-26 19:37:54 +0000696 other = PySequence_Fast(other, "argument to += must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000697 if (!other)
698 return NULL;
699
700 if (listextend_internal(self, other) < 0)
701 return NULL;
702
703 Py_INCREF(self);
704 return (PyObject *)self;
705}
706
707static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000708listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000709{
710
Tim Peters1af03e92001-05-26 19:37:54 +0000711 b = PySequence_Fast(b, "list.extend() argument must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000712 if (!b)
713 return NULL;
714
715 if (listextend_internal(self, b) < 0)
716 return NULL;
717
718 Py_INCREF(Py_None);
719 return Py_None;
720}
721
722static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000723listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000724{
725 int i = -1;
726 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000727 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000728 return NULL;
729 if (self->ob_size == 0) {
730 /* Special-case most common failure cause */
731 PyErr_SetString(PyExc_IndexError, "pop from empty list");
732 return NULL;
733 }
734 if (i < 0)
735 i += self->ob_size;
736 if (i < 0 || i >= self->ob_size) {
737 PyErr_SetString(PyExc_IndexError, "pop index out of range");
738 return NULL;
739 }
740 v = self->ob_item[i];
741 Py_INCREF(v);
742 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
743 Py_DECREF(v);
744 return NULL;
745 }
746 return v;
747}
748
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000749/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
750static void
751reverse_slice(PyObject **lo, PyObject **hi)
752{
753 assert(lo && hi);
754
755 --hi;
756 while (lo < hi) {
757 PyObject *t = *lo;
758 *lo = *hi;
759 *hi = t;
760 ++lo;
761 --hi;
762 }
763}
764
Tim Petersa64dc242002-08-01 02:13:36 +0000765/* Lots of code for an adaptive, stable, natural mergesort. There are many
766 * pieces to this algorithm; read listsort.txt for overviews and details.
767 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000768
Guido van Rossum3f236de1996-12-10 23:55:39 +0000769/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000770 * comparison function (any callable Python object), which must not be
771 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
772 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000773 * Returns -1 on error, 1 if x < y, 0 if x >= y.
774 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000775static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000776islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000777{
Tim Petersf2a04732002-07-11 21:46:16 +0000778 PyObject *res;
779 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000780 int i;
781
Tim Peters66860f62002-08-04 17:47:26 +0000782 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000783 /* Call the user's comparison function and translate the 3-way
784 * result into true or false (or error).
785 */
Tim Petersf2a04732002-07-11 21:46:16 +0000786 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000787 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000788 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000789 Py_INCREF(x);
790 Py_INCREF(y);
791 PyTuple_SET_ITEM(args, 0, x);
792 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000793 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000795 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000796 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 if (!PyInt_Check(res)) {
798 Py_DECREF(res);
799 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000800 "comparison function must return int");
Tim Petersa8c974c2002-07-19 03:30:57 +0000801 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000802 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 i = PyInt_AsLong(res);
804 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000805 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000806}
807
Tim Peters66860f62002-08-04 17:47:26 +0000808/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
809 * islt. This avoids a layer of function call in the usual case, and
810 * sorting does many comparisons.
811 * Returns -1 on error, 1 if x < y, 0 if x >= y.
812 */
813#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
814 PyObject_RichCompareBool(X, Y, Py_LT) : \
815 islt(X, Y, COMPARE))
816
817/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000818 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
819 started. It makes more sense in context <wink>. X and Y are PyObject*s.
820*/
Tim Peters66860f62002-08-04 17:47:26 +0000821#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000822 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000823
824/* binarysort is the best method for sorting small arrays: it does
825 few compares, but can do data movement quadratic in the number of
826 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000827 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000828 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000829 On entry, must have lo <= start <= hi, and that [lo, start) is already
830 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000831 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000832 Even in case of error, the output slice will be some permutation of
833 the input (nothing is lost or duplicated).
834*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000835static int
Fred Drakea2f55112000-07-09 15:16:51 +0000836binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
837 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000838{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000839 register int k;
840 register PyObject **l, **p, **r;
841 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000842
Tim Petersa8c974c2002-07-19 03:30:57 +0000843 assert(lo <= start && start <= hi);
844 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000845 if (lo == start)
846 ++start;
847 for (; start < hi; ++start) {
848 /* set l to where *start belongs */
849 l = lo;
850 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000851 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000852 /* Invariants:
853 * pivot >= all in [lo, l).
854 * pivot < all in [r, start).
855 * The second is vacuously true at the start.
856 */
857 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000858 do {
859 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000860 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000861 r = p;
862 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000863 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000864 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000865 assert(l == r);
866 /* The invariants still hold, so pivot >= all in [lo, l) and
867 pivot < all in [l, start), so pivot belongs at l. Note
868 that if there are elements equal to pivot, l points to the
869 first slot after them -- that's why this sort is stable.
870 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000871 Caution: using memmove is much slower under MSVC 5;
872 we're not usually moving many slots. */
873 for (p = start; p > l; --p)
874 *p = *(p-1);
875 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000876 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000877 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000878
879 fail:
880 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000881}
882
Tim Petersa64dc242002-08-01 02:13:36 +0000883/*
884Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
885is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000886
Tim Petersa64dc242002-08-01 02:13:36 +0000887 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000888
Tim Petersa64dc242002-08-01 02:13:36 +0000889or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000890
Tim Petersa64dc242002-08-01 02:13:36 +0000891 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +0000892
Tim Petersa64dc242002-08-01 02:13:36 +0000893Boolean *descending is set to 0 in the former case, or to 1 in the latter.
894For its intended use in a stable mergesort, the strictness of the defn of
895"descending" is needed so that the caller can safely reverse a descending
896sequence without violating stability (strict > ensures there are no equal
897elements to get out of order).
898
899Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000900*/
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000901static int
Tim Petersa64dc242002-08-01 02:13:36 +0000902count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000903{
Tim Petersa64dc242002-08-01 02:13:36 +0000904 int k;
905 int n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000906
Tim Petersa64dc242002-08-01 02:13:36 +0000907 assert(lo < hi);
908 *descending = 0;
909 ++lo;
910 if (lo == hi)
911 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000912
Tim Petersa64dc242002-08-01 02:13:36 +0000913 n = 2;
914 IFLT(*lo, *(lo-1)) {
915 *descending = 1;
916 for (lo = lo+1; lo < hi; ++lo, ++n) {
917 IFLT(*lo, *(lo-1))
918 ;
919 else
920 break;
921 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000922 }
Tim Petersa64dc242002-08-01 02:13:36 +0000923 else {
924 for (lo = lo+1; lo < hi; ++lo, ++n) {
925 IFLT(*lo, *(lo-1))
926 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000927 }
928 }
929
Tim Petersa64dc242002-08-01 02:13:36 +0000930 return n;
931fail:
932 return -1;
933}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000934
Tim Petersa64dc242002-08-01 02:13:36 +0000935/*
936Locate the proper position of key in a sorted vector; if the vector contains
937an element equal to key, return the position immediately to the left of
938the leftmost equal element. [gallop_right() does the same except returns
939the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000940
Tim Petersa64dc242002-08-01 02:13:36 +0000941"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000942
Tim Petersa64dc242002-08-01 02:13:36 +0000943"hint" is an index at which to begin the search, 0 <= hint < n. The closer
944hint is to the final result, the faster this runs.
945
946The return value is the int k in 0..n such that
947
948 a[k-1] < key <= a[k]
949
950pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
951key belongs at index k; or, IOW, the first k elements of a should precede
952key, and the last n-k should follow key.
953
954Returns -1 on error. See listsort.txt for info on the method.
955*/
956static int
957gallop_left(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
958{
959 int ofs;
960 int lastofs;
961 int k;
962
963 assert(key && a && n > 0 && hint >= 0 && hint < n);
964
965 a += hint;
966 lastofs = 0;
967 ofs = 1;
968 IFLT(*a, key) {
969 /* a[hint] < key -- gallop right, until
970 * a[hint + lastofs] < key <= a[hint + ofs]
971 */
972 const int maxofs = n - hint; /* &a[n-1] is highest */
973 while (ofs < maxofs) {
974 IFLT(a[ofs], key) {
975 lastofs = ofs;
976 ofs = (ofs << 1) + 1;
977 if (ofs <= 0) /* int overflow */
978 ofs = maxofs;
979 }
980 else /* key <= a[hint + ofs] */
981 break;
982 }
983 if (ofs > maxofs)
984 ofs = maxofs;
985 /* Translate back to offsets relative to &a[0]. */
986 lastofs += hint;
987 ofs += hint;
988 }
989 else {
990 /* key <= a[hint] -- gallop left, until
991 * a[hint - ofs] < key <= a[hint - lastofs]
992 */
993 const int maxofs = hint + 1; /* &a[0] is lowest */
994 while (ofs < maxofs) {
995 IFLT(*(a-ofs), key)
996 break;
997 /* key <= a[hint - ofs] */
998 lastofs = ofs;
999 ofs = (ofs << 1) + 1;
1000 if (ofs <= 0) /* int overflow */
1001 ofs = maxofs;
1002 }
1003 if (ofs > maxofs)
1004 ofs = maxofs;
1005 /* Translate back to positive offsets relative to &a[0]. */
1006 k = lastofs;
1007 lastofs = hint - ofs;
1008 ofs = hint - k;
1009 }
1010 a -= hint;
1011
1012 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1013 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1014 * right of lastofs but no farther right than ofs. Do a binary
1015 * search, with invariant a[lastofs-1] < key <= a[ofs].
1016 */
1017 ++lastofs;
1018 while (lastofs < ofs) {
1019 int m = lastofs + ((ofs - lastofs) >> 1);
1020
1021 IFLT(a[m], key)
1022 lastofs = m+1; /* a[m] < key */
1023 else
1024 ofs = m; /* key <= a[m] */
1025 }
1026 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1027 return ofs;
1028
1029fail:
1030 return -1;
1031}
1032
1033/*
1034Exactly like gallop_left(), except that if key already exists in a[0:n],
1035finds the position immediately to the right of the rightmost equal value.
1036
1037The return value is the int k in 0..n such that
1038
1039 a[k-1] <= key < a[k]
1040
1041or -1 if error.
1042
1043The code duplication is massive, but this is enough different given that
1044we're sticking to "<" comparisons that it's much harder to follow if
1045written as one routine with yet another "left or right?" flag.
1046*/
1047static int
1048gallop_right(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
1049{
1050 int ofs;
1051 int lastofs;
1052 int k;
1053
1054 assert(key && a && n > 0 && hint >= 0 && hint < n);
1055
1056 a += hint;
1057 lastofs = 0;
1058 ofs = 1;
1059 IFLT(key, *a) {
1060 /* key < a[hint] -- gallop left, until
1061 * a[hint - ofs] <= key < a[hint - lastofs]
1062 */
1063 const int maxofs = hint + 1; /* &a[0] is lowest */
1064 while (ofs < maxofs) {
1065 IFLT(key, *(a-ofs)) {
1066 lastofs = ofs;
1067 ofs = (ofs << 1) + 1;
1068 if (ofs <= 0) /* int overflow */
1069 ofs = maxofs;
1070 }
1071 else /* a[hint - ofs] <= key */
1072 break;
1073 }
1074 if (ofs > maxofs)
1075 ofs = maxofs;
1076 /* Translate back to positive offsets relative to &a[0]. */
1077 k = lastofs;
1078 lastofs = hint - ofs;
1079 ofs = hint - k;
1080 }
1081 else {
1082 /* a[hint] <= key -- gallop right, until
1083 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001084 */
Tim Petersa64dc242002-08-01 02:13:36 +00001085 const int maxofs = n - hint; /* &a[n-1] is highest */
1086 while (ofs < maxofs) {
1087 IFLT(key, a[ofs])
1088 break;
1089 /* a[hint + ofs] <= key */
1090 lastofs = ofs;
1091 ofs = (ofs << 1) + 1;
1092 if (ofs <= 0) /* int overflow */
1093 ofs = maxofs;
1094 }
1095 if (ofs > maxofs)
1096 ofs = maxofs;
1097 /* Translate back to offsets relative to &a[0]. */
1098 lastofs += hint;
1099 ofs += hint;
1100 }
1101 a -= hint;
1102
1103 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1104 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1105 * right of lastofs but no farther right than ofs. Do a binary
1106 * search, with invariant a[lastofs-1] <= key < a[ofs].
1107 */
1108 ++lastofs;
1109 while (lastofs < ofs) {
1110 int m = lastofs + ((ofs - lastofs) >> 1);
1111
1112 IFLT(key, a[m])
1113 ofs = m; /* key < a[m] */
1114 else
1115 lastofs = m+1; /* a[m] <= key */
1116 }
1117 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1118 return ofs;
1119
1120fail:
1121 return -1;
1122}
1123
1124/* The maximum number of entries in a MergeState's pending-runs stack.
1125 * This is enough to sort arrays of size up to about
1126 * 32 * phi ** MAX_MERGE_PENDING
1127 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1128 * with 2**64 elements.
1129 */
1130#define MAX_MERGE_PENDING 85
1131
Tim Peterse05f65a2002-08-10 05:21:15 +00001132/* When we get into galloping mode, we stay there until both runs win less
1133 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001134 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001135#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001136
1137/* Avoid malloc for small temp arrays. */
1138#define MERGESTATE_TEMP_SIZE 256
1139
1140/* One MergeState exists on the stack per invocation of mergesort. It's just
1141 * a convenient way to pass state around among the helper functions.
1142 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001143struct s_slice {
1144 PyObject **base;
1145 int len;
1146};
1147
Tim Petersa64dc242002-08-01 02:13:36 +00001148typedef struct s_MergeState {
1149 /* The user-supplied comparison function. or NULL if none given. */
1150 PyObject *compare;
1151
Tim Peterse05f65a2002-08-10 05:21:15 +00001152 /* This controls when we get *into* galloping mode. It's initialized
1153 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1154 * random data, and lower for highly structured data.
1155 */
1156 int min_gallop;
1157
Tim Petersa64dc242002-08-01 02:13:36 +00001158 /* 'a' is temp storage to help with merges. It contains room for
1159 * alloced entries.
1160 */
1161 PyObject **a; /* may point to temparray below */
1162 int alloced;
1163
1164 /* A stack of n pending runs yet to be merged. Run #i starts at
1165 * address base[i] and extends for len[i] elements. It's always
1166 * true (so long as the indices are in bounds) that
1167 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001168 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001169 *
1170 * so we could cut the storage for this, but it's a minor amount,
1171 * and keeping all the info explicit simplifies the code.
1172 */
1173 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001174 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001175
1176 /* 'a' points to this when possible, rather than muck with malloc. */
1177 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1178} MergeState;
1179
1180/* Conceptually a MergeState's constructor. */
1181static void
1182merge_init(MergeState *ms, PyObject *compare)
1183{
1184 assert(ms != NULL);
1185 ms->compare = compare;
1186 ms->a = ms->temparray;
1187 ms->alloced = MERGESTATE_TEMP_SIZE;
1188 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001189 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001190}
1191
1192/* Free all the temp memory owned by the MergeState. This must be called
1193 * when you're done with a MergeState, and may be called before then if
1194 * you want to free the temp memory early.
1195 */
1196static void
1197merge_freemem(MergeState *ms)
1198{
1199 assert(ms != NULL);
1200 if (ms->a != ms->temparray)
1201 PyMem_Free(ms->a);
1202 ms->a = ms->temparray;
1203 ms->alloced = MERGESTATE_TEMP_SIZE;
1204}
1205
1206/* Ensure enough temp memory for 'need' array slots is available.
1207 * Returns 0 on success and -1 if the memory can't be gotten.
1208 */
1209static int
1210merge_getmem(MergeState *ms, int need)
1211{
1212 assert(ms != NULL);
1213 if (need <= ms->alloced)
1214 return 0;
1215 /* Don't realloc! That can cost cycles to copy the old data, but
1216 * we don't care what's in the block.
1217 */
1218 merge_freemem(ms);
1219 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1220 if (ms->a) {
1221 ms->alloced = need;
1222 return 0;
1223 }
1224 PyErr_NoMemory();
1225 merge_freemem(ms); /* reset to sane state */
1226 return -1;
1227}
1228#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1229 merge_getmem(MS, NEED))
1230
1231/* Merge the na elements starting at pa with the nb elements starting at pb
1232 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1233 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1234 * merge, and should have na <= nb. See listsort.txt for more info.
1235 * Return 0 if successful, -1 if error.
1236 */
1237static int
1238merge_lo(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1239{
1240 int k;
1241 PyObject *compare;
1242 PyObject **dest;
1243 int result = -1; /* guilty until proved innocent */
Tim Peterse05f65a2002-08-10 05:21:15 +00001244 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001245
1246 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1247 if (MERGE_GETMEM(ms, na) < 0)
1248 return -1;
1249 memcpy(ms->a, pa, na * sizeof(PyObject*));
1250 dest = pa;
1251 pa = ms->a;
1252
1253 *dest++ = *pb++;
1254 --nb;
1255 if (nb == 0)
1256 goto Succeed;
1257 if (na == 1)
1258 goto CopyB;
1259
1260 compare = ms->compare;
1261 for (;;) {
1262 int acount = 0; /* # of times A won in a row */
1263 int bcount = 0; /* # of times B won in a row */
1264
1265 /* Do the straightforward thing until (if ever) one run
1266 * appears to win consistently.
1267 */
1268 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001269 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001270 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001271 if (k) {
1272 if (k < 0)
1273 goto Fail;
1274 *dest++ = *pb++;
1275 ++bcount;
1276 acount = 0;
1277 --nb;
1278 if (nb == 0)
1279 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001280 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001281 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001282 }
1283 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001284 *dest++ = *pa++;
1285 ++acount;
1286 bcount = 0;
1287 --na;
1288 if (na == 1)
1289 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001290 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001291 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001292 }
Tim Petersa64dc242002-08-01 02:13:36 +00001293 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001294
Tim Petersa64dc242002-08-01 02:13:36 +00001295 /* One run is winning so consistently that galloping may
1296 * be a huge win. So try that, and continue galloping until
1297 * (if ever) neither run appears to be winning consistently
1298 * anymore.
1299 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001300 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001301 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001302 assert(na > 1 && nb > 0);
1303 min_gallop -= min_gallop > 1;
1304 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001305 k = gallop_right(*pb, pa, na, 0, compare);
1306 acount = k;
1307 if (k) {
1308 if (k < 0)
1309 goto Fail;
1310 memcpy(dest, pa, k * sizeof(PyObject *));
1311 dest += k;
1312 pa += k;
1313 na -= k;
1314 if (na == 1)
1315 goto CopyB;
1316 /* na==0 is impossible now if the comparison
1317 * function is consistent, but we can't assume
1318 * that it is.
1319 */
1320 if (na == 0)
1321 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001322 }
Tim Petersa64dc242002-08-01 02:13:36 +00001323 *dest++ = *pb++;
1324 --nb;
1325 if (nb == 0)
1326 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001327
Tim Petersa64dc242002-08-01 02:13:36 +00001328 k = gallop_left(*pa, pb, nb, 0, compare);
1329 bcount = k;
1330 if (k) {
1331 if (k < 0)
1332 goto Fail;
1333 memmove(dest, pb, k * sizeof(PyObject *));
1334 dest += k;
1335 pb += k;
1336 nb -= k;
1337 if (nb == 0)
1338 goto Succeed;
1339 }
1340 *dest++ = *pa++;
1341 --na;
1342 if (na == 1)
1343 goto CopyB;
1344 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001345 ++min_gallop; /* penalize it for leaving galloping mode */
1346 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001347 }
1348Succeed:
1349 result = 0;
1350Fail:
1351 if (na)
1352 memcpy(dest, pa, na * sizeof(PyObject*));
1353 return result;
1354CopyB:
1355 assert(na == 1 && nb > 0);
1356 /* The last element of pa belongs at the end of the merge. */
1357 memmove(dest, pb, nb * sizeof(PyObject *));
1358 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001359 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001360}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001361
Tim Petersa64dc242002-08-01 02:13:36 +00001362/* Merge the na elements starting at pa with the nb elements starting at pb
1363 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1364 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1365 * merge, and should have na >= nb. See listsort.txt for more info.
1366 * Return 0 if successful, -1 if error.
1367 */
1368static int
1369merge_hi(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1370{
1371 int k;
1372 PyObject *compare;
1373 PyObject **dest;
1374 int result = -1; /* guilty until proved innocent */
1375 PyObject **basea;
1376 PyObject **baseb;
Tim Peterse05f65a2002-08-10 05:21:15 +00001377 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001378
1379 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1380 if (MERGE_GETMEM(ms, nb) < 0)
1381 return -1;
1382 dest = pb + nb - 1;
1383 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1384 basea = pa;
1385 baseb = ms->a;
1386 pb = ms->a + nb - 1;
1387 pa += na - 1;
1388
1389 *dest-- = *pa--;
1390 --na;
1391 if (na == 0)
1392 goto Succeed;
1393 if (nb == 1)
1394 goto CopyA;
1395
1396 compare = ms->compare;
1397 for (;;) {
1398 int acount = 0; /* # of times A won in a row */
1399 int bcount = 0; /* # of times B won in a row */
1400
1401 /* Do the straightforward thing until (if ever) one run
1402 * appears to win consistently.
1403 */
1404 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001405 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001406 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001407 if (k) {
1408 if (k < 0)
1409 goto Fail;
1410 *dest-- = *pa--;
1411 ++acount;
1412 bcount = 0;
1413 --na;
1414 if (na == 0)
1415 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001416 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001417 break;
1418 }
1419 else {
1420 *dest-- = *pb--;
1421 ++bcount;
1422 acount = 0;
1423 --nb;
1424 if (nb == 1)
1425 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001426 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001427 break;
1428 }
1429 }
1430
1431 /* One run is winning so consistently that galloping may
1432 * be a huge win. So try that, and continue galloping until
1433 * (if ever) neither run appears to be winning consistently
1434 * anymore.
1435 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001436 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001437 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001438 assert(na > 0 && nb > 1);
1439 min_gallop -= min_gallop > 1;
1440 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001441 k = gallop_right(*pb, basea, na, na-1, compare);
1442 if (k < 0)
1443 goto Fail;
1444 k = na - k;
1445 acount = k;
1446 if (k) {
1447 dest -= k;
1448 pa -= k;
1449 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1450 na -= k;
1451 if (na == 0)
1452 goto Succeed;
1453 }
1454 *dest-- = *pb--;
1455 --nb;
1456 if (nb == 1)
1457 goto CopyA;
1458
1459 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1460 if (k < 0)
1461 goto Fail;
1462 k = nb - k;
1463 bcount = k;
1464 if (k) {
1465 dest -= k;
1466 pb -= k;
1467 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1468 nb -= k;
1469 if (nb == 1)
1470 goto CopyA;
1471 /* nb==0 is impossible now if the comparison
1472 * function is consistent, but we can't assume
1473 * that it is.
1474 */
1475 if (nb == 0)
1476 goto Succeed;
1477 }
1478 *dest-- = *pa--;
1479 --na;
1480 if (na == 0)
1481 goto Succeed;
1482 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001483 ++min_gallop; /* penalize it for leaving galloping mode */
1484 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001485 }
1486Succeed:
1487 result = 0;
1488Fail:
1489 if (nb)
1490 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1491 return result;
1492CopyA:
1493 assert(nb == 1 && na > 0);
1494 /* The first element of pb belongs at the front of the merge. */
1495 dest -= na;
1496 pa -= na;
1497 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1498 *dest = *pb;
1499 return 0;
1500}
1501
1502/* Merge the two runs at stack indices i and i+1.
1503 * Returns 0 on success, -1 on error.
1504 */
1505static int
1506merge_at(MergeState *ms, int i)
1507{
1508 PyObject **pa, **pb;
1509 int na, nb;
1510 int k;
1511 PyObject *compare;
1512
1513 assert(ms != NULL);
1514 assert(ms->n >= 2);
1515 assert(i >= 0);
1516 assert(i == ms->n - 2 || i == ms->n - 3);
1517
Tim Peterse05f65a2002-08-10 05:21:15 +00001518 pa = ms->pending[i].base;
1519 na = ms->pending[i].len;
1520 pb = ms->pending[i+1].base;
1521 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001522 assert(na > 0 && nb > 0);
1523 assert(pa + na == pb);
1524
1525 /* Record the length of the combined runs; if i is the 3rd-last
1526 * run now, also slide over the last run (which isn't involved
1527 * in this merge). The current run i+1 goes away in any case.
1528 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001529 ms->pending[i].len = na + nb;
1530 if (i == ms->n - 3)
1531 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001532 --ms->n;
1533
1534 /* Where does b start in a? Elements in a before that can be
1535 * ignored (already in place).
1536 */
1537 compare = ms->compare;
1538 k = gallop_right(*pb, pa, na, 0, compare);
1539 if (k < 0)
1540 return -1;
1541 pa += k;
1542 na -= k;
1543 if (na == 0)
1544 return 0;
1545
1546 /* Where does a end in b? Elements in b after that can be
1547 * ignored (already in place).
1548 */
1549 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1550 if (nb <= 0)
1551 return nb;
1552
1553 /* Merge what remains of the runs, using a temp array with
1554 * min(na, nb) elements.
1555 */
1556 if (na <= nb)
1557 return merge_lo(ms, pa, na, pb, nb);
1558 else
1559 return merge_hi(ms, pa, na, pb, nb);
1560}
1561
1562/* Examine the stack of runs waiting to be merged, merging adjacent runs
1563 * until the stack invariants are re-established:
1564 *
1565 * 1. len[-3] > len[-2] + len[-1]
1566 * 2. len[-2] > len[-1]
1567 *
1568 * See listsort.txt for more info.
1569 *
1570 * Returns 0 on success, -1 on error.
1571 */
1572static int
1573merge_collapse(MergeState *ms)
1574{
Tim Peterse05f65a2002-08-10 05:21:15 +00001575 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001576
1577 assert(ms);
1578 while (ms->n > 1) {
1579 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001580 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1581 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001582 --n;
1583 if (merge_at(ms, n) < 0)
1584 return -1;
1585 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001586 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001587 if (merge_at(ms, n) < 0)
1588 return -1;
1589 }
1590 else
1591 break;
1592 }
1593 return 0;
1594}
1595
1596/* Regardless of invariants, merge all runs on the stack until only one
1597 * remains. This is used at the end of the mergesort.
1598 *
1599 * Returns 0 on success, -1 on error.
1600 */
1601static int
1602merge_force_collapse(MergeState *ms)
1603{
Tim Peterse05f65a2002-08-10 05:21:15 +00001604 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001605
1606 assert(ms);
1607 while (ms->n > 1) {
1608 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001609 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001610 --n;
1611 if (merge_at(ms, n) < 0)
1612 return -1;
1613 }
1614 return 0;
1615}
1616
1617/* Compute a good value for the minimum run length; natural runs shorter
1618 * than this are boosted artificially via binary insertion.
1619 *
1620 * If n < 64, return n (it's too small to bother with fancy stuff).
1621 * Else if n is an exact power of 2, return 32.
1622 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1623 * strictly less than, an exact power of 2.
1624 *
1625 * See listsort.txt for more info.
1626 */
1627static int
1628merge_compute_minrun(int n)
1629{
1630 int r = 0; /* becomes 1 if any 1 bits are shifted off */
1631
1632 assert(n >= 0);
1633 while (n >= 64) {
1634 r |= n & 1;
1635 n >>= 1;
1636 }
1637 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001638}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001639
Tim Petersa64dc242002-08-01 02:13:36 +00001640/* An adaptive, stable, natural mergesort. See listsort.txt.
1641 * Returns Py_None on success, NULL on error. Even in case of error, the
1642 * list will be some permutation of its input state (nothing is lost or
1643 * duplicated).
1644 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001646listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001647{
Tim Petersa64dc242002-08-01 02:13:36 +00001648 MergeState ms;
1649 PyObject **lo, **hi;
1650 int nremaining;
1651 int minrun;
Tim Petersb9099c32002-11-12 22:08:10 +00001652 int saved_ob_size;
1653 PyObject **saved_ob_item;
1654 PyObject **empty_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001655 PyObject *compare = NULL;
1656 PyObject *result = NULL; /* guilty until proved innocent */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001657
Tim Petersa64dc242002-08-01 02:13:36 +00001658 assert(self != NULL);
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001659 if (args != NULL) {
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001660 if (!PyArg_UnpackTuple(args, "sort", 0, 1, &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001661 return NULL;
1662 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00001663 if (compare == Py_None)
1664 compare = NULL;
1665
Tim Petersa64dc242002-08-01 02:13:36 +00001666 merge_init(&ms, compare);
Tim Peters330f9e92002-07-19 07:05:44 +00001667
Tim Petersb9099c32002-11-12 22:08:10 +00001668 /* The list is temporarily made empty, so that mutations performed
1669 * by comparison functions can't affect the slice of memory we're
1670 * sorting (allowing mutations during sorting is a core-dump
1671 * factory, since ob_item may change).
1672 */
1673 saved_ob_size = self->ob_size;
1674 saved_ob_item = self->ob_item;
1675 self->ob_size = 0;
1676 self->ob_item = empty_ob_item = PyMem_NEW(PyObject *, 0);
Tim Peters330f9e92002-07-19 07:05:44 +00001677
Tim Petersb9099c32002-11-12 22:08:10 +00001678 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00001679 if (nremaining < 2)
1680 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001681
Tim Petersa64dc242002-08-01 02:13:36 +00001682 /* March over the array once, left to right, finding natural runs,
1683 * and extending short natural runs to minrun elements.
1684 */
Tim Petersb9099c32002-11-12 22:08:10 +00001685 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001686 hi = lo + nremaining;
1687 minrun = merge_compute_minrun(nremaining);
1688 do {
1689 int descending;
1690 int n;
Tim Peters330f9e92002-07-19 07:05:44 +00001691
Tim Petersa64dc242002-08-01 02:13:36 +00001692 /* Identify next run. */
1693 n = count_run(lo, hi, compare, &descending);
1694 if (n < 0)
1695 goto fail;
1696 if (descending)
1697 reverse_slice(lo, lo + n);
1698 /* If short, extend to min(minrun, nremaining). */
1699 if (n < minrun) {
1700 const int force = nremaining <= minrun ?
1701 nremaining : minrun;
1702 if (binarysort(lo, lo + force, lo + n, compare) < 0)
1703 goto fail;
1704 n = force;
1705 }
1706 /* Push run onto pending-runs stack, and maybe merge. */
1707 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00001708 ms.pending[ms.n].base = lo;
1709 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00001710 ++ms.n;
1711 if (merge_collapse(&ms) < 0)
1712 goto fail;
1713 /* Advance to find next run. */
1714 lo += n;
1715 nremaining -= n;
1716 } while (nremaining);
1717 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00001718
Tim Petersa64dc242002-08-01 02:13:36 +00001719 if (merge_force_collapse(&ms) < 0)
1720 goto fail;
1721 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00001722 assert(ms.pending[0].base == saved_ob_item);
1723 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00001724
1725succeed:
1726 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00001727fail:
Tim Petersb9099c32002-11-12 22:08:10 +00001728 if (self->ob_item != empty_ob_item || self->ob_size) {
1729 /* The user mucked with the list during the sort. */
1730 (void)list_ass_slice(self, 0, self->ob_size, (PyObject *)NULL);
1731 if (result != NULL) {
1732 PyErr_SetString(PyExc_ValueError,
1733 "list modified during sort");
1734 result = NULL;
1735 }
1736 }
1737 if (self->ob_item == empty_ob_item)
1738 PyMem_FREE(empty_ob_item);
1739 self->ob_size = saved_ob_size;
1740 self->ob_item = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001741 merge_freemem(&ms);
1742 Py_XINCREF(result);
1743 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001744}
Tim Peters330f9e92002-07-19 07:05:44 +00001745#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00001746#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00001747
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001748int
Fred Drakea2f55112000-07-09 15:16:51 +00001749PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001750{
1751 if (v == NULL || !PyList_Check(v)) {
1752 PyErr_BadInternalCall();
1753 return -1;
1754 }
1755 v = listsort((PyListObject *)v, (PyObject *)NULL);
1756 if (v == NULL)
1757 return -1;
1758 Py_DECREF(v);
1759 return 0;
1760}
1761
Guido van Rossumb86c5492001-02-12 22:06:02 +00001762static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001763listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00001764{
Tim Peters326b4482002-07-19 04:04:16 +00001765 if (self->ob_size > 1)
1766 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001767 Py_INCREF(Py_None);
1768 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001769}
1770
Guido van Rossum84c76f51990-10-30 13:32:20 +00001771int
Fred Drakea2f55112000-07-09 15:16:51 +00001772PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001773{
Tim Peters6063e262002-08-08 01:06:39 +00001774 PyListObject *self = (PyListObject *)v;
1775
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776 if (v == NULL || !PyList_Check(v)) {
1777 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001778 return -1;
1779 }
Tim Peters6063e262002-08-08 01:06:39 +00001780 if (self->ob_size > 1)
1781 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001782 return 0;
1783}
1784
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001785PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001786PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001787{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001788 PyObject *w;
1789 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001790 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001791 if (v == NULL || !PyList_Check(v)) {
1792 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001793 return NULL;
1794 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001795 n = ((PyListObject *)v)->ob_size;
1796 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001797 if (w == NULL)
1798 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001800 memcpy((void *)p,
1801 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001803 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001804 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001805 p++;
1806 }
1807 return w;
1808}
1809
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001810static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001811listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001812{
1813 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001814
Guido van Rossumed98d481991-03-06 13:07:53 +00001815 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001816 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1817 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001818 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001819 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001820 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001821 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001822 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001823 return NULL;
1824}
1825
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001826static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001827listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001828{
1829 int count = 0;
1830 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001831
Guido van Rossume6f7d181991-10-20 20:20:40 +00001832 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001833 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1834 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001835 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001836 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001837 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001838 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001839 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001840}
1841
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001842static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001843listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001844{
1845 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001846
Guido van Rossumed98d481991-03-06 13:07:53 +00001847 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001848 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1849 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001850 if (list_ass_slice(self, i, i+1,
1851 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001852 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001853 Py_INCREF(Py_None);
1854 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001855 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001856 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001857 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001858 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001859 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001860 return NULL;
1861}
1862
Jeremy Hylton8caad492000-06-23 14:18:11 +00001863static int
1864list_traverse(PyListObject *o, visitproc visit, void *arg)
1865{
1866 int i, err;
1867 PyObject *x;
1868
1869 for (i = o->ob_size; --i >= 0; ) {
1870 x = o->ob_item[i];
1871 if (x != NULL) {
1872 err = visit(x, arg);
1873 if (err)
1874 return err;
1875 }
1876 }
1877 return 0;
1878}
1879
1880static int
1881list_clear(PyListObject *lp)
1882{
1883 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1884 return 0;
1885}
1886
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001887static PyObject *
1888list_richcompare(PyObject *v, PyObject *w, int op)
1889{
1890 PyListObject *vl, *wl;
1891 int i;
1892
1893 if (!PyList_Check(v) || !PyList_Check(w)) {
1894 Py_INCREF(Py_NotImplemented);
1895 return Py_NotImplemented;
1896 }
1897
1898 vl = (PyListObject *)v;
1899 wl = (PyListObject *)w;
1900
1901 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1902 /* Shortcut: if the lengths differ, the lists differ */
1903 PyObject *res;
1904 if (op == Py_EQ)
1905 res = Py_False;
1906 else
1907 res = Py_True;
1908 Py_INCREF(res);
1909 return res;
1910 }
1911
1912 /* Search for the first index where items are different */
1913 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1914 int k = PyObject_RichCompareBool(vl->ob_item[i],
1915 wl->ob_item[i], Py_EQ);
1916 if (k < 0)
1917 return NULL;
1918 if (!k)
1919 break;
1920 }
1921
1922 if (i >= vl->ob_size || i >= wl->ob_size) {
1923 /* No more items to compare -- compare sizes */
1924 int vs = vl->ob_size;
1925 int ws = wl->ob_size;
1926 int cmp;
1927 PyObject *res;
1928 switch (op) {
1929 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001930 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001931 case Py_EQ: cmp = vs == ws; break;
1932 case Py_NE: cmp = vs != ws; break;
1933 case Py_GT: cmp = vs > ws; break;
1934 case Py_GE: cmp = vs >= ws; break;
1935 default: return NULL; /* cannot happen */
1936 }
1937 if (cmp)
1938 res = Py_True;
1939 else
1940 res = Py_False;
1941 Py_INCREF(res);
1942 return res;
1943 }
1944
1945 /* We have an item that differs -- shortcuts for EQ/NE */
1946 if (op == Py_EQ) {
1947 Py_INCREF(Py_False);
1948 return Py_False;
1949 }
1950 if (op == Py_NE) {
1951 Py_INCREF(Py_True);
1952 return Py_True;
1953 }
1954
1955 /* Compare the final item again using the proper operator */
1956 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1957}
1958
Tim Peters6d6c1a32001-08-02 04:15:00 +00001959/* Adapted from newer code by Tim */
1960static int
1961list_fill(PyListObject *result, PyObject *v)
1962{
1963 PyObject *it; /* iter(v) */
1964 int n; /* guess for result list size */
1965 int i;
1966
1967 n = result->ob_size;
1968
1969 /* Special-case list(a_list), for speed. */
1970 if (PyList_Check(v)) {
1971 if (v == (PyObject *)result)
1972 return 0; /* source is destination, we're done */
1973 return list_ass_slice(result, 0, n, v);
1974 }
1975
1976 /* Empty previous contents */
1977 if (n != 0) {
1978 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1979 return -1;
1980 }
1981
1982 /* Get iterator. There may be some low-level efficiency to be gained
1983 * by caching the tp_iternext slot instead of using PyIter_Next()
1984 * later, but premature optimization is the root etc.
1985 */
1986 it = PyObject_GetIter(v);
1987 if (it == NULL)
1988 return -1;
1989
1990 /* Guess a result list size. */
1991 n = -1; /* unknown */
1992 if (PySequence_Check(v) &&
1993 v->ob_type->tp_as_sequence->sq_length) {
1994 n = PySequence_Size(v);
1995 if (n < 0)
1996 PyErr_Clear();
1997 }
1998 if (n < 0)
1999 n = 8; /* arbitrary */
2000 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00002001 if (result->ob_item == NULL) {
2002 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002003 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00002004 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00002005 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002006 result->ob_size = n;
2007
2008 /* Run iterator to exhaustion. */
2009 for (i = 0; ; i++) {
2010 PyObject *item = PyIter_Next(it);
2011 if (item == NULL) {
2012 if (PyErr_Occurred())
2013 goto error;
2014 break;
2015 }
2016 if (i < n)
2017 PyList_SET_ITEM(result, i, item); /* steals ref */
2018 else {
2019 int status = ins1(result, result->ob_size, item);
2020 Py_DECREF(item); /* append creates a new ref */
2021 if (status < 0)
2022 goto error;
2023 }
2024 }
2025
2026 /* Cut back result list if initial guess was too large. */
2027 if (i < n && result != NULL) {
2028 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
2029 goto error;
2030 }
2031 Py_DECREF(it);
2032 return 0;
2033
2034 error:
2035 Py_DECREF(it);
2036 return -1;
2037}
2038
2039static int
2040list_init(PyListObject *self, PyObject *args, PyObject *kw)
2041{
2042 PyObject *arg = NULL;
2043 static char *kwlist[] = {"sequence", 0};
2044
2045 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2046 return -1;
2047 if (arg != NULL)
2048 return list_fill(self, arg);
2049 if (self->ob_size > 0)
2050 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
2051 return 0;
2052}
2053
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002054static long
2055list_nohash(PyObject *self)
2056{
2057 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2058 return -1;
2059}
2060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002061PyDoc_STRVAR(append_doc,
2062"L.append(object) -- append object to end");
2063PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002064"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002065PyDoc_STRVAR(insert_doc,
2066"L.insert(index, object) -- insert object before index");
2067PyDoc_STRVAR(pop_doc,
2068"L.pop([index]) -> item -- remove and return item at index (default last)");
2069PyDoc_STRVAR(remove_doc,
2070"L.remove(value) -- remove first occurrence of value");
2071PyDoc_STRVAR(index_doc,
2072"L.index(value) -> integer -- return index of first occurrence of value");
2073PyDoc_STRVAR(count_doc,
2074"L.count(value) -> integer -- return number of occurrences of value");
2075PyDoc_STRVAR(reverse_doc,
2076"L.reverse() -- reverse *IN PLACE*");
2077PyDoc_STRVAR(sort_doc,
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002078"L.sort(cmpfunc=None) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002080static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002081 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002082 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002083 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002084 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002085 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2086 {"index", (PyCFunction)listindex, METH_O, index_doc},
2087 {"count", (PyCFunction)listcount, METH_O, count_doc},
2088 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002089 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002090 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002091};
2092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002094 (inquiry)list_length, /* sq_length */
2095 (binaryfunc)list_concat, /* sq_concat */
2096 (intargfunc)list_repeat, /* sq_repeat */
2097 (intargfunc)list_item, /* sq_item */
2098 (intintargfunc)list_slice, /* sq_slice */
2099 (intobjargproc)list_ass_item, /* sq_ass_item */
2100 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
2101 (objobjproc)list_contains, /* sq_contains */
2102 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2103 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002104};
2105
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002106PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002107"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002108"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002109
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002110static PyObject *list_iter(PyObject *seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002111
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002112static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002113list_subscript(PyListObject* self, PyObject* item)
2114{
2115 if (PyInt_Check(item)) {
2116 long i = PyInt_AS_LONG(item);
2117 if (i < 0)
2118 i += PyList_GET_SIZE(self);
2119 return list_item(self, i);
2120 }
2121 else if (PyLong_Check(item)) {
2122 long i = PyLong_AsLong(item);
2123 if (i == -1 && PyErr_Occurred())
2124 return NULL;
2125 if (i < 0)
2126 i += PyList_GET_SIZE(self);
2127 return list_item(self, i);
2128 }
2129 else if (PySlice_Check(item)) {
2130 int start, stop, step, slicelength, cur, i;
2131 PyObject* result;
2132 PyObject* it;
2133
2134 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2135 &start, &stop, &step, &slicelength) < 0) {
2136 return NULL;
2137 }
2138
2139 if (slicelength <= 0) {
2140 return PyList_New(0);
2141 }
2142 else {
2143 result = PyList_New(slicelength);
2144 if (!result) return NULL;
2145
Tim Peters3b01a122002-07-19 02:35:45 +00002146 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002147 cur += step, i++) {
2148 it = PyList_GET_ITEM(self, cur);
2149 Py_INCREF(it);
2150 PyList_SET_ITEM(result, i, it);
2151 }
Tim Peters3b01a122002-07-19 02:35:45 +00002152
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002153 return result;
2154 }
2155 }
2156 else {
2157 PyErr_SetString(PyExc_TypeError,
2158 "list indices must be integers");
2159 return NULL;
2160 }
2161}
2162
Tim Peters3b01a122002-07-19 02:35:45 +00002163static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002164list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2165{
2166 if (PyInt_Check(item)) {
2167 long i = PyInt_AS_LONG(item);
2168 if (i < 0)
2169 i += PyList_GET_SIZE(self);
2170 return list_ass_item(self, i, value);
2171 }
2172 else if (PyLong_Check(item)) {
2173 long i = PyLong_AsLong(item);
2174 if (i == -1 && PyErr_Occurred())
2175 return -1;
2176 if (i < 0)
2177 i += PyList_GET_SIZE(self);
2178 return list_ass_item(self, i, value);
2179 }
2180 else if (PySlice_Check(item)) {
2181 int start, stop, step, slicelength;
2182
2183 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2184 &start, &stop, &step, &slicelength) < 0) {
2185 return -1;
2186 }
2187
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002188 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2189 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2190 return list_ass_slice(self, start, stop, value);
2191
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002192 if (value == NULL) {
2193 /* delete slice */
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002194 PyObject **garbage, **it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002195 int cur, i, j;
Tim Peters3b01a122002-07-19 02:35:45 +00002196
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002197 if (slicelength <= 0)
2198 return 0;
2199
2200 if (step < 0) {
2201 stop = start + 1;
2202 start = stop + step*(slicelength - 1) - 1;
2203 step = -step;
2204 }
2205
2206 garbage = (PyObject**)
2207 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002208
2209 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002210 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002211 for (cur = start, i = 0;
2212 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002213 cur += step, i++) {
2214 int lim = step;
2215
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002216 garbage[i] = PyList_GET_ITEM(self, cur);
2217
Michael W. Hudson56796f62002-07-29 14:35:04 +00002218 if (cur + step >= self->ob_size) {
2219 lim = self->ob_size - cur - 1;
2220 }
2221
2222 for (j = 0; j < lim; j++) {
Tim Peters3b01a122002-07-19 02:35:45 +00002223 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00002224 PyList_GET_ITEM(self,
2225 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002226 }
2227 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002228 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002229 cur < self->ob_size; cur++) {
2230 PyList_SET_ITEM(self, cur - slicelength,
2231 PyList_GET_ITEM(self, cur));
2232 }
2233 self->ob_size -= slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002234 it = self->ob_item;
2235 NRESIZE(it, PyObject*, self->ob_size);
2236 self->ob_item = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002237
2238 for (i = 0; i < slicelength; i++) {
2239 Py_DECREF(garbage[i]);
2240 }
2241 PyMem_FREE(garbage);
2242
2243 return 0;
2244 }
2245 else {
2246 /* assign slice */
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002247 PyObject **garbage, *ins, *seq;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002248 int cur, i;
2249
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002250 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002251 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002252 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002253 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002254 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002255 else {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002256 char msg[256];
2257 PyOS_snprintf(msg, sizeof(msg),
2258 "must assign sequence (not \"%.200s\") to extended slice",
2259 value->ob_type->tp_name);
2260 seq = PySequence_Fast(value, msg);
2261 if (!seq)
2262 return -1;
2263 }
2264
2265 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2266 PyErr_Format(PyExc_ValueError,
2267 "attempt to assign sequence of size %d to extended slice of size %d",
2268 PySequence_Fast_GET_SIZE(seq),
2269 slicelength);
2270 Py_DECREF(seq);
2271 return -1;
2272 }
2273
2274 if (!slicelength) {
2275 Py_DECREF(seq);
2276 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002277 }
2278
2279 garbage = (PyObject**)
2280 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002281
2282 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002283 cur += step, i++) {
2284 garbage[i] = PyList_GET_ITEM(self, cur);
Tim Peters3b01a122002-07-19 02:35:45 +00002285
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002286 ins = PySequence_Fast_GET_ITEM(seq, i);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002287 Py_INCREF(ins);
2288 PyList_SET_ITEM(self, cur, ins);
2289 }
2290
2291 for (i = 0; i < slicelength; i++) {
2292 Py_DECREF(garbage[i]);
2293 }
Tim Peters3b01a122002-07-19 02:35:45 +00002294
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002295 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002296 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002297
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002298 return 0;
2299 }
Tim Peters3b01a122002-07-19 02:35:45 +00002300 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002301 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002302 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002303 "list indices must be integers");
2304 return -1;
2305 }
2306}
2307
2308static PyMappingMethods list_as_mapping = {
2309 (inquiry)list_length,
2310 (binaryfunc)list_subscript,
2311 (objobjargproc)list_ass_subscript
2312};
2313
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002314PyTypeObject PyList_Type = {
2315 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002316 0,
2317 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002318 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002319 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002320 (destructor)list_dealloc, /* tp_dealloc */
2321 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002322 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002323 0, /* tp_setattr */
2324 0, /* tp_compare */
2325 (reprfunc)list_repr, /* tp_repr */
2326 0, /* tp_as_number */
2327 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002328 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002329 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002330 0, /* tp_call */
2331 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002332 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002333 0, /* tp_setattro */
2334 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002335 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002336 Py_TPFLAGS_BASETYPE, /* tp_flags */
2337 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002338 (traverseproc)list_traverse, /* tp_traverse */
2339 (inquiry)list_clear, /* tp_clear */
2340 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002341 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002342 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002343 0, /* tp_iternext */
2344 list_methods, /* tp_methods */
2345 0, /* tp_members */
2346 0, /* tp_getset */
2347 0, /* tp_base */
2348 0, /* tp_dict */
2349 0, /* tp_descr_get */
2350 0, /* tp_descr_set */
2351 0, /* tp_dictoffset */
2352 (initproc)list_init, /* tp_init */
2353 PyType_GenericAlloc, /* tp_alloc */
2354 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002355 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002356};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002357
2358
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002359/*********************** List Iterator **************************/
2360
2361typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002362 PyObject_HEAD
2363 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002364 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002365} listiterobject;
2366
2367PyTypeObject PyListIter_Type;
2368
Guido van Rossum5086e492002-07-16 15:56:52 +00002369static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002370list_iter(PyObject *seq)
2371{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002372 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002373
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002374 if (!PyList_Check(seq)) {
2375 PyErr_BadInternalCall();
2376 return NULL;
2377 }
Tim Peters2af713c2003-04-24 20:59:52 +00002378 if (seq->ob_type->tp_as_sequence->sq_item != (intargfunc)list_item)
Raymond Hettinger99285712003-04-24 16:52:47 +00002379 return PySeqIter_New(seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002380 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2381 if (it == NULL)
2382 return NULL;
2383 it->it_index = 0;
2384 Py_INCREF(seq);
2385 it->it_seq = (PyListObject *)seq;
2386 _PyObject_GC_TRACK(it);
2387 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002388}
2389
2390static void
2391listiter_dealloc(listiterobject *it)
2392{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002393 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002394 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002395 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002396}
2397
2398static int
2399listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2400{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002401 if (it->it_seq == NULL)
2402 return 0;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002403 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002404}
2405
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002406static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002407listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002408{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002409 PyListObject *seq;
2410 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002411
Tim Peters93b2cc42002-06-01 05:22:55 +00002412 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002413 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002414 if (seq == NULL)
2415 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002416 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002417
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002418 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002419 item = PyList_GET_ITEM(seq, it->it_index);
2420 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002421 Py_INCREF(item);
2422 return item;
2423 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002424
2425 Py_DECREF(seq);
2426 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002427 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002428}
2429
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002430PyTypeObject PyListIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002431 PyObject_HEAD_INIT(&PyType_Type)
2432 0, /* ob_size */
2433 "listiterator", /* tp_name */
2434 sizeof(listiterobject), /* tp_basicsize */
2435 0, /* tp_itemsize */
2436 /* methods */
2437 (destructor)listiter_dealloc, /* tp_dealloc */
2438 0, /* tp_print */
2439 0, /* tp_getattr */
2440 0, /* tp_setattr */
2441 0, /* tp_compare */
2442 0, /* tp_repr */
2443 0, /* tp_as_number */
2444 0, /* tp_as_sequence */
2445 0, /* tp_as_mapping */
2446 0, /* tp_hash */
2447 0, /* tp_call */
2448 0, /* tp_str */
2449 PyObject_GenericGetAttr, /* tp_getattro */
2450 0, /* tp_setattro */
2451 0, /* tp_as_buffer */
2452 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2453 0, /* tp_doc */
2454 (traverseproc)listiter_traverse, /* tp_traverse */
2455 0, /* tp_clear */
2456 0, /* tp_richcompare */
2457 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002458 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002459 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002460 0, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002461 0, /* tp_members */
2462 0, /* tp_getset */
2463 0, /* tp_base */
2464 0, /* tp_dict */
2465 0, /* tp_descr_get */
2466 0, /* tp_descr_set */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002467};