blob: 48f3d7d6ea01ef3fe423cdd3e26faea687911322 [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);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000476 if (v == NULL)
477 return -1;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000478 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000480 return ret;
481 }
482 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483 if (ilow < 0)
484 ilow = 0;
485 else if (ilow > a->ob_size)
486 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487 if (ihigh < ilow)
488 ihigh = ilow;
489 else if (ihigh > a->ob_size)
490 ihigh = a->ob_size;
491 item = a->ob_item;
492 d = n - (ihigh-ilow);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000493 if (ihigh > ilow) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000495 if (recycle == NULL) {
496 PyErr_NoMemory();
497 return -1;
498 }
499 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000500 else
501 p = recycle = NULL;
502 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000503 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000504 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000505 if (d < 0) {
506 for (/*k = ihigh*/; k < a->ob_size; k++)
507 item[k+d] = item[k];
508 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000510 a->ob_item = item;
511 }
512 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000513 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000515 if (item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000516 if (recycle != NULL)
517 PyMem_DEL(recycle);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000519 return -1;
520 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000521 for (k = a->ob_size; --k >= ihigh; )
522 item[k+d] = item[k];
523 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000524 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525 a->ob_item = item;
526 a->ob_size += d;
527 }
528 for (k = 0; k < n; k++, ilow++) {
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000529 PyObject *w = PySequence_Fast_GET_ITEM(v_as_SF, k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531 item[ilow] = w;
532 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000533 if (recycle) {
534 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 Py_XDECREF(*p);
536 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000537 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000538 if (a->ob_size == 0 && a->ob_item != NULL) {
539 PyMem_FREE(a->ob_item);
540 a->ob_item = NULL;
541 }
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000542 Py_XDECREF(v_as_SF);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543 return 0;
544#undef b
545}
546
Guido van Rossum234f9421993-06-17 12:35:49 +0000547int
Fred Drakea2f55112000-07-09 15:16:51 +0000548PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000549{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 if (!PyList_Check(a)) {
551 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000552 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000553 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000555}
556
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000557static PyObject *
558list_inplace_repeat(PyListObject *self, int n)
559{
560 PyObject **items;
561 int size, i, j;
562
563
564 size = PyList_GET_SIZE(self);
565 if (size == 0) {
566 Py_INCREF(self);
567 return (PyObject *)self;
568 }
569
570 items = self->ob_item;
571
572 if (n < 1) {
573 self->ob_item = NULL;
574 self->ob_size = 0;
575 for (i = 0; i < size; i++)
576 Py_XDECREF(items[i]);
577 PyMem_DEL(items);
578 Py_INCREF(self);
579 return (PyObject *)self;
580 }
581
582 NRESIZE(items, PyObject*, size*n);
583 if (items == NULL) {
584 PyErr_NoMemory();
585 goto finally;
586 }
587 self->ob_item = items;
588 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
589 for (j = 0; j < size; j++) {
590 PyObject *o = PyList_GET_ITEM(self, j);
591 Py_INCREF(o);
592 PyList_SET_ITEM(self, self->ob_size++, o);
593 }
594 }
595 Py_INCREF(self);
596 return (PyObject *)self;
597 finally:
598 return NULL;
599}
600
Guido van Rossum4a450d01991-04-03 19:05:18 +0000601static int
Fred Drakea2f55112000-07-09 15:16:51 +0000602list_ass_item(PyListObject *a, int i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000603{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000605 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 PyErr_SetString(PyExc_IndexError,
607 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000608 return -1;
609 }
610 if (v == NULL)
611 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000613 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000614 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000615 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000616 return 0;
617}
618
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000620ins(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000621{
622 if (ins1(self, where, v) != 0)
623 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 Py_INCREF(Py_None);
625 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000626}
627
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000629listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000630{
631 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000633 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000634 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000635 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000636}
637
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000639listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640{
Guido van Rossumbf80e541993-02-08 15:49:17 +0000641 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000642}
643
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000644static int
645listextend_internal(PyListObject *self, PyObject *b)
Barry Warsawdedf6d61998-10-09 16:37:25 +0000646{
Barry Warsawdedf6d61998-10-09 16:37:25 +0000647 PyObject **items;
648 int selflen = PyList_GET_SIZE(self);
649 int blen;
650 register int i;
651
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000652 if (PyObject_Size(b) == 0) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000653 /* short circuit when b is empty */
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000654 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000655 return 0;
Jeremy Hyltondb60bb52001-01-03 22:32:16 +0000656 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000657
Barry Warsawdedf6d61998-10-09 16:37:25 +0000658 if (self == (PyListObject*)b) {
659 /* as in list_ass_slice() we must special case the
660 * situation: a.extend(a)
661 *
662 * XXX: I think this way ought to be faster than using
663 * list_slice() the way list_ass_slice() does.
664 */
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000665 Py_DECREF(b);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000666 b = PyList_New(selflen);
667 if (!b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000668 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000669 for (i = 0; i < selflen; i++) {
670 PyObject *o = PyList_GET_ITEM(self, i);
671 Py_INCREF(o);
672 PyList_SET_ITEM(b, i, o);
673 }
674 }
Barry Warsawdedf6d61998-10-09 16:37:25 +0000675
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000676 blen = PyObject_Size(b);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000677
Barry Warsawdedf6d61998-10-09 16:37:25 +0000678 /* resize a using idiom */
679 items = self->ob_item;
680 NRESIZE(items, PyObject*, selflen + blen);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000681 if (items == NULL) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000682 PyErr_NoMemory();
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000683 Py_DECREF(b);
684 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000685 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000686
Barry Warsawdedf6d61998-10-09 16:37:25 +0000687 self->ob_item = items;
688
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000689 /* populate the end of self with b's items */
Barry Warsawdedf6d61998-10-09 16:37:25 +0000690 for (i = 0; i < blen; i++) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000691 PyObject *o = PySequence_Fast_GET_ITEM(b, i);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000692 Py_INCREF(o);
693 PyList_SET_ITEM(self, self->ob_size++, o);
694 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000695 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000696 return 0;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000697}
698
699
700static PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000701list_inplace_concat(PyListObject *self, PyObject *other)
702{
Tim Peters1af03e92001-05-26 19:37:54 +0000703 other = PySequence_Fast(other, "argument to += must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000704 if (!other)
705 return NULL;
706
707 if (listextend_internal(self, other) < 0)
708 return NULL;
709
710 Py_INCREF(self);
711 return (PyObject *)self;
712}
713
714static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000715listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000716{
717
Tim Peters1af03e92001-05-26 19:37:54 +0000718 b = PySequence_Fast(b, "list.extend() argument must be iterable");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719 if (!b)
720 return NULL;
721
722 if (listextend_internal(self, b) < 0)
723 return NULL;
724
725 Py_INCREF(Py_None);
726 return Py_None;
727}
728
729static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000730listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000731{
732 int i = -1;
733 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000734 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000735 return NULL;
736 if (self->ob_size == 0) {
737 /* Special-case most common failure cause */
738 PyErr_SetString(PyExc_IndexError, "pop from empty list");
739 return NULL;
740 }
741 if (i < 0)
742 i += self->ob_size;
743 if (i < 0 || i >= self->ob_size) {
744 PyErr_SetString(PyExc_IndexError, "pop index out of range");
745 return NULL;
746 }
747 v = self->ob_item[i];
748 Py_INCREF(v);
749 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
750 Py_DECREF(v);
751 return NULL;
752 }
753 return v;
754}
755
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000756/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
757static void
758reverse_slice(PyObject **lo, PyObject **hi)
759{
760 assert(lo && hi);
761
762 --hi;
763 while (lo < hi) {
764 PyObject *t = *lo;
765 *lo = *hi;
766 *hi = t;
767 ++lo;
768 --hi;
769 }
770}
771
Tim Petersa64dc242002-08-01 02:13:36 +0000772/* Lots of code for an adaptive, stable, natural mergesort. There are many
773 * pieces to this algorithm; read listsort.txt for overviews and details.
774 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000775
Guido van Rossum3f236de1996-12-10 23:55:39 +0000776/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000777 * comparison function (any callable Python object), which must not be
778 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
779 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000780 * Returns -1 on error, 1 if x < y, 0 if x >= y.
781 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000782static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000783islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000784{
Tim Petersf2a04732002-07-11 21:46:16 +0000785 PyObject *res;
786 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000787 int i;
788
Tim Peters66860f62002-08-04 17:47:26 +0000789 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000790 /* Call the user's comparison function and translate the 3-way
791 * result into true or false (or error).
792 */
Tim Petersf2a04732002-07-11 21:46:16 +0000793 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000794 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000795 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000796 Py_INCREF(x);
797 Py_INCREF(y);
798 PyTuple_SET_ITEM(args, 0, x);
799 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000800 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000802 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000803 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 if (!PyInt_Check(res)) {
805 Py_DECREF(res);
806 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000807 "comparison function must return int");
Tim Petersa8c974c2002-07-19 03:30:57 +0000808 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000809 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 i = PyInt_AsLong(res);
811 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000812 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000813}
814
Tim Peters66860f62002-08-04 17:47:26 +0000815/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
816 * islt. This avoids a layer of function call in the usual case, and
817 * sorting does many comparisons.
818 * Returns -1 on error, 1 if x < y, 0 if x >= y.
819 */
820#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
821 PyObject_RichCompareBool(X, Y, Py_LT) : \
822 islt(X, Y, COMPARE))
823
824/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000825 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
826 started. It makes more sense in context <wink>. X and Y are PyObject*s.
827*/
Tim Peters66860f62002-08-04 17:47:26 +0000828#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000829 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000830
831/* binarysort is the best method for sorting small arrays: it does
832 few compares, but can do data movement quadratic in the number of
833 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000834 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000835 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000836 On entry, must have lo <= start <= hi, and that [lo, start) is already
837 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000838 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000839 Even in case of error, the output slice will be some permutation of
840 the input (nothing is lost or duplicated).
841*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000842static int
Fred Drakea2f55112000-07-09 15:16:51 +0000843binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
844 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000845{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000846 register int k;
847 register PyObject **l, **p, **r;
848 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000849
Tim Petersa8c974c2002-07-19 03:30:57 +0000850 assert(lo <= start && start <= hi);
851 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000852 if (lo == start)
853 ++start;
854 for (; start < hi; ++start) {
855 /* set l to where *start belongs */
856 l = lo;
857 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000858 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +0000859 /* Invariants:
860 * pivot >= all in [lo, l).
861 * pivot < all in [r, start).
862 * The second is vacuously true at the start.
863 */
864 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000865 do {
866 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +0000867 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000868 r = p;
869 else
Tim Peters0fe977c2002-07-19 06:12:32 +0000870 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000871 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +0000872 assert(l == r);
873 /* The invariants still hold, so pivot >= all in [lo, l) and
874 pivot < all in [l, start), so pivot belongs at l. Note
875 that if there are elements equal to pivot, l points to the
876 first slot after them -- that's why this sort is stable.
877 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000878 Caution: using memmove is much slower under MSVC 5;
879 we're not usually moving many slots. */
880 for (p = start; p > l; --p)
881 *p = *(p-1);
882 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000883 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000884 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000885
886 fail:
887 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000888}
889
Tim Petersa64dc242002-08-01 02:13:36 +0000890/*
891Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
892is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000893
Tim Petersa64dc242002-08-01 02:13:36 +0000894 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000895
Tim Petersa64dc242002-08-01 02:13:36 +0000896or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000897
Tim Petersa64dc242002-08-01 02:13:36 +0000898 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +0000899
Tim Petersa64dc242002-08-01 02:13:36 +0000900Boolean *descending is set to 0 in the former case, or to 1 in the latter.
901For its intended use in a stable mergesort, the strictness of the defn of
902"descending" is needed so that the caller can safely reverse a descending
903sequence without violating stability (strict > ensures there are no equal
904elements to get out of order).
905
906Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000907*/
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000908static int
Tim Petersa64dc242002-08-01 02:13:36 +0000909count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000910{
Tim Petersa64dc242002-08-01 02:13:36 +0000911 int k;
912 int n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000913
Tim Petersa64dc242002-08-01 02:13:36 +0000914 assert(lo < hi);
915 *descending = 0;
916 ++lo;
917 if (lo == hi)
918 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000919
Tim Petersa64dc242002-08-01 02:13:36 +0000920 n = 2;
921 IFLT(*lo, *(lo-1)) {
922 *descending = 1;
923 for (lo = lo+1; lo < hi; ++lo, ++n) {
924 IFLT(*lo, *(lo-1))
925 ;
926 else
927 break;
928 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000929 }
Tim Petersa64dc242002-08-01 02:13:36 +0000930 else {
931 for (lo = lo+1; lo < hi; ++lo, ++n) {
932 IFLT(*lo, *(lo-1))
933 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000934 }
935 }
936
Tim Petersa64dc242002-08-01 02:13:36 +0000937 return n;
938fail:
939 return -1;
940}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000941
Tim Petersa64dc242002-08-01 02:13:36 +0000942/*
943Locate the proper position of key in a sorted vector; if the vector contains
944an element equal to key, return the position immediately to the left of
945the leftmost equal element. [gallop_right() does the same except returns
946the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000947
Tim Petersa64dc242002-08-01 02:13:36 +0000948"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000949
Tim Petersa64dc242002-08-01 02:13:36 +0000950"hint" is an index at which to begin the search, 0 <= hint < n. The closer
951hint is to the final result, the faster this runs.
952
953The return value is the int k in 0..n such that
954
955 a[k-1] < key <= a[k]
956
957pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
958key belongs at index k; or, IOW, the first k elements of a should precede
959key, and the last n-k should follow key.
960
961Returns -1 on error. See listsort.txt for info on the method.
962*/
963static int
964gallop_left(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
965{
966 int ofs;
967 int lastofs;
968 int k;
969
970 assert(key && a && n > 0 && hint >= 0 && hint < n);
971
972 a += hint;
973 lastofs = 0;
974 ofs = 1;
975 IFLT(*a, key) {
976 /* a[hint] < key -- gallop right, until
977 * a[hint + lastofs] < key <= a[hint + ofs]
978 */
979 const int maxofs = n - hint; /* &a[n-1] is highest */
980 while (ofs < maxofs) {
981 IFLT(a[ofs], key) {
982 lastofs = ofs;
983 ofs = (ofs << 1) + 1;
984 if (ofs <= 0) /* int overflow */
985 ofs = maxofs;
986 }
987 else /* key <= a[hint + ofs] */
988 break;
989 }
990 if (ofs > maxofs)
991 ofs = maxofs;
992 /* Translate back to offsets relative to &a[0]. */
993 lastofs += hint;
994 ofs += hint;
995 }
996 else {
997 /* key <= a[hint] -- gallop left, until
998 * a[hint - ofs] < key <= a[hint - lastofs]
999 */
1000 const int maxofs = hint + 1; /* &a[0] is lowest */
1001 while (ofs < maxofs) {
1002 IFLT(*(a-ofs), key)
1003 break;
1004 /* key <= a[hint - ofs] */
1005 lastofs = ofs;
1006 ofs = (ofs << 1) + 1;
1007 if (ofs <= 0) /* int overflow */
1008 ofs = maxofs;
1009 }
1010 if (ofs > maxofs)
1011 ofs = maxofs;
1012 /* Translate back to positive offsets relative to &a[0]. */
1013 k = lastofs;
1014 lastofs = hint - ofs;
1015 ofs = hint - k;
1016 }
1017 a -= hint;
1018
1019 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1020 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1021 * right of lastofs but no farther right than ofs. Do a binary
1022 * search, with invariant a[lastofs-1] < key <= a[ofs].
1023 */
1024 ++lastofs;
1025 while (lastofs < ofs) {
1026 int m = lastofs + ((ofs - lastofs) >> 1);
1027
1028 IFLT(a[m], key)
1029 lastofs = m+1; /* a[m] < key */
1030 else
1031 ofs = m; /* key <= a[m] */
1032 }
1033 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1034 return ofs;
1035
1036fail:
1037 return -1;
1038}
1039
1040/*
1041Exactly like gallop_left(), except that if key already exists in a[0:n],
1042finds the position immediately to the right of the rightmost equal value.
1043
1044The return value is the int k in 0..n such that
1045
1046 a[k-1] <= key < a[k]
1047
1048or -1 if error.
1049
1050The code duplication is massive, but this is enough different given that
1051we're sticking to "<" comparisons that it's much harder to follow if
1052written as one routine with yet another "left or right?" flag.
1053*/
1054static int
1055gallop_right(PyObject *key, PyObject **a, int n, int hint, PyObject *compare)
1056{
1057 int ofs;
1058 int lastofs;
1059 int k;
1060
1061 assert(key && a && n > 0 && hint >= 0 && hint < n);
1062
1063 a += hint;
1064 lastofs = 0;
1065 ofs = 1;
1066 IFLT(key, *a) {
1067 /* key < a[hint] -- gallop left, until
1068 * a[hint - ofs] <= key < a[hint - lastofs]
1069 */
1070 const int maxofs = hint + 1; /* &a[0] is lowest */
1071 while (ofs < maxofs) {
1072 IFLT(key, *(a-ofs)) {
1073 lastofs = ofs;
1074 ofs = (ofs << 1) + 1;
1075 if (ofs <= 0) /* int overflow */
1076 ofs = maxofs;
1077 }
1078 else /* a[hint - ofs] <= key */
1079 break;
1080 }
1081 if (ofs > maxofs)
1082 ofs = maxofs;
1083 /* Translate back to positive offsets relative to &a[0]. */
1084 k = lastofs;
1085 lastofs = hint - ofs;
1086 ofs = hint - k;
1087 }
1088 else {
1089 /* a[hint] <= key -- gallop right, until
1090 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001091 */
Tim Petersa64dc242002-08-01 02:13:36 +00001092 const int maxofs = n - hint; /* &a[n-1] is highest */
1093 while (ofs < maxofs) {
1094 IFLT(key, a[ofs])
1095 break;
1096 /* a[hint + ofs] <= key */
1097 lastofs = ofs;
1098 ofs = (ofs << 1) + 1;
1099 if (ofs <= 0) /* int overflow */
1100 ofs = maxofs;
1101 }
1102 if (ofs > maxofs)
1103 ofs = maxofs;
1104 /* Translate back to offsets relative to &a[0]. */
1105 lastofs += hint;
1106 ofs += hint;
1107 }
1108 a -= hint;
1109
1110 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1111 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1112 * right of lastofs but no farther right than ofs. Do a binary
1113 * search, with invariant a[lastofs-1] <= key < a[ofs].
1114 */
1115 ++lastofs;
1116 while (lastofs < ofs) {
1117 int m = lastofs + ((ofs - lastofs) >> 1);
1118
1119 IFLT(key, a[m])
1120 ofs = m; /* key < a[m] */
1121 else
1122 lastofs = m+1; /* a[m] <= key */
1123 }
1124 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1125 return ofs;
1126
1127fail:
1128 return -1;
1129}
1130
1131/* The maximum number of entries in a MergeState's pending-runs stack.
1132 * This is enough to sort arrays of size up to about
1133 * 32 * phi ** MAX_MERGE_PENDING
1134 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1135 * with 2**64 elements.
1136 */
1137#define MAX_MERGE_PENDING 85
1138
Tim Peterse05f65a2002-08-10 05:21:15 +00001139/* When we get into galloping mode, we stay there until both runs win less
1140 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001141 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001142#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001143
1144/* Avoid malloc for small temp arrays. */
1145#define MERGESTATE_TEMP_SIZE 256
1146
1147/* One MergeState exists on the stack per invocation of mergesort. It's just
1148 * a convenient way to pass state around among the helper functions.
1149 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001150struct s_slice {
1151 PyObject **base;
1152 int len;
1153};
1154
Tim Petersa64dc242002-08-01 02:13:36 +00001155typedef struct s_MergeState {
1156 /* The user-supplied comparison function. or NULL if none given. */
1157 PyObject *compare;
1158
Tim Peterse05f65a2002-08-10 05:21:15 +00001159 /* This controls when we get *into* galloping mode. It's initialized
1160 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1161 * random data, and lower for highly structured data.
1162 */
1163 int min_gallop;
1164
Tim Petersa64dc242002-08-01 02:13:36 +00001165 /* 'a' is temp storage to help with merges. It contains room for
1166 * alloced entries.
1167 */
1168 PyObject **a; /* may point to temparray below */
1169 int alloced;
1170
1171 /* A stack of n pending runs yet to be merged. Run #i starts at
1172 * address base[i] and extends for len[i] elements. It's always
1173 * true (so long as the indices are in bounds) that
1174 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001175 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001176 *
1177 * so we could cut the storage for this, but it's a minor amount,
1178 * and keeping all the info explicit simplifies the code.
1179 */
1180 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001181 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001182
1183 /* 'a' points to this when possible, rather than muck with malloc. */
1184 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1185} MergeState;
1186
1187/* Conceptually a MergeState's constructor. */
1188static void
1189merge_init(MergeState *ms, PyObject *compare)
1190{
1191 assert(ms != NULL);
1192 ms->compare = compare;
1193 ms->a = ms->temparray;
1194 ms->alloced = MERGESTATE_TEMP_SIZE;
1195 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001196 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001197}
1198
1199/* Free all the temp memory owned by the MergeState. This must be called
1200 * when you're done with a MergeState, and may be called before then if
1201 * you want to free the temp memory early.
1202 */
1203static void
1204merge_freemem(MergeState *ms)
1205{
1206 assert(ms != NULL);
1207 if (ms->a != ms->temparray)
1208 PyMem_Free(ms->a);
1209 ms->a = ms->temparray;
1210 ms->alloced = MERGESTATE_TEMP_SIZE;
1211}
1212
1213/* Ensure enough temp memory for 'need' array slots is available.
1214 * Returns 0 on success and -1 if the memory can't be gotten.
1215 */
1216static int
1217merge_getmem(MergeState *ms, int need)
1218{
1219 assert(ms != NULL);
1220 if (need <= ms->alloced)
1221 return 0;
1222 /* Don't realloc! That can cost cycles to copy the old data, but
1223 * we don't care what's in the block.
1224 */
1225 merge_freemem(ms);
1226 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1227 if (ms->a) {
1228 ms->alloced = need;
1229 return 0;
1230 }
1231 PyErr_NoMemory();
1232 merge_freemem(ms); /* reset to sane state */
1233 return -1;
1234}
1235#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1236 merge_getmem(MS, NEED))
1237
1238/* Merge the na elements starting at pa with the nb elements starting at pb
1239 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1240 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1241 * merge, and should have na <= nb. See listsort.txt for more info.
1242 * Return 0 if successful, -1 if error.
1243 */
1244static int
1245merge_lo(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1246{
1247 int k;
1248 PyObject *compare;
1249 PyObject **dest;
1250 int result = -1; /* guilty until proved innocent */
Tim Peterse05f65a2002-08-10 05:21:15 +00001251 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001252
1253 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1254 if (MERGE_GETMEM(ms, na) < 0)
1255 return -1;
1256 memcpy(ms->a, pa, na * sizeof(PyObject*));
1257 dest = pa;
1258 pa = ms->a;
1259
1260 *dest++ = *pb++;
1261 --nb;
1262 if (nb == 0)
1263 goto Succeed;
1264 if (na == 1)
1265 goto CopyB;
1266
1267 compare = ms->compare;
1268 for (;;) {
1269 int acount = 0; /* # of times A won in a row */
1270 int bcount = 0; /* # of times B won in a row */
1271
1272 /* Do the straightforward thing until (if ever) one run
1273 * appears to win consistently.
1274 */
1275 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001276 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001277 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001278 if (k) {
1279 if (k < 0)
1280 goto Fail;
1281 *dest++ = *pb++;
1282 ++bcount;
1283 acount = 0;
1284 --nb;
1285 if (nb == 0)
1286 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001287 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001288 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001289 }
1290 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001291 *dest++ = *pa++;
1292 ++acount;
1293 bcount = 0;
1294 --na;
1295 if (na == 1)
1296 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001297 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001298 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001299 }
Tim Petersa64dc242002-08-01 02:13:36 +00001300 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001301
Tim Petersa64dc242002-08-01 02:13:36 +00001302 /* One run is winning so consistently that galloping may
1303 * be a huge win. So try that, and continue galloping until
1304 * (if ever) neither run appears to be winning consistently
1305 * anymore.
1306 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001307 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001308 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001309 assert(na > 1 && nb > 0);
1310 min_gallop -= min_gallop > 1;
1311 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001312 k = gallop_right(*pb, pa, na, 0, compare);
1313 acount = k;
1314 if (k) {
1315 if (k < 0)
1316 goto Fail;
1317 memcpy(dest, pa, k * sizeof(PyObject *));
1318 dest += k;
1319 pa += k;
1320 na -= k;
1321 if (na == 1)
1322 goto CopyB;
1323 /* na==0 is impossible now if the comparison
1324 * function is consistent, but we can't assume
1325 * that it is.
1326 */
1327 if (na == 0)
1328 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001329 }
Tim Petersa64dc242002-08-01 02:13:36 +00001330 *dest++ = *pb++;
1331 --nb;
1332 if (nb == 0)
1333 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001334
Tim Petersa64dc242002-08-01 02:13:36 +00001335 k = gallop_left(*pa, pb, nb, 0, compare);
1336 bcount = k;
1337 if (k) {
1338 if (k < 0)
1339 goto Fail;
1340 memmove(dest, pb, k * sizeof(PyObject *));
1341 dest += k;
1342 pb += k;
1343 nb -= k;
1344 if (nb == 0)
1345 goto Succeed;
1346 }
1347 *dest++ = *pa++;
1348 --na;
1349 if (na == 1)
1350 goto CopyB;
1351 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001352 ++min_gallop; /* penalize it for leaving galloping mode */
1353 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001354 }
1355Succeed:
1356 result = 0;
1357Fail:
1358 if (na)
1359 memcpy(dest, pa, na * sizeof(PyObject*));
1360 return result;
1361CopyB:
1362 assert(na == 1 && nb > 0);
1363 /* The last element of pa belongs at the end of the merge. */
1364 memmove(dest, pb, nb * sizeof(PyObject *));
1365 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001366 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001367}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001368
Tim Petersa64dc242002-08-01 02:13:36 +00001369/* Merge the na elements starting at pa with the nb elements starting at pb
1370 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1371 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1372 * merge, and should have na >= nb. See listsort.txt for more info.
1373 * Return 0 if successful, -1 if error.
1374 */
1375static int
1376merge_hi(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb)
1377{
1378 int k;
1379 PyObject *compare;
1380 PyObject **dest;
1381 int result = -1; /* guilty until proved innocent */
1382 PyObject **basea;
1383 PyObject **baseb;
Tim Peterse05f65a2002-08-10 05:21:15 +00001384 int min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001385
1386 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1387 if (MERGE_GETMEM(ms, nb) < 0)
1388 return -1;
1389 dest = pb + nb - 1;
1390 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1391 basea = pa;
1392 baseb = ms->a;
1393 pb = ms->a + nb - 1;
1394 pa += na - 1;
1395
1396 *dest-- = *pa--;
1397 --na;
1398 if (na == 0)
1399 goto Succeed;
1400 if (nb == 1)
1401 goto CopyA;
1402
1403 compare = ms->compare;
1404 for (;;) {
1405 int acount = 0; /* # of times A won in a row */
1406 int bcount = 0; /* # of times B won in a row */
1407
1408 /* Do the straightforward thing until (if ever) one run
1409 * appears to win consistently.
1410 */
1411 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001412 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001413 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001414 if (k) {
1415 if (k < 0)
1416 goto Fail;
1417 *dest-- = *pa--;
1418 ++acount;
1419 bcount = 0;
1420 --na;
1421 if (na == 0)
1422 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001423 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001424 break;
1425 }
1426 else {
1427 *dest-- = *pb--;
1428 ++bcount;
1429 acount = 0;
1430 --nb;
1431 if (nb == 1)
1432 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001433 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001434 break;
1435 }
1436 }
1437
1438 /* One run is winning so consistently that galloping may
1439 * be a huge win. So try that, and continue galloping until
1440 * (if ever) neither run appears to be winning consistently
1441 * anymore.
1442 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001443 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001444 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001445 assert(na > 0 && nb > 1);
1446 min_gallop -= min_gallop > 1;
1447 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001448 k = gallop_right(*pb, basea, na, na-1, compare);
1449 if (k < 0)
1450 goto Fail;
1451 k = na - k;
1452 acount = k;
1453 if (k) {
1454 dest -= k;
1455 pa -= k;
1456 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1457 na -= k;
1458 if (na == 0)
1459 goto Succeed;
1460 }
1461 *dest-- = *pb--;
1462 --nb;
1463 if (nb == 1)
1464 goto CopyA;
1465
1466 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1467 if (k < 0)
1468 goto Fail;
1469 k = nb - k;
1470 bcount = k;
1471 if (k) {
1472 dest -= k;
1473 pb -= k;
1474 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1475 nb -= k;
1476 if (nb == 1)
1477 goto CopyA;
1478 /* nb==0 is impossible now if the comparison
1479 * function is consistent, but we can't assume
1480 * that it is.
1481 */
1482 if (nb == 0)
1483 goto Succeed;
1484 }
1485 *dest-- = *pa--;
1486 --na;
1487 if (na == 0)
1488 goto Succeed;
1489 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001490 ++min_gallop; /* penalize it for leaving galloping mode */
1491 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001492 }
1493Succeed:
1494 result = 0;
1495Fail:
1496 if (nb)
1497 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1498 return result;
1499CopyA:
1500 assert(nb == 1 && na > 0);
1501 /* The first element of pb belongs at the front of the merge. */
1502 dest -= na;
1503 pa -= na;
1504 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1505 *dest = *pb;
1506 return 0;
1507}
1508
1509/* Merge the two runs at stack indices i and i+1.
1510 * Returns 0 on success, -1 on error.
1511 */
1512static int
1513merge_at(MergeState *ms, int i)
1514{
1515 PyObject **pa, **pb;
1516 int na, nb;
1517 int k;
1518 PyObject *compare;
1519
1520 assert(ms != NULL);
1521 assert(ms->n >= 2);
1522 assert(i >= 0);
1523 assert(i == ms->n - 2 || i == ms->n - 3);
1524
Tim Peterse05f65a2002-08-10 05:21:15 +00001525 pa = ms->pending[i].base;
1526 na = ms->pending[i].len;
1527 pb = ms->pending[i+1].base;
1528 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001529 assert(na > 0 && nb > 0);
1530 assert(pa + na == pb);
1531
1532 /* Record the length of the combined runs; if i is the 3rd-last
1533 * run now, also slide over the last run (which isn't involved
1534 * in this merge). The current run i+1 goes away in any case.
1535 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001536 ms->pending[i].len = na + nb;
1537 if (i == ms->n - 3)
1538 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001539 --ms->n;
1540
1541 /* Where does b start in a? Elements in a before that can be
1542 * ignored (already in place).
1543 */
1544 compare = ms->compare;
1545 k = gallop_right(*pb, pa, na, 0, compare);
1546 if (k < 0)
1547 return -1;
1548 pa += k;
1549 na -= k;
1550 if (na == 0)
1551 return 0;
1552
1553 /* Where does a end in b? Elements in b after that can be
1554 * ignored (already in place).
1555 */
1556 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1557 if (nb <= 0)
1558 return nb;
1559
1560 /* Merge what remains of the runs, using a temp array with
1561 * min(na, nb) elements.
1562 */
1563 if (na <= nb)
1564 return merge_lo(ms, pa, na, pb, nb);
1565 else
1566 return merge_hi(ms, pa, na, pb, nb);
1567}
1568
1569/* Examine the stack of runs waiting to be merged, merging adjacent runs
1570 * until the stack invariants are re-established:
1571 *
1572 * 1. len[-3] > len[-2] + len[-1]
1573 * 2. len[-2] > len[-1]
1574 *
1575 * See listsort.txt for more info.
1576 *
1577 * Returns 0 on success, -1 on error.
1578 */
1579static int
1580merge_collapse(MergeState *ms)
1581{
Tim Peterse05f65a2002-08-10 05:21:15 +00001582 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001583
1584 assert(ms);
1585 while (ms->n > 1) {
1586 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001587 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1588 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001589 --n;
1590 if (merge_at(ms, n) < 0)
1591 return -1;
1592 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001593 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001594 if (merge_at(ms, n) < 0)
1595 return -1;
1596 }
1597 else
1598 break;
1599 }
1600 return 0;
1601}
1602
1603/* Regardless of invariants, merge all runs on the stack until only one
1604 * remains. This is used at the end of the mergesort.
1605 *
1606 * Returns 0 on success, -1 on error.
1607 */
1608static int
1609merge_force_collapse(MergeState *ms)
1610{
Tim Peterse05f65a2002-08-10 05:21:15 +00001611 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001612
1613 assert(ms);
1614 while (ms->n > 1) {
1615 int n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001616 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001617 --n;
1618 if (merge_at(ms, n) < 0)
1619 return -1;
1620 }
1621 return 0;
1622}
1623
1624/* Compute a good value for the minimum run length; natural runs shorter
1625 * than this are boosted artificially via binary insertion.
1626 *
1627 * If n < 64, return n (it's too small to bother with fancy stuff).
1628 * Else if n is an exact power of 2, return 32.
1629 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1630 * strictly less than, an exact power of 2.
1631 *
1632 * See listsort.txt for more info.
1633 */
1634static int
1635merge_compute_minrun(int n)
1636{
1637 int r = 0; /* becomes 1 if any 1 bits are shifted off */
1638
1639 assert(n >= 0);
1640 while (n >= 64) {
1641 r |= n & 1;
1642 n >>= 1;
1643 }
1644 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001645}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001646
Tim Petersa64dc242002-08-01 02:13:36 +00001647/* An adaptive, stable, natural mergesort. See listsort.txt.
1648 * Returns Py_None on success, NULL on error. Even in case of error, the
1649 * list will be some permutation of its input state (nothing is lost or
1650 * duplicated).
1651 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001653listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001654{
Tim Petersa64dc242002-08-01 02:13:36 +00001655 MergeState ms;
1656 PyObject **lo, **hi;
1657 int nremaining;
1658 int minrun;
Tim Petersb9099c32002-11-12 22:08:10 +00001659 int saved_ob_size;
1660 PyObject **saved_ob_item;
1661 PyObject **empty_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001662 PyObject *compare = NULL;
1663 PyObject *result = NULL; /* guilty until proved innocent */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001664
Tim Petersa64dc242002-08-01 02:13:36 +00001665 assert(self != NULL);
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001666 if (args != NULL) {
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001667 if (!PyArg_UnpackTuple(args, "sort", 0, 1, &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001668 return NULL;
1669 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00001670 if (compare == Py_None)
1671 compare = NULL;
1672
Tim Petersa64dc242002-08-01 02:13:36 +00001673 merge_init(&ms, compare);
Tim Peters330f9e92002-07-19 07:05:44 +00001674
Tim Petersb9099c32002-11-12 22:08:10 +00001675 /* The list is temporarily made empty, so that mutations performed
1676 * by comparison functions can't affect the slice of memory we're
1677 * sorting (allowing mutations during sorting is a core-dump
1678 * factory, since ob_item may change).
1679 */
1680 saved_ob_size = self->ob_size;
1681 saved_ob_item = self->ob_item;
1682 self->ob_size = 0;
1683 self->ob_item = empty_ob_item = PyMem_NEW(PyObject *, 0);
Tim Peters330f9e92002-07-19 07:05:44 +00001684
Tim Petersb9099c32002-11-12 22:08:10 +00001685 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00001686 if (nremaining < 2)
1687 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00001688
Tim Petersa64dc242002-08-01 02:13:36 +00001689 /* March over the array once, left to right, finding natural runs,
1690 * and extending short natural runs to minrun elements.
1691 */
Tim Petersb9099c32002-11-12 22:08:10 +00001692 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001693 hi = lo + nremaining;
1694 minrun = merge_compute_minrun(nremaining);
1695 do {
1696 int descending;
1697 int n;
Tim Peters330f9e92002-07-19 07:05:44 +00001698
Tim Petersa64dc242002-08-01 02:13:36 +00001699 /* Identify next run. */
1700 n = count_run(lo, hi, compare, &descending);
1701 if (n < 0)
1702 goto fail;
1703 if (descending)
1704 reverse_slice(lo, lo + n);
1705 /* If short, extend to min(minrun, nremaining). */
1706 if (n < minrun) {
1707 const int force = nremaining <= minrun ?
1708 nremaining : minrun;
1709 if (binarysort(lo, lo + force, lo + n, compare) < 0)
1710 goto fail;
1711 n = force;
1712 }
1713 /* Push run onto pending-runs stack, and maybe merge. */
1714 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00001715 ms.pending[ms.n].base = lo;
1716 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00001717 ++ms.n;
1718 if (merge_collapse(&ms) < 0)
1719 goto fail;
1720 /* Advance to find next run. */
1721 lo += n;
1722 nremaining -= n;
1723 } while (nremaining);
1724 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00001725
Tim Petersa64dc242002-08-01 02:13:36 +00001726 if (merge_force_collapse(&ms) < 0)
1727 goto fail;
1728 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00001729 assert(ms.pending[0].base == saved_ob_item);
1730 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00001731
1732succeed:
1733 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00001734fail:
Tim Petersb9099c32002-11-12 22:08:10 +00001735 if (self->ob_item != empty_ob_item || self->ob_size) {
1736 /* The user mucked with the list during the sort. */
1737 (void)list_ass_slice(self, 0, self->ob_size, (PyObject *)NULL);
1738 if (result != NULL) {
1739 PyErr_SetString(PyExc_ValueError,
1740 "list modified during sort");
1741 result = NULL;
1742 }
1743 }
1744 if (self->ob_item == empty_ob_item)
1745 PyMem_FREE(empty_ob_item);
1746 self->ob_size = saved_ob_size;
1747 self->ob_item = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001748 merge_freemem(&ms);
1749 Py_XINCREF(result);
1750 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001751}
Tim Peters330f9e92002-07-19 07:05:44 +00001752#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00001753#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00001754
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001755int
Fred Drakea2f55112000-07-09 15:16:51 +00001756PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001757{
1758 if (v == NULL || !PyList_Check(v)) {
1759 PyErr_BadInternalCall();
1760 return -1;
1761 }
1762 v = listsort((PyListObject *)v, (PyObject *)NULL);
1763 if (v == NULL)
1764 return -1;
1765 Py_DECREF(v);
1766 return 0;
1767}
1768
Guido van Rossumb86c5492001-02-12 22:06:02 +00001769static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001770listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00001771{
Tim Peters326b4482002-07-19 04:04:16 +00001772 if (self->ob_size > 1)
1773 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001774 Py_INCREF(Py_None);
1775 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001776}
1777
Guido van Rossum84c76f51990-10-30 13:32:20 +00001778int
Fred Drakea2f55112000-07-09 15:16:51 +00001779PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001780{
Tim Peters6063e262002-08-08 01:06:39 +00001781 PyListObject *self = (PyListObject *)v;
1782
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783 if (v == NULL || !PyList_Check(v)) {
1784 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001785 return -1;
1786 }
Tim Peters6063e262002-08-08 01:06:39 +00001787 if (self->ob_size > 1)
1788 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001789 return 0;
1790}
1791
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001792PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001793PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001794{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001795 PyObject *w;
1796 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001797 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001798 if (v == NULL || !PyList_Check(v)) {
1799 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001800 return NULL;
1801 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802 n = ((PyListObject *)v)->ob_size;
1803 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001804 if (w == NULL)
1805 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001807 memcpy((void *)p,
1808 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001809 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001810 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001811 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001812 p++;
1813 }
1814 return w;
1815}
1816
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001817static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001818listindex(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001819{
1820 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001821
Guido van Rossumed98d481991-03-06 13:07:53 +00001822 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001823 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1824 if (cmp > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001825 return PyInt_FromLong((long)i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001826 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001827 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001828 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001829 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001830 return NULL;
1831}
1832
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001833static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001834listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001835{
1836 int count = 0;
1837 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001838
Guido van Rossume6f7d181991-10-20 20:20:40 +00001839 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001840 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1841 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001842 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001843 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001844 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001845 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001846 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001847}
1848
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001849static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001850listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00001851{
1852 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001853
Guido van Rossumed98d481991-03-06 13:07:53 +00001854 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001855 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
1856 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001857 if (list_ass_slice(self, i, i+1,
1858 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001859 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001860 Py_INCREF(Py_None);
1861 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001862 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001863 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001864 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001865 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001866 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001867 return NULL;
1868}
1869
Jeremy Hylton8caad492000-06-23 14:18:11 +00001870static int
1871list_traverse(PyListObject *o, visitproc visit, void *arg)
1872{
1873 int i, err;
1874 PyObject *x;
1875
1876 for (i = o->ob_size; --i >= 0; ) {
1877 x = o->ob_item[i];
1878 if (x != NULL) {
1879 err = visit(x, arg);
1880 if (err)
1881 return err;
1882 }
1883 }
1884 return 0;
1885}
1886
1887static int
1888list_clear(PyListObject *lp)
1889{
1890 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1891 return 0;
1892}
1893
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001894static PyObject *
1895list_richcompare(PyObject *v, PyObject *w, int op)
1896{
1897 PyListObject *vl, *wl;
1898 int i;
1899
1900 if (!PyList_Check(v) || !PyList_Check(w)) {
1901 Py_INCREF(Py_NotImplemented);
1902 return Py_NotImplemented;
1903 }
1904
1905 vl = (PyListObject *)v;
1906 wl = (PyListObject *)w;
1907
1908 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
1909 /* Shortcut: if the lengths differ, the lists differ */
1910 PyObject *res;
1911 if (op == Py_EQ)
1912 res = Py_False;
1913 else
1914 res = Py_True;
1915 Py_INCREF(res);
1916 return res;
1917 }
1918
1919 /* Search for the first index where items are different */
1920 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
1921 int k = PyObject_RichCompareBool(vl->ob_item[i],
1922 wl->ob_item[i], Py_EQ);
1923 if (k < 0)
1924 return NULL;
1925 if (!k)
1926 break;
1927 }
1928
1929 if (i >= vl->ob_size || i >= wl->ob_size) {
1930 /* No more items to compare -- compare sizes */
1931 int vs = vl->ob_size;
1932 int ws = wl->ob_size;
1933 int cmp;
1934 PyObject *res;
1935 switch (op) {
1936 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00001937 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00001938 case Py_EQ: cmp = vs == ws; break;
1939 case Py_NE: cmp = vs != ws; break;
1940 case Py_GT: cmp = vs > ws; break;
1941 case Py_GE: cmp = vs >= ws; break;
1942 default: return NULL; /* cannot happen */
1943 }
1944 if (cmp)
1945 res = Py_True;
1946 else
1947 res = Py_False;
1948 Py_INCREF(res);
1949 return res;
1950 }
1951
1952 /* We have an item that differs -- shortcuts for EQ/NE */
1953 if (op == Py_EQ) {
1954 Py_INCREF(Py_False);
1955 return Py_False;
1956 }
1957 if (op == Py_NE) {
1958 Py_INCREF(Py_True);
1959 return Py_True;
1960 }
1961
1962 /* Compare the final item again using the proper operator */
1963 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
1964}
1965
Tim Peters6d6c1a32001-08-02 04:15:00 +00001966/* Adapted from newer code by Tim */
1967static int
1968list_fill(PyListObject *result, PyObject *v)
1969{
1970 PyObject *it; /* iter(v) */
1971 int n; /* guess for result list size */
1972 int i;
1973
1974 n = result->ob_size;
1975
1976 /* Special-case list(a_list), for speed. */
1977 if (PyList_Check(v)) {
1978 if (v == (PyObject *)result)
1979 return 0; /* source is destination, we're done */
1980 return list_ass_slice(result, 0, n, v);
1981 }
1982
1983 /* Empty previous contents */
1984 if (n != 0) {
1985 if (list_ass_slice(result, 0, n, (PyObject *)NULL) != 0)
1986 return -1;
1987 }
1988
1989 /* Get iterator. There may be some low-level efficiency to be gained
1990 * by caching the tp_iternext slot instead of using PyIter_Next()
1991 * later, but premature optimization is the root etc.
1992 */
1993 it = PyObject_GetIter(v);
1994 if (it == NULL)
1995 return -1;
1996
1997 /* Guess a result list size. */
1998 n = -1; /* unknown */
1999 if (PySequence_Check(v) &&
2000 v->ob_type->tp_as_sequence->sq_length) {
2001 n = PySequence_Size(v);
2002 if (n < 0)
2003 PyErr_Clear();
2004 }
2005 if (n < 0)
2006 n = 8; /* arbitrary */
2007 NRESIZE(result->ob_item, PyObject*, n);
Neal Norwitzd4e5be52002-05-22 23:19:17 +00002008 if (result->ob_item == NULL) {
2009 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002010 goto error;
Neal Norwitzd4e5be52002-05-22 23:19:17 +00002011 }
Neal Norwitz35fc7602002-06-13 21:11:11 +00002012 memset(result->ob_item, 0, sizeof(*result->ob_item) * n);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002013 result->ob_size = n;
2014
2015 /* Run iterator to exhaustion. */
2016 for (i = 0; ; i++) {
2017 PyObject *item = PyIter_Next(it);
2018 if (item == NULL) {
2019 if (PyErr_Occurred())
2020 goto error;
2021 break;
2022 }
2023 if (i < n)
2024 PyList_SET_ITEM(result, i, item); /* steals ref */
2025 else {
2026 int status = ins1(result, result->ob_size, item);
2027 Py_DECREF(item); /* append creates a new ref */
2028 if (status < 0)
2029 goto error;
2030 }
2031 }
2032
2033 /* Cut back result list if initial guess was too large. */
2034 if (i < n && result != NULL) {
2035 if (list_ass_slice(result, i, n, (PyObject *)NULL) != 0)
2036 goto error;
2037 }
2038 Py_DECREF(it);
2039 return 0;
2040
2041 error:
2042 Py_DECREF(it);
2043 return -1;
2044}
2045
2046static int
2047list_init(PyListObject *self, PyObject *args, PyObject *kw)
2048{
2049 PyObject *arg = NULL;
2050 static char *kwlist[] = {"sequence", 0};
2051
2052 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2053 return -1;
2054 if (arg != NULL)
2055 return list_fill(self, arg);
2056 if (self->ob_size > 0)
2057 return list_ass_slice(self, 0, self->ob_size, (PyObject*)NULL);
2058 return 0;
2059}
2060
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002061static long
2062list_nohash(PyObject *self)
2063{
2064 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2065 return -1;
2066}
2067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002068PyDoc_STRVAR(append_doc,
2069"L.append(object) -- append object to end");
2070PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002071"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002072PyDoc_STRVAR(insert_doc,
2073"L.insert(index, object) -- insert object before index");
2074PyDoc_STRVAR(pop_doc,
2075"L.pop([index]) -> item -- remove and return item at index (default last)");
2076PyDoc_STRVAR(remove_doc,
2077"L.remove(value) -- remove first occurrence of value");
2078PyDoc_STRVAR(index_doc,
2079"L.index(value) -> integer -- return index of first occurrence of value");
2080PyDoc_STRVAR(count_doc,
2081"L.count(value) -> integer -- return number of occurrences of value");
2082PyDoc_STRVAR(reverse_doc,
2083"L.reverse() -- reverse *IN PLACE*");
2084PyDoc_STRVAR(sort_doc,
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002085"L.sort(cmpfunc=None) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002086
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002087static PyMethodDef list_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002088 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002089 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002090 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002091 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002092 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2093 {"index", (PyCFunction)listindex, METH_O, index_doc},
2094 {"count", (PyCFunction)listcount, METH_O, count_doc},
2095 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002096 {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002097 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002098};
2099
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002100static PySequenceMethods list_as_sequence = {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002101 (inquiry)list_length, /* sq_length */
2102 (binaryfunc)list_concat, /* sq_concat */
2103 (intargfunc)list_repeat, /* sq_repeat */
2104 (intargfunc)list_item, /* sq_item */
2105 (intintargfunc)list_slice, /* sq_slice */
2106 (intobjargproc)list_ass_item, /* sq_ass_item */
2107 (intintobjargproc)list_ass_slice, /* sq_ass_slice */
2108 (objobjproc)list_contains, /* sq_contains */
2109 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2110 (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002111};
2112
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002113PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002114"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002115"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002116
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002117static PyObject *list_iter(PyObject *seq);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002118
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002119static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002120list_subscript(PyListObject* self, PyObject* item)
2121{
2122 if (PyInt_Check(item)) {
2123 long i = PyInt_AS_LONG(item);
2124 if (i < 0)
2125 i += PyList_GET_SIZE(self);
2126 return list_item(self, i);
2127 }
2128 else if (PyLong_Check(item)) {
2129 long i = PyLong_AsLong(item);
2130 if (i == -1 && PyErr_Occurred())
2131 return NULL;
2132 if (i < 0)
2133 i += PyList_GET_SIZE(self);
2134 return list_item(self, i);
2135 }
2136 else if (PySlice_Check(item)) {
2137 int start, stop, step, slicelength, cur, i;
2138 PyObject* result;
2139 PyObject* it;
2140
2141 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2142 &start, &stop, &step, &slicelength) < 0) {
2143 return NULL;
2144 }
2145
2146 if (slicelength <= 0) {
2147 return PyList_New(0);
2148 }
2149 else {
2150 result = PyList_New(slicelength);
2151 if (!result) return NULL;
2152
Tim Peters3b01a122002-07-19 02:35:45 +00002153 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002154 cur += step, i++) {
2155 it = PyList_GET_ITEM(self, cur);
2156 Py_INCREF(it);
2157 PyList_SET_ITEM(result, i, it);
2158 }
Tim Peters3b01a122002-07-19 02:35:45 +00002159
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002160 return result;
2161 }
2162 }
2163 else {
2164 PyErr_SetString(PyExc_TypeError,
2165 "list indices must be integers");
2166 return NULL;
2167 }
2168}
2169
Tim Peters3b01a122002-07-19 02:35:45 +00002170static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002171list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2172{
2173 if (PyInt_Check(item)) {
2174 long i = PyInt_AS_LONG(item);
2175 if (i < 0)
2176 i += PyList_GET_SIZE(self);
2177 return list_ass_item(self, i, value);
2178 }
2179 else if (PyLong_Check(item)) {
2180 long i = PyLong_AsLong(item);
2181 if (i == -1 && PyErr_Occurred())
2182 return -1;
2183 if (i < 0)
2184 i += PyList_GET_SIZE(self);
2185 return list_ass_item(self, i, value);
2186 }
2187 else if (PySlice_Check(item)) {
2188 int start, stop, step, slicelength;
2189
2190 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2191 &start, &stop, &step, &slicelength) < 0) {
2192 return -1;
2193 }
2194
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002195 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2196 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2197 return list_ass_slice(self, start, stop, value);
2198
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002199 if (value == NULL) {
2200 /* delete slice */
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002201 PyObject **garbage, **it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002202 int cur, i, j;
Tim Peters3b01a122002-07-19 02:35:45 +00002203
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002204 if (slicelength <= 0)
2205 return 0;
2206
2207 if (step < 0) {
2208 stop = start + 1;
2209 start = stop + step*(slicelength - 1) - 1;
2210 step = -step;
2211 }
2212
2213 garbage = (PyObject**)
2214 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002215
2216 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002217 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002218 for (cur = start, i = 0;
2219 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002220 cur += step, i++) {
2221 int lim = step;
2222
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002223 garbage[i] = PyList_GET_ITEM(self, cur);
2224
Michael W. Hudson56796f62002-07-29 14:35:04 +00002225 if (cur + step >= self->ob_size) {
2226 lim = self->ob_size - cur - 1;
2227 }
2228
2229 for (j = 0; j < lim; j++) {
Tim Peters3b01a122002-07-19 02:35:45 +00002230 PyList_SET_ITEM(self, cur + j - i,
Guido van Rossum75a20b12002-06-11 12:22:28 +00002231 PyList_GET_ITEM(self,
2232 cur + j + 1));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002233 }
2234 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002235 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002236 cur < self->ob_size; cur++) {
2237 PyList_SET_ITEM(self, cur - slicelength,
2238 PyList_GET_ITEM(self, cur));
2239 }
2240 self->ob_size -= slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002241 it = self->ob_item;
2242 NRESIZE(it, PyObject*, self->ob_size);
2243 self->ob_item = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002244
2245 for (i = 0; i < slicelength; i++) {
2246 Py_DECREF(garbage[i]);
2247 }
2248 PyMem_FREE(garbage);
2249
2250 return 0;
2251 }
2252 else {
2253 /* assign slice */
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002254 PyObject **garbage, *ins, *seq;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002255 int cur, i;
2256
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002257 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002258 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002259 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002260 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002261 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002262 else {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002263 char msg[256];
2264 PyOS_snprintf(msg, sizeof(msg),
2265 "must assign sequence (not \"%.200s\") to extended slice",
2266 value->ob_type->tp_name);
2267 seq = PySequence_Fast(value, msg);
2268 if (!seq)
2269 return -1;
2270 }
2271
2272 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2273 PyErr_Format(PyExc_ValueError,
2274 "attempt to assign sequence of size %d to extended slice of size %d",
2275 PySequence_Fast_GET_SIZE(seq),
2276 slicelength);
2277 Py_DECREF(seq);
2278 return -1;
2279 }
2280
2281 if (!slicelength) {
2282 Py_DECREF(seq);
2283 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002284 }
2285
2286 garbage = (PyObject**)
2287 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002288
2289 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002290 cur += step, i++) {
2291 garbage[i] = PyList_GET_ITEM(self, cur);
Tim Peters3b01a122002-07-19 02:35:45 +00002292
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002293 ins = PySequence_Fast_GET_ITEM(seq, i);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002294 Py_INCREF(ins);
2295 PyList_SET_ITEM(self, cur, ins);
2296 }
2297
2298 for (i = 0; i < slicelength; i++) {
2299 Py_DECREF(garbage[i]);
2300 }
Tim Peters3b01a122002-07-19 02:35:45 +00002301
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002302 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002303 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002304
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002305 return 0;
2306 }
Tim Peters3b01a122002-07-19 02:35:45 +00002307 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002308 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002309 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002310 "list indices must be integers");
2311 return -1;
2312 }
2313}
2314
2315static PyMappingMethods list_as_mapping = {
2316 (inquiry)list_length,
2317 (binaryfunc)list_subscript,
2318 (objobjargproc)list_ass_subscript
2319};
2320
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002321PyTypeObject PyList_Type = {
2322 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002323 0,
2324 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002325 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002326 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002327 (destructor)list_dealloc, /* tp_dealloc */
2328 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002329 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002330 0, /* tp_setattr */
2331 0, /* tp_compare */
2332 (reprfunc)list_repr, /* tp_repr */
2333 0, /* tp_as_number */
2334 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002335 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002336 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002337 0, /* tp_call */
2338 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002339 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002340 0, /* tp_setattro */
2341 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002342 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002343 Py_TPFLAGS_BASETYPE, /* tp_flags */
2344 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002345 (traverseproc)list_traverse, /* tp_traverse */
2346 (inquiry)list_clear, /* tp_clear */
2347 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002348 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002349 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002350 0, /* tp_iternext */
2351 list_methods, /* tp_methods */
2352 0, /* tp_members */
2353 0, /* tp_getset */
2354 0, /* tp_base */
2355 0, /* tp_dict */
2356 0, /* tp_descr_get */
2357 0, /* tp_descr_set */
2358 0, /* tp_dictoffset */
2359 (initproc)list_init, /* tp_init */
2360 PyType_GenericAlloc, /* tp_alloc */
2361 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002362 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002363};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002364
2365
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002366/*********************** List Iterator **************************/
2367
2368typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002369 PyObject_HEAD
2370 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002371 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002372} listiterobject;
2373
2374PyTypeObject PyListIter_Type;
2375
Guido van Rossum5086e492002-07-16 15:56:52 +00002376static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002377list_iter(PyObject *seq)
2378{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002379 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002380
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002381 if (!PyList_Check(seq)) {
2382 PyErr_BadInternalCall();
2383 return NULL;
2384 }
2385 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2386 if (it == NULL)
2387 return NULL;
2388 it->it_index = 0;
2389 Py_INCREF(seq);
2390 it->it_seq = (PyListObject *)seq;
2391 _PyObject_GC_TRACK(it);
2392 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002393}
2394
2395static void
2396listiter_dealloc(listiterobject *it)
2397{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002398 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002399 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002400 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002401}
2402
2403static int
2404listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2405{
Guido van Rossum86103ae2002-07-16 20:07:32 +00002406 if (it->it_seq == NULL)
2407 return 0;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002408 return visit((PyObject *)it->it_seq, arg);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002409}
2410
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002411static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002412listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002413{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002414 PyListObject *seq;
2415 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002416
Tim Peters93b2cc42002-06-01 05:22:55 +00002417 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002418 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002419 if (seq == NULL)
2420 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002421 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002422
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002423 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002424 item = PyList_GET_ITEM(seq, it->it_index);
2425 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002426 Py_INCREF(item);
2427 return item;
2428 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002429
2430 Py_DECREF(seq);
2431 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002432 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002433}
2434
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002435PyTypeObject PyListIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002436 PyObject_HEAD_INIT(&PyType_Type)
2437 0, /* ob_size */
2438 "listiterator", /* tp_name */
2439 sizeof(listiterobject), /* tp_basicsize */
2440 0, /* tp_itemsize */
2441 /* methods */
2442 (destructor)listiter_dealloc, /* tp_dealloc */
2443 0, /* tp_print */
2444 0, /* tp_getattr */
2445 0, /* tp_setattr */
2446 0, /* tp_compare */
2447 0, /* tp_repr */
2448 0, /* tp_as_number */
2449 0, /* tp_as_sequence */
2450 0, /* tp_as_mapping */
2451 0, /* tp_hash */
2452 0, /* tp_call */
2453 0, /* tp_str */
2454 PyObject_GenericGetAttr, /* tp_getattro */
2455 0, /* tp_setattro */
2456 0, /* tp_as_buffer */
2457 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2458 0, /* tp_doc */
2459 (traverseproc)listiter_traverse, /* tp_traverse */
2460 0, /* tp_clear */
2461 0, /* tp_richcompare */
2462 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002463 PyObject_SelfIter, /* tp_iter */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002464 (iternextfunc)listiter_next, /* tp_iternext */
Guido van Rossum86103ae2002-07-16 20:07:32 +00002465 0, /* tp_methods */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002466 0, /* tp_members */
2467 0, /* tp_getset */
2468 0, /* tp_base */
2469 0, /* tp_dict */
2470 0, /* tp_descr_get */
2471 0, /* tp_descr_set */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002472};