blob: e6bed7172a894a61879a81b3407c4f494fb43aaa [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
Tim Peters8d9eb102004-07-31 02:24:20 +000011/* Ensure ob_item has room for at least newsize elements, and set
12 * ob_size to newsize. If newsize > ob_size on entry, the content
13 * of the new slots at exit is undefined heap trash; it's the caller's
14 * responsiblity to overwrite them with sane values.
15 * The number of allocated elements may grow, shrink, or stay the same.
16 * Failure is impossible if newsize <= self.allocated on entry, although
17 * that partly relies on an assumption that the system realloc() never
18 * fails when passed a number of bytes <= the number of bytes last
19 * allocated (the C standard doesn't guarantee this, but it's hard to
20 * imagine a realloc implementation where it wouldn't be true).
21 * Note that self->ob_item may change, and even if newsize is less
22 * than ob_size on entry.
23 */
Guido van Rossuma46d51d1995-01-26 22:59:43 +000024static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000025list_resize(PyListObject *self, Py_ssize_t newsize)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000026{
Raymond Hettinger4bb95402004-02-13 11:36:39 +000027 PyObject **items;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000028 size_t new_allocated;
Martin v. Löwis18e16552006-02-15 17:27:45 +000029 Py_ssize_t allocated = self->allocated;
Tim Peters65b8b842001-05-26 05:28:40 +000030
Raymond Hettinger4bb95402004-02-13 11:36:39 +000031 /* Bypass realloc() when a previous overallocation is large enough
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000032 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
Raymond Hettinger4bb95402004-02-13 11:36:39 +000034 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000035 if (allocated >= newsize && newsize >= (allocated >> 1)) {
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +000036 assert(self->ob_item != NULL || newsize == 0);
Raymond Hettinger4bb95402004-02-13 11:36:39 +000037 self->ob_size = newsize;
38 return 0;
39 }
40
41 /* This over-allocates proportional to the list size, making room
Tim Peters65b8b842001-05-26 05:28:40 +000042 * for additional growth. The over-allocation is mild, but is
43 * enough to give linear-time amortized behavior over a long
44 * sequence of appends() in the presence of a poorly-performing
Raymond Hettingerab517d22004-02-14 18:34:46 +000045 * system realloc().
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
Tim Peters65b8b842001-05-26 05:28:40 +000047 */
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000048 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;
49 if (newsize == 0)
50 new_allocated = 0;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000051 items = self->ob_item;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000052 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
53 PyMem_RESIZE(items, PyObject *, new_allocated);
Raymond Hettinger4bb95402004-02-13 11:36:39 +000054 else
55 items = NULL;
56 if (items == NULL) {
57 PyErr_NoMemory();
58 return -1;
59 }
60 self->ob_item = items;
61 self->ob_size = newsize;
Raymond Hettingera84f3ab2004-09-12 19:53:07 +000062 self->allocated = new_allocated;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000063 return 0;
64}
Guido van Rossuma46d51d1995-01-26 22:59:43 +000065
Raymond Hettinger0468e412004-05-05 05:37:53 +000066/* Empty list reuse scheme to save calls to malloc and free */
67#define MAXFREELISTS 80
68static PyListObject *free_lists[MAXFREELISTS];
69static int num_free_lists = 0;
70
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +000071void
72PyList_Fini(void)
73{
74 PyListObject *op;
75
76 while (num_free_lists) {
77 num_free_lists--;
78 op = free_lists[num_free_lists];
79 assert(PyList_CheckExact(op));
80 PyObject_GC_Del(op);
81 }
82}
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000085PyList_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000088 size_t nbytes;
Tim Peters3986d4e2004-07-29 02:28:42 +000089
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 return NULL;
93 }
Tim Peters7049d812004-01-18 20:31:02 +000094 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000095 /* Check for overflow */
Raymond Hettingerfdfe6182004-05-05 06:28:16 +000096 if (nbytes / sizeof(PyObject *) != (size_t)size)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return PyErr_NoMemory();
Raymond Hettinger0468e412004-05-05 05:37:53 +000098 if (num_free_lists) {
99 num_free_lists--;
100 op = free_lists[num_free_lists];
101 _Py_NewReference((PyObject *)op);
102 } else {
103 op = PyObject_GC_New(PyListObject, &PyList_Type);
104 if (op == NULL)
105 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 }
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000107 if (size <= 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108 op->ob_item = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Neal Norwitza00c0b92006-06-12 02:08:41 +0000111 if (op->ob_item == NULL) {
112 Py_DECREF(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 return PyErr_NoMemory();
Neal Norwitza00c0b92006-06-12 02:08:41 +0000114 }
Tim Peters3986d4e2004-07-29 02:28:42 +0000115 memset(op->ob_item, 0, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000117 op->ob_size = size;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000118 op->allocated = size;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000119 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000124PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 if (!PyList_Check(op)) {
127 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return -1;
129 }
130 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000134static PyObject *indexerr = NULL;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000137PyList_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 if (!PyList_Check(op)) {
140 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141 return NULL;
142 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000144 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 indexerr = PyString_FromString(
146 "list index out of range");
147 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 return NULL;
149 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151}
152
153int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000154PyList_SetItem(register PyObject *op, register Py_ssize_t i,
Fred Drakea2f55112000-07-09 15:16:51 +0000155 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 register PyObject *olditem;
158 register PyObject **p;
159 if (!PyList_Check(op)) {
160 Py_XDECREF(newitem);
161 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000162 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
165 Py_XDECREF(newitem);
166 PyErr_SetString(PyExc_IndexError,
167 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000168 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000171 olditem = *p;
172 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 return 0;
175}
176
177static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000178ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000180 Py_ssize_t i, n = self->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000182 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000184 return -1;
185 }
Martin v. Löwisb1ed7fa2006-04-13 07:52:27 +0000186 if (n == PY_SSIZE_T_MAX) {
Trent Micka5846642000-08-13 22:47:45 +0000187 PyErr_SetString(PyExc_OverflowError,
188 "cannot add more objects to list");
189 return -1;
190 }
Tim Petersb38e2b62004-07-29 02:29:26 +0000191
Raymond Hettingerd4ff7412004-03-15 09:01:31 +0000192 if (list_resize(self, n+1) == -1)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000193 return -1;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000194
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000195 if (where < 0) {
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000196 where += n;
Guido van Rossum3a3cca52003-04-14 20:58:14 +0000197 if (where < 0)
198 where = 0;
199 }
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000200 if (where > n)
201 where = n;
202 items = self->ob_item;
203 for (i = n; --i >= where; )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 items[where] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 return 0;
208}
209
210int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000211PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 if (!PyList_Check(op)) {
214 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000215 return -1;
216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218}
219
Raymond Hettinger40a03822004-04-12 13:05:09 +0000220static int
221app1(PyListObject *self, PyObject *v)
222{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223 Py_ssize_t n = PyList_GET_SIZE(self);
Raymond Hettinger40a03822004-04-12 13:05:09 +0000224
225 assert (v != NULL);
Martin v. Löwisb1ed7fa2006-04-13 07:52:27 +0000226 if (n == PY_SSIZE_T_MAX) {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000227 PyErr_SetString(PyExc_OverflowError,
228 "cannot add more objects to list");
229 return -1;
230 }
231
232 if (list_resize(self, n+1) == -1)
233 return -1;
234
235 Py_INCREF(v);
236 PyList_SET_ITEM(self, n, v);
237 return 0;
238}
239
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240int
Fred Drakea2f55112000-07-09 15:16:51 +0000241PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242{
Raymond Hettingerfdfe6182004-05-05 06:28:16 +0000243 if (PyList_Check(op) && (newitem != NULL))
244 return app1((PyListObject *)op, newitem);
245 PyErr_BadInternalCall();
246 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
249/* Methods */
250
251static void
Fred Drakea2f55112000-07-09 15:16:51 +0000252list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254 Py_ssize_t i;
Guido van Rossumff413af2002-03-28 20:34:59 +0000255 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000256 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000257 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000258 /* Do it backwards, for Christian Tismer.
259 There's a simple test case where somehow this reduces
260 thrashing when a *very* large list is created and
261 immediately deleted. */
262 i = op->ob_size;
263 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000265 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000266 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000267 }
Raymond Hettinger0468e412004-05-05 05:37:53 +0000268 if (num_free_lists < MAXFREELISTS && PyList_CheckExact(op))
269 free_lists[num_free_lists++] = op;
Tim Petersb38e2b62004-07-29 02:29:26 +0000270 else
271 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000272 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273}
274
Guido van Rossum90933611991-06-07 16:10:43 +0000275static int
Fred Drakea2f55112000-07-09 15:16:51 +0000276list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000278 int rc;
279 Py_ssize_t i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000280
Martin v. Löwis18e16552006-02-15 17:27:45 +0000281 rc = Py_ReprEnter((PyObject*)op);
282 if (rc != 0) {
283 if (rc < 0)
284 return rc;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000285 fprintf(fp, "[...]");
286 return 0;
287 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000289 for (i = 0; i < op->ob_size; i++) {
290 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000292 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
293 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000294 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000295 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 }
297 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000298 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000299 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300}
301
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000303list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000306 PyObject *s, *temp;
307 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000308
309 i = Py_ReprEnter((PyObject*)v);
310 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000311 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000312 }
Tim Petersa7259592001-06-16 05:11:17 +0000313
314 if (v->ob_size == 0) {
315 result = PyString_FromString("[]");
316 goto Done;
317 }
318
319 pieces = PyList_New(0);
320 if (pieces == NULL)
321 goto Done;
322
323 /* Do repr() on each element. Note that this may mutate the list,
324 so must refetch the list size on each iteration. */
325 for (i = 0; i < v->ob_size; ++i) {
326 int status;
327 s = PyObject_Repr(v->ob_item[i]);
328 if (s == NULL)
329 goto Done;
330 status = PyList_Append(pieces, s);
331 Py_DECREF(s); /* append created a new ref */
332 if (status < 0)
333 goto Done;
334 }
335
336 /* Add "[]" decorations to the first and last items. */
337 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000339 if (s == NULL)
340 goto Done;
341 temp = PyList_GET_ITEM(pieces, 0);
342 PyString_ConcatAndDel(&s, temp);
343 PyList_SET_ITEM(pieces, 0, s);
344 if (s == NULL)
345 goto Done;
346
347 s = PyString_FromString("]");
348 if (s == NULL)
349 goto Done;
350 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
351 PyString_ConcatAndDel(&temp, s);
352 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
353 if (temp == NULL)
354 goto Done;
355
356 /* Paste them all together with ", " between. */
357 s = PyString_FromString(", ");
358 if (s == NULL)
359 goto Done;
360 result = _PyString_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000361 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000362
363Done:
364 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000365 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000366 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367}
368
Martin v. Löwis18e16552006-02-15 17:27:45 +0000369static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000370list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371{
372 return a->ob_size;
373}
374
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000375static int
Fred Drakea2f55112000-07-09 15:16:51 +0000376list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000377{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000378 Py_ssize_t i;
379 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000380
Raymond Hettingeraae59992002-09-05 14:23:49 +0000381 for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
382 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000383 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000384 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000385}
386
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000388list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389{
390 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000391 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 indexerr = PyString_FromString(
393 "list index out of range");
394 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 return NULL;
396 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 return a->ob_item[i];
399}
400
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000402list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000405 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000406 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 if (ilow < 0)
408 ilow = 0;
409 else if (ilow > a->ob_size)
410 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411 if (ihigh < ilow)
412 ihigh = ilow;
413 else if (ihigh > a->ob_size)
414 ihigh = a->ob_size;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000415 len = ihigh - ilow;
416 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417 if (np == NULL)
418 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000419
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000420 src = a->ob_item + ilow;
421 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000422 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000423 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000425 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428}
429
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000431PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000432{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 if (!PyList_Check(a)) {
434 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000435 return NULL;
436 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000438}
439
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000441list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443 Py_ssize_t size;
444 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000445 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 PyListObject *np;
447 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000448 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000449 "can only concatenate list (not \"%.200s\") to list",
450 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 return NULL;
452 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 size = a->ob_size + b->ob_size;
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000455 if (size < 0)
456 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000459 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000461 src = a->ob_item;
462 dest = np->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463 for (i = 0; i < a->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000464 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000466 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000468 src = b->ob_item;
469 dest = np->ob_item + a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470 for (i = 0; i < b->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000471 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000473 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476#undef b
477}
478
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000480list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000481{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000482 Py_ssize_t i, j;
483 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000485 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000486 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000487 if (n < 0)
488 n = 0;
489 size = a->ob_size * n;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000490 if (size == 0)
491 return PyList_New(0);
Guido van Rossumbfa5a142002-10-11 23:39:35 +0000492 if (n && size/n != a->ob_size)
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000493 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000495 if (np == NULL)
496 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000497
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000498 items = np->ob_item;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000499 if (a->ob_size == 1) {
500 elem = a->ob_item[0];
501 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000502 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000503 Py_INCREF(elem);
504 }
505 return (PyObject *) np;
506 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000507 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000508 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000509 for (i = 0; i < n; i++) {
510 for (j = 0; j < a->ob_size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000511 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000513 p++;
514 }
515 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000517}
518
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519static int
Armin Rigo93677f02004-07-29 12:40:23 +0000520list_clear(PyListObject *a)
521{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000522 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000523 PyObject **item = a->ob_item;
524 if (item != NULL) {
525 /* Because XDECREF can recursively invoke operations on
526 this list, we make it empty first. */
527 i = a->ob_size;
528 a->ob_size = 0;
529 a->ob_item = NULL;
530 a->allocated = 0;
531 while (--i >= 0) {
532 Py_XDECREF(item[i]);
533 }
534 PyMem_FREE(item);
535 }
536 /* Never fails; the return value can be ignored.
537 Note that there is no guarantee that the list is actually empty
538 at this point, because XDECREF may have populated it again! */
539 return 0;
540}
541
Tim Peters8fc4a912004-07-31 21:53:19 +0000542/* a[ilow:ihigh] = v if v != NULL.
543 * del a[ilow:ihigh] if v == NULL.
544 *
545 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
546 * guaranteed the call cannot fail.
547 */
Armin Rigo93677f02004-07-29 12:40:23 +0000548static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000549list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000550{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000551 /* Because [X]DECREF can recursively invoke list operations on
552 this list, we must postpone all [X]DECREF activity until
553 after the list is back in its canonical shape. Therefore
554 we must allocate an additional array, 'recycle', into which
555 we temporarily copy the items that are deleted from the
556 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000557 PyObject *recycle_on_stack[8];
558 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000560 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000561 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000562 Py_ssize_t n; /* # of elements in replacement list */
563 Py_ssize_t norig; /* # of elements in list getting replaced */
564 Py_ssize_t d; /* Change in size */
565 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000566 size_t s;
567 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569 if (v == NULL)
570 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000571 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000572 if (a == b) {
573 /* Special case "a[i:j] = a" -- copy b first */
Michael W. Hudsonda0a0672003-08-15 12:06:41 +0000574 v = list_slice(b, 0, b->ob_size);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000575 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000576 return result;
577 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000579 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000580 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000581 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000582 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000583 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000584 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000585 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000586 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000587 if (ilow < 0)
588 ilow = 0;
589 else if (ilow > a->ob_size)
590 ilow = a->ob_size;
Tim Peters8d9eb102004-07-31 02:24:20 +0000591
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592 if (ihigh < ilow)
593 ihigh = ilow;
594 else if (ihigh > a->ob_size)
595 ihigh = a->ob_size;
Armin Rigo93677f02004-07-29 12:40:23 +0000596
Tim Peters8d9eb102004-07-31 02:24:20 +0000597 norig = ihigh - ilow;
598 assert(norig >= 0);
599 d = n - norig;
Armin Rigo93677f02004-07-29 12:40:23 +0000600 if (a->ob_size + d == 0) {
601 Py_XDECREF(v_as_SF);
602 return list_clear(a);
603 }
604 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000605 /* recycle the items that we are about to remove */
606 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000607 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000608 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000609 if (recycle == NULL) {
610 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000611 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000612 }
613 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000614 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000615
Armin Rigo1dd04a02004-07-30 11:38:22 +0000616 if (d < 0) { /* Delete -d items */
617 memmove(&item[ihigh+d], &item[ihigh],
618 (a->ob_size - ihigh)*sizeof(PyObject *));
619 list_resize(a, a->ob_size + d);
620 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000621 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000622 else if (d > 0) { /* Insert d items */
Tim Peters73572222004-07-31 02:54:42 +0000623 k = a->ob_size;
624 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000625 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000626 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000627 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000628 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000629 }
630 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000631 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633 item[ilow] = w;
634 }
Tim Peters73572222004-07-31 02:54:42 +0000635 for (k = norig - 1; k >= 0; --k)
636 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000637 result = 0;
638 Error:
Tim Peters73572222004-07-31 02:54:42 +0000639 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000640 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000641 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000642 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000643#undef b
644}
645
Guido van Rossum234f9421993-06-17 12:35:49 +0000646int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000647PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000648{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 if (!PyList_Check(a)) {
650 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000651 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000652 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000654}
655
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000656static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000657list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000658{
659 PyObject **items;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000660 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000661
662
663 size = PyList_GET_SIZE(self);
664 if (size == 0) {
665 Py_INCREF(self);
666 return (PyObject *)self;
667 }
668
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000670 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000671 Py_INCREF(self);
672 return (PyObject *)self;
673 }
674
Tim Petersb38e2b62004-07-29 02:29:26 +0000675 if (list_resize(self, size*n) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000676 return NULL;
677
678 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000679 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000680 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
681 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000682 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000683 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000684 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000685 }
686 }
687 Py_INCREF(self);
688 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000689}
690
Guido van Rossum4a450d01991-04-03 19:05:18 +0000691static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000692list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000693{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000695 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyErr_SetString(PyExc_IndexError,
697 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000698 return -1;
699 }
700 if (v == NULL)
701 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000703 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000704 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000705 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000706 return 0;
707}
708
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000710listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000711{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000712 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000714 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000715 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000716 if (ins1(self, i, v) == 0)
717 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000718 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000719}
720
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000722listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000724 if (app1(self, v) == 0)
725 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000726 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000727}
728
Barry Warsawdedf6d61998-10-09 16:37:25 +0000729static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000730listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000731{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000732 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000733 Py_ssize_t m; /* size of self */
734 Py_ssize_t n; /* guess for size of b */
735 Py_ssize_t mn; /* m + n */
736 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000737 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000738
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000739 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000740 1) lists and tuples which can use PySequence_Fast ops
741 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000742 */
743 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000744 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000745 b = PySequence_Fast(b, "argument must be iterable");
746 if (!b)
747 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000748 n = PySequence_Fast_GET_SIZE(b);
749 if (n == 0) {
750 /* short circuit when b is empty */
751 Py_DECREF(b);
752 Py_RETURN_NONE;
753 }
754 m = self->ob_size;
755 if (list_resize(self, m + n) == -1) {
756 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000757 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000758 }
759 /* note that we may still have self == b here for the
760 * situation a.extend(a), but the following code works
761 * in that case too. Just make sure to resize self
762 * before calling PySequence_Fast_ITEMS.
763 */
764 /* populate the end of self with b's items */
765 src = PySequence_Fast_ITEMS(b);
766 dest = self->ob_item + m;
767 for (i = 0; i < n; i++) {
768 PyObject *o = src[i];
769 Py_INCREF(o);
770 dest[i] = o;
771 }
772 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000773 Py_RETURN_NONE;
774 }
775
776 it = PyObject_GetIter(b);
777 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000778 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000779 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000780
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000781 /* Guess a result list size. */
Armin Rigof5b3e362006-02-11 21:32:43 +0000782 n = _PyObject_LengthHint(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000783 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000784 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
785 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
786 Py_DECREF(it);
787 return NULL;
788 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000789 PyErr_Clear();
790 n = 8; /* arbitrary */
791 }
792 m = self->ob_size;
793 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000794 if (mn >= m) {
795 /* Make room. */
796 if (list_resize(self, mn) == -1)
797 goto error;
798 /* Make the list sane again. */
799 self->ob_size = m;
800 }
801 /* Else m + n overflowed; on the chance that n lied, and there really
802 * is enough room, ignore it. If n was telling the truth, we'll
803 * eventually run out of memory during the loop.
804 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000805
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000806 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000807 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000808 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000809 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000810 if (PyErr_Occurred()) {
811 if (PyErr_ExceptionMatches(PyExc_StopIteration))
812 PyErr_Clear();
813 else
814 goto error;
815 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000816 break;
817 }
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000818 if (self->ob_size < self->allocated) {
819 /* steals ref */
820 PyList_SET_ITEM(self, self->ob_size, item);
821 ++self->ob_size;
822 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000823 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000824 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000825 Py_DECREF(item); /* append creates a new ref */
826 if (status < 0)
827 goto error;
828 }
829 }
830
831 /* Cut back result list if initial guess was too large. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000832 if (self->ob_size < self->allocated)
833 list_resize(self, self->ob_size); /* shrinking can't fail */
834
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000835 Py_DECREF(it);
836 Py_RETURN_NONE;
837
838 error:
839 Py_DECREF(it);
840 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000841}
842
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000843PyObject *
844_PyList_Extend(PyListObject *self, PyObject *b)
845{
846 return listextend(self, b);
847}
848
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000849static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000850list_inplace_concat(PyListObject *self, PyObject *other)
851{
852 PyObject *result;
853
854 result = listextend(self, other);
855 if (result == NULL)
856 return result;
857 Py_DECREF(result);
858 Py_INCREF(self);
859 return (PyObject *)self;
860}
861
862static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000863listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000864{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000865 Py_ssize_t i = -1;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000866 PyObject *v, *arg = NULL;
Tim Peters8fc4a912004-07-31 21:53:19 +0000867 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000868
869 if (!PyArg_UnpackTuple(args, "pop", 0, 1, &arg))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000870 return NULL;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000871 if (arg != NULL) {
872 if (PyInt_Check(arg))
Martin v. Löwis18e16552006-02-15 17:27:45 +0000873 i = PyInt_AS_LONG((PyIntObject*) arg);
874 else if (!PyArg_ParseTuple(args, "|n:pop", &i))
Raymond Hettingerfa6c6f82004-02-19 06:12:06 +0000875 return NULL;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000876 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000877 if (self->ob_size == 0) {
878 /* Special-case most common failure cause */
879 PyErr_SetString(PyExc_IndexError, "pop from empty list");
880 return NULL;
881 }
882 if (i < 0)
883 i += self->ob_size;
884 if (i < 0 || i >= self->ob_size) {
885 PyErr_SetString(PyExc_IndexError, "pop index out of range");
886 return NULL;
887 }
888 v = self->ob_item[i];
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000889 if (i == self->ob_size - 1) {
Tim Peters8fc4a912004-07-31 21:53:19 +0000890 status = list_resize(self, self->ob_size - 1);
891 assert(status >= 0);
892 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000893 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000894 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000895 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
896 assert(status >= 0);
897 /* Use status, so that in a release build compilers don't
898 * complain about the unused name.
899 */
Brett Cannon651dd522004-08-08 21:21:18 +0000900 (void) status;
901
902 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000903}
904
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000905/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
906static void
907reverse_slice(PyObject **lo, PyObject **hi)
908{
909 assert(lo && hi);
910
911 --hi;
912 while (lo < hi) {
913 PyObject *t = *lo;
914 *lo = *hi;
915 *hi = t;
916 ++lo;
917 --hi;
918 }
919}
920
Tim Petersa64dc242002-08-01 02:13:36 +0000921/* Lots of code for an adaptive, stable, natural mergesort. There are many
922 * pieces to this algorithm; read listsort.txt for overviews and details.
923 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000924
Guido van Rossum3f236de1996-12-10 23:55:39 +0000925/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000926 * comparison function (any callable Python object), which must not be
927 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
928 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000929 * Returns -1 on error, 1 if x < y, 0 if x >= y.
930 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000931static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000932islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000933{
Tim Petersf2a04732002-07-11 21:46:16 +0000934 PyObject *res;
935 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000936 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000937
Tim Peters66860f62002-08-04 17:47:26 +0000938 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000939 /* Call the user's comparison function and translate the 3-way
940 * result into true or false (or error).
941 */
Tim Petersf2a04732002-07-11 21:46:16 +0000942 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000943 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000944 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000945 Py_INCREF(x);
946 Py_INCREF(y);
947 PyTuple_SET_ITEM(args, 0, x);
948 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000949 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000951 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000952 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 if (!PyInt_Check(res)) {
954 Py_DECREF(res);
955 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000956 "comparison function must return int");
Tim Petersa8c974c2002-07-19 03:30:57 +0000957 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000958 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 i = PyInt_AsLong(res);
960 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000961 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000962}
963
Tim Peters66860f62002-08-04 17:47:26 +0000964/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
965 * islt. This avoids a layer of function call in the usual case, and
966 * sorting does many comparisons.
967 * Returns -1 on error, 1 if x < y, 0 if x >= y.
968 */
969#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
970 PyObject_RichCompareBool(X, Y, Py_LT) : \
971 islt(X, Y, COMPARE))
972
973/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000974 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
975 started. It makes more sense in context <wink>. X and Y are PyObject*s.
976*/
Tim Peters66860f62002-08-04 17:47:26 +0000977#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000978 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000979
980/* binarysort is the best method for sorting small arrays: it does
981 few compares, but can do data movement quadratic in the number of
982 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000983 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000984 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000985 On entry, must have lo <= start <= hi, and that [lo, start) is already
986 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000987 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000988 Even in case of error, the output slice will be some permutation of
989 the input (nothing is lost or duplicated).
990*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000991static int
Fred Drakea2f55112000-07-09 15:16:51 +0000992binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
993 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000994{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000995 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000996 register PyObject **l, **p, **r;
997 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000998
Tim Petersa8c974c2002-07-19 03:30:57 +0000999 assert(lo <= start && start <= hi);
1000 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001001 if (lo == start)
1002 ++start;
1003 for (; start < hi; ++start) {
1004 /* set l to where *start belongs */
1005 l = lo;
1006 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001007 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +00001008 /* Invariants:
1009 * pivot >= all in [lo, l).
1010 * pivot < all in [r, start).
1011 * The second is vacuously true at the start.
1012 */
1013 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001014 do {
1015 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +00001016 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001017 r = p;
1018 else
Tim Peters0fe977c2002-07-19 06:12:32 +00001019 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001020 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001021 assert(l == r);
1022 /* The invariants still hold, so pivot >= all in [lo, l) and
1023 pivot < all in [l, start), so pivot belongs at l. Note
1024 that if there are elements equal to pivot, l points to the
1025 first slot after them -- that's why this sort is stable.
1026 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001027 Caution: using memmove is much slower under MSVC 5;
1028 we're not usually moving many slots. */
1029 for (p = start; p > l; --p)
1030 *p = *(p-1);
1031 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001032 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001033 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001034
1035 fail:
1036 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001037}
1038
Tim Petersa64dc242002-08-01 02:13:36 +00001039/*
1040Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1041is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001042
Tim Petersa64dc242002-08-01 02:13:36 +00001043 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001044
Tim Petersa64dc242002-08-01 02:13:36 +00001045or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001046
Tim Petersa64dc242002-08-01 02:13:36 +00001047 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001048
Tim Petersa64dc242002-08-01 02:13:36 +00001049Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1050For its intended use in a stable mergesort, the strictness of the defn of
1051"descending" is needed so that the caller can safely reverse a descending
1052sequence without violating stability (strict > ensures there are no equal
1053elements to get out of order).
1054
1055Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001056*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001057static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001058count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001059{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001060 Py_ssize_t k;
1061 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001062
Tim Petersa64dc242002-08-01 02:13:36 +00001063 assert(lo < hi);
1064 *descending = 0;
1065 ++lo;
1066 if (lo == hi)
1067 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001068
Tim Petersa64dc242002-08-01 02:13:36 +00001069 n = 2;
1070 IFLT(*lo, *(lo-1)) {
1071 *descending = 1;
1072 for (lo = lo+1; lo < hi; ++lo, ++n) {
1073 IFLT(*lo, *(lo-1))
1074 ;
1075 else
1076 break;
1077 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001078 }
Tim Petersa64dc242002-08-01 02:13:36 +00001079 else {
1080 for (lo = lo+1; lo < hi; ++lo, ++n) {
1081 IFLT(*lo, *(lo-1))
1082 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001083 }
1084 }
1085
Tim Petersa64dc242002-08-01 02:13:36 +00001086 return n;
1087fail:
1088 return -1;
1089}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001090
Tim Petersa64dc242002-08-01 02:13:36 +00001091/*
1092Locate the proper position of key in a sorted vector; if the vector contains
1093an element equal to key, return the position immediately to the left of
1094the leftmost equal element. [gallop_right() does the same except returns
1095the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001096
Tim Petersa64dc242002-08-01 02:13:36 +00001097"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001098
Tim Petersa64dc242002-08-01 02:13:36 +00001099"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1100hint is to the final result, the faster this runs.
1101
1102The return value is the int k in 0..n such that
1103
1104 a[k-1] < key <= a[k]
1105
1106pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1107key belongs at index k; or, IOW, the first k elements of a should precede
1108key, and the last n-k should follow key.
1109
1110Returns -1 on error. See listsort.txt for info on the method.
1111*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001112static Py_ssize_t
1113gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001114{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001115 Py_ssize_t ofs;
1116 Py_ssize_t lastofs;
1117 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001118
1119 assert(key && a && n > 0 && hint >= 0 && hint < n);
1120
1121 a += hint;
1122 lastofs = 0;
1123 ofs = 1;
1124 IFLT(*a, key) {
1125 /* a[hint] < key -- gallop right, until
1126 * a[hint + lastofs] < key <= a[hint + ofs]
1127 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001128 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001129 while (ofs < maxofs) {
1130 IFLT(a[ofs], key) {
1131 lastofs = ofs;
1132 ofs = (ofs << 1) + 1;
1133 if (ofs <= 0) /* int overflow */
1134 ofs = maxofs;
1135 }
1136 else /* key <= a[hint + ofs] */
1137 break;
1138 }
1139 if (ofs > maxofs)
1140 ofs = maxofs;
1141 /* Translate back to offsets relative to &a[0]. */
1142 lastofs += hint;
1143 ofs += hint;
1144 }
1145 else {
1146 /* key <= a[hint] -- gallop left, until
1147 * a[hint - ofs] < key <= a[hint - lastofs]
1148 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001149 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001150 while (ofs < maxofs) {
1151 IFLT(*(a-ofs), key)
1152 break;
1153 /* key <= a[hint - ofs] */
1154 lastofs = ofs;
1155 ofs = (ofs << 1) + 1;
1156 if (ofs <= 0) /* int overflow */
1157 ofs = maxofs;
1158 }
1159 if (ofs > maxofs)
1160 ofs = maxofs;
1161 /* Translate back to positive offsets relative to &a[0]. */
1162 k = lastofs;
1163 lastofs = hint - ofs;
1164 ofs = hint - k;
1165 }
1166 a -= hint;
1167
1168 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1169 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1170 * right of lastofs but no farther right than ofs. Do a binary
1171 * search, with invariant a[lastofs-1] < key <= a[ofs].
1172 */
1173 ++lastofs;
1174 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001175 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001176
1177 IFLT(a[m], key)
1178 lastofs = m+1; /* a[m] < key */
1179 else
1180 ofs = m; /* key <= a[m] */
1181 }
1182 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1183 return ofs;
1184
1185fail:
1186 return -1;
1187}
1188
1189/*
1190Exactly like gallop_left(), except that if key already exists in a[0:n],
1191finds the position immediately to the right of the rightmost equal value.
1192
1193The return value is the int k in 0..n such that
1194
1195 a[k-1] <= key < a[k]
1196
1197or -1 if error.
1198
1199The code duplication is massive, but this is enough different given that
1200we're sticking to "<" comparisons that it's much harder to follow if
1201written as one routine with yet another "left or right?" flag.
1202*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001203static Py_ssize_t
1204gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001205{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001206 Py_ssize_t ofs;
1207 Py_ssize_t lastofs;
1208 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001209
1210 assert(key && a && n > 0 && hint >= 0 && hint < n);
1211
1212 a += hint;
1213 lastofs = 0;
1214 ofs = 1;
1215 IFLT(key, *a) {
1216 /* key < a[hint] -- gallop left, until
1217 * a[hint - ofs] <= key < a[hint - lastofs]
1218 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001219 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001220 while (ofs < maxofs) {
1221 IFLT(key, *(a-ofs)) {
1222 lastofs = ofs;
1223 ofs = (ofs << 1) + 1;
1224 if (ofs <= 0) /* int overflow */
1225 ofs = maxofs;
1226 }
1227 else /* a[hint - ofs] <= key */
1228 break;
1229 }
1230 if (ofs > maxofs)
1231 ofs = maxofs;
1232 /* Translate back to positive offsets relative to &a[0]. */
1233 k = lastofs;
1234 lastofs = hint - ofs;
1235 ofs = hint - k;
1236 }
1237 else {
1238 /* a[hint] <= key -- gallop right, until
1239 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001240 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001241 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001242 while (ofs < maxofs) {
1243 IFLT(key, a[ofs])
1244 break;
1245 /* a[hint + ofs] <= key */
1246 lastofs = ofs;
1247 ofs = (ofs << 1) + 1;
1248 if (ofs <= 0) /* int overflow */
1249 ofs = maxofs;
1250 }
1251 if (ofs > maxofs)
1252 ofs = maxofs;
1253 /* Translate back to offsets relative to &a[0]. */
1254 lastofs += hint;
1255 ofs += hint;
1256 }
1257 a -= hint;
1258
1259 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1260 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1261 * right of lastofs but no farther right than ofs. Do a binary
1262 * search, with invariant a[lastofs-1] <= key < a[ofs].
1263 */
1264 ++lastofs;
1265 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001266 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001267
1268 IFLT(key, a[m])
1269 ofs = m; /* key < a[m] */
1270 else
1271 lastofs = m+1; /* a[m] <= key */
1272 }
1273 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1274 return ofs;
1275
1276fail:
1277 return -1;
1278}
1279
1280/* The maximum number of entries in a MergeState's pending-runs stack.
1281 * This is enough to sort arrays of size up to about
1282 * 32 * phi ** MAX_MERGE_PENDING
1283 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1284 * with 2**64 elements.
1285 */
1286#define MAX_MERGE_PENDING 85
1287
Tim Peterse05f65a2002-08-10 05:21:15 +00001288/* When we get into galloping mode, we stay there until both runs win less
1289 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001290 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001291#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001292
1293/* Avoid malloc for small temp arrays. */
1294#define MERGESTATE_TEMP_SIZE 256
1295
1296/* One MergeState exists on the stack per invocation of mergesort. It's just
1297 * a convenient way to pass state around among the helper functions.
1298 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001299struct s_slice {
1300 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001301 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001302};
1303
Tim Petersa64dc242002-08-01 02:13:36 +00001304typedef struct s_MergeState {
1305 /* The user-supplied comparison function. or NULL if none given. */
1306 PyObject *compare;
1307
Tim Peterse05f65a2002-08-10 05:21:15 +00001308 /* This controls when we get *into* galloping mode. It's initialized
1309 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1310 * random data, and lower for highly structured data.
1311 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001312 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001313
Tim Petersa64dc242002-08-01 02:13:36 +00001314 /* 'a' is temp storage to help with merges. It contains room for
1315 * alloced entries.
1316 */
1317 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001318 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001319
1320 /* A stack of n pending runs yet to be merged. Run #i starts at
1321 * address base[i] and extends for len[i] elements. It's always
1322 * true (so long as the indices are in bounds) that
1323 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001324 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001325 *
1326 * so we could cut the storage for this, but it's a minor amount,
1327 * and keeping all the info explicit simplifies the code.
1328 */
1329 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001330 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001331
1332 /* 'a' points to this when possible, rather than muck with malloc. */
1333 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1334} MergeState;
1335
1336/* Conceptually a MergeState's constructor. */
1337static void
1338merge_init(MergeState *ms, PyObject *compare)
1339{
1340 assert(ms != NULL);
1341 ms->compare = compare;
1342 ms->a = ms->temparray;
1343 ms->alloced = MERGESTATE_TEMP_SIZE;
1344 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001345 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001346}
1347
1348/* Free all the temp memory owned by the MergeState. This must be called
1349 * when you're done with a MergeState, and may be called before then if
1350 * you want to free the temp memory early.
1351 */
1352static void
1353merge_freemem(MergeState *ms)
1354{
1355 assert(ms != NULL);
1356 if (ms->a != ms->temparray)
1357 PyMem_Free(ms->a);
1358 ms->a = ms->temparray;
1359 ms->alloced = MERGESTATE_TEMP_SIZE;
1360}
1361
1362/* Ensure enough temp memory for 'need' array slots is available.
1363 * Returns 0 on success and -1 if the memory can't be gotten.
1364 */
1365static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001366merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001367{
1368 assert(ms != NULL);
1369 if (need <= ms->alloced)
1370 return 0;
1371 /* Don't realloc! That can cost cycles to copy the old data, but
1372 * we don't care what's in the block.
1373 */
1374 merge_freemem(ms);
1375 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1376 if (ms->a) {
1377 ms->alloced = need;
1378 return 0;
1379 }
1380 PyErr_NoMemory();
1381 merge_freemem(ms); /* reset to sane state */
1382 return -1;
1383}
1384#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1385 merge_getmem(MS, NEED))
1386
1387/* Merge the na elements starting at pa with the nb elements starting at pb
1388 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1389 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1390 * merge, and should have na <= nb. See listsort.txt for more info.
1391 * Return 0 if successful, -1 if error.
1392 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001393static Py_ssize_t
1394merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1395 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001396{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001397 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001398 PyObject *compare;
1399 PyObject **dest;
1400 int result = -1; /* guilty until proved innocent */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401 Py_ssize_t min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001402
1403 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1404 if (MERGE_GETMEM(ms, na) < 0)
1405 return -1;
1406 memcpy(ms->a, pa, na * sizeof(PyObject*));
1407 dest = pa;
1408 pa = ms->a;
1409
1410 *dest++ = *pb++;
1411 --nb;
1412 if (nb == 0)
1413 goto Succeed;
1414 if (na == 1)
1415 goto CopyB;
1416
1417 compare = ms->compare;
1418 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001419 Py_ssize_t acount = 0; /* # of times A won in a row */
1420 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001421
1422 /* Do the straightforward thing until (if ever) one run
1423 * appears to win consistently.
1424 */
1425 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001426 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001427 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001428 if (k) {
1429 if (k < 0)
1430 goto Fail;
1431 *dest++ = *pb++;
1432 ++bcount;
1433 acount = 0;
1434 --nb;
1435 if (nb == 0)
1436 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001437 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001438 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001439 }
1440 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001441 *dest++ = *pa++;
1442 ++acount;
1443 bcount = 0;
1444 --na;
1445 if (na == 1)
1446 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001447 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001448 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001449 }
Tim Petersa64dc242002-08-01 02:13:36 +00001450 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001451
Tim Petersa64dc242002-08-01 02:13:36 +00001452 /* One run is winning so consistently that galloping may
1453 * be a huge win. So try that, and continue galloping until
1454 * (if ever) neither run appears to be winning consistently
1455 * anymore.
1456 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001457 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001458 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001459 assert(na > 1 && nb > 0);
1460 min_gallop -= min_gallop > 1;
1461 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001462 k = gallop_right(*pb, pa, na, 0, compare);
1463 acount = k;
1464 if (k) {
1465 if (k < 0)
1466 goto Fail;
1467 memcpy(dest, pa, k * sizeof(PyObject *));
1468 dest += k;
1469 pa += k;
1470 na -= k;
1471 if (na == 1)
1472 goto CopyB;
1473 /* na==0 is impossible now if the comparison
1474 * function is consistent, but we can't assume
1475 * that it is.
1476 */
1477 if (na == 0)
1478 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001479 }
Tim Petersa64dc242002-08-01 02:13:36 +00001480 *dest++ = *pb++;
1481 --nb;
1482 if (nb == 0)
1483 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001484
Tim Petersa64dc242002-08-01 02:13:36 +00001485 k = gallop_left(*pa, pb, nb, 0, compare);
1486 bcount = k;
1487 if (k) {
1488 if (k < 0)
1489 goto Fail;
1490 memmove(dest, pb, k * sizeof(PyObject *));
1491 dest += k;
1492 pb += k;
1493 nb -= k;
1494 if (nb == 0)
1495 goto Succeed;
1496 }
1497 *dest++ = *pa++;
1498 --na;
1499 if (na == 1)
1500 goto CopyB;
1501 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001502 ++min_gallop; /* penalize it for leaving galloping mode */
1503 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001504 }
1505Succeed:
1506 result = 0;
1507Fail:
1508 if (na)
1509 memcpy(dest, pa, na * sizeof(PyObject*));
1510 return result;
1511CopyB:
1512 assert(na == 1 && nb > 0);
1513 /* The last element of pa belongs at the end of the merge. */
1514 memmove(dest, pb, nb * sizeof(PyObject *));
1515 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001516 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001517}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001518
Tim Petersa64dc242002-08-01 02:13:36 +00001519/* Merge the na elements starting at pa with the nb elements starting at pb
1520 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1521 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1522 * merge, and should have na >= nb. See listsort.txt for more info.
1523 * Return 0 if successful, -1 if error.
1524 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001525static Py_ssize_t
1526merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001527{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001528 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001529 PyObject *compare;
1530 PyObject **dest;
1531 int result = -1; /* guilty until proved innocent */
1532 PyObject **basea;
1533 PyObject **baseb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001534 Py_ssize_t min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001535
1536 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1537 if (MERGE_GETMEM(ms, nb) < 0)
1538 return -1;
1539 dest = pb + nb - 1;
1540 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1541 basea = pa;
1542 baseb = ms->a;
1543 pb = ms->a + nb - 1;
1544 pa += na - 1;
1545
1546 *dest-- = *pa--;
1547 --na;
1548 if (na == 0)
1549 goto Succeed;
1550 if (nb == 1)
1551 goto CopyA;
1552
1553 compare = ms->compare;
1554 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001555 Py_ssize_t acount = 0; /* # of times A won in a row */
1556 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001557
1558 /* Do the straightforward thing until (if ever) one run
1559 * appears to win consistently.
1560 */
1561 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001562 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001563 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001564 if (k) {
1565 if (k < 0)
1566 goto Fail;
1567 *dest-- = *pa--;
1568 ++acount;
1569 bcount = 0;
1570 --na;
1571 if (na == 0)
1572 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001573 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001574 break;
1575 }
1576 else {
1577 *dest-- = *pb--;
1578 ++bcount;
1579 acount = 0;
1580 --nb;
1581 if (nb == 1)
1582 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001583 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001584 break;
1585 }
1586 }
1587
1588 /* One run is winning so consistently that galloping may
1589 * be a huge win. So try that, and continue galloping until
1590 * (if ever) neither run appears to be winning consistently
1591 * anymore.
1592 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001593 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001594 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001595 assert(na > 0 && nb > 1);
1596 min_gallop -= min_gallop > 1;
1597 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001598 k = gallop_right(*pb, basea, na, na-1, compare);
1599 if (k < 0)
1600 goto Fail;
1601 k = na - k;
1602 acount = k;
1603 if (k) {
1604 dest -= k;
1605 pa -= k;
1606 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1607 na -= k;
1608 if (na == 0)
1609 goto Succeed;
1610 }
1611 *dest-- = *pb--;
1612 --nb;
1613 if (nb == 1)
1614 goto CopyA;
1615
1616 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1617 if (k < 0)
1618 goto Fail;
1619 k = nb - k;
1620 bcount = k;
1621 if (k) {
1622 dest -= k;
1623 pb -= k;
1624 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1625 nb -= k;
1626 if (nb == 1)
1627 goto CopyA;
1628 /* nb==0 is impossible now if the comparison
1629 * function is consistent, but we can't assume
1630 * that it is.
1631 */
1632 if (nb == 0)
1633 goto Succeed;
1634 }
1635 *dest-- = *pa--;
1636 --na;
1637 if (na == 0)
1638 goto Succeed;
1639 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001640 ++min_gallop; /* penalize it for leaving galloping mode */
1641 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001642 }
1643Succeed:
1644 result = 0;
1645Fail:
1646 if (nb)
1647 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1648 return result;
1649CopyA:
1650 assert(nb == 1 && na > 0);
1651 /* The first element of pb belongs at the front of the merge. */
1652 dest -= na;
1653 pa -= na;
1654 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1655 *dest = *pb;
1656 return 0;
1657}
1658
1659/* Merge the two runs at stack indices i and i+1.
1660 * Returns 0 on success, -1 on error.
1661 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001662static Py_ssize_t
1663merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001664{
1665 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001666 Py_ssize_t na, nb;
1667 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001668 PyObject *compare;
1669
1670 assert(ms != NULL);
1671 assert(ms->n >= 2);
1672 assert(i >= 0);
1673 assert(i == ms->n - 2 || i == ms->n - 3);
1674
Tim Peterse05f65a2002-08-10 05:21:15 +00001675 pa = ms->pending[i].base;
1676 na = ms->pending[i].len;
1677 pb = ms->pending[i+1].base;
1678 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001679 assert(na > 0 && nb > 0);
1680 assert(pa + na == pb);
1681
1682 /* Record the length of the combined runs; if i is the 3rd-last
1683 * run now, also slide over the last run (which isn't involved
1684 * in this merge). The current run i+1 goes away in any case.
1685 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001686 ms->pending[i].len = na + nb;
1687 if (i == ms->n - 3)
1688 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001689 --ms->n;
1690
1691 /* Where does b start in a? Elements in a before that can be
1692 * ignored (already in place).
1693 */
1694 compare = ms->compare;
1695 k = gallop_right(*pb, pa, na, 0, compare);
1696 if (k < 0)
1697 return -1;
1698 pa += k;
1699 na -= k;
1700 if (na == 0)
1701 return 0;
1702
1703 /* Where does a end in b? Elements in b after that can be
1704 * ignored (already in place).
1705 */
1706 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1707 if (nb <= 0)
1708 return nb;
1709
1710 /* Merge what remains of the runs, using a temp array with
1711 * min(na, nb) elements.
1712 */
1713 if (na <= nb)
1714 return merge_lo(ms, pa, na, pb, nb);
1715 else
1716 return merge_hi(ms, pa, na, pb, nb);
1717}
1718
1719/* Examine the stack of runs waiting to be merged, merging adjacent runs
1720 * until the stack invariants are re-established:
1721 *
1722 * 1. len[-3] > len[-2] + len[-1]
1723 * 2. len[-2] > len[-1]
1724 *
1725 * See listsort.txt for more info.
1726 *
1727 * Returns 0 on success, -1 on error.
1728 */
1729static int
1730merge_collapse(MergeState *ms)
1731{
Tim Peterse05f65a2002-08-10 05:21:15 +00001732 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001733
1734 assert(ms);
1735 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001736 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001737 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1738 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001739 --n;
1740 if (merge_at(ms, n) < 0)
1741 return -1;
1742 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001743 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001744 if (merge_at(ms, n) < 0)
1745 return -1;
1746 }
1747 else
1748 break;
1749 }
1750 return 0;
1751}
1752
1753/* Regardless of invariants, merge all runs on the stack until only one
1754 * remains. This is used at the end of the mergesort.
1755 *
1756 * Returns 0 on success, -1 on error.
1757 */
1758static int
1759merge_force_collapse(MergeState *ms)
1760{
Tim Peterse05f65a2002-08-10 05:21:15 +00001761 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001762
1763 assert(ms);
1764 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001765 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001766 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001767 --n;
1768 if (merge_at(ms, n) < 0)
1769 return -1;
1770 }
1771 return 0;
1772}
1773
1774/* Compute a good value for the minimum run length; natural runs shorter
1775 * than this are boosted artificially via binary insertion.
1776 *
1777 * If n < 64, return n (it's too small to bother with fancy stuff).
1778 * Else if n is an exact power of 2, return 32.
1779 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1780 * strictly less than, an exact power of 2.
1781 *
1782 * See listsort.txt for more info.
1783 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001784static Py_ssize_t
1785merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001786{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001787 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001788
1789 assert(n >= 0);
1790 while (n >= 64) {
1791 r |= n & 1;
1792 n >>= 1;
1793 }
1794 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001795}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001796
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001797/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001798 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001799 which is returned during the undecorate phase. By exposing only the key
1800 during comparisons, the underlying sort stability characteristics are left
1801 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001802 the key instead of a full record. */
1803
1804typedef struct {
1805 PyObject_HEAD
1806 PyObject *key;
1807 PyObject *value;
1808} sortwrapperobject;
1809
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001810PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Anthony Baxter377be112006-04-11 06:54:30 +00001811static PyObject *
1812sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1813static void
1814sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001815
1816static PyTypeObject sortwrapper_type = {
1817 PyObject_HEAD_INIT(&PyType_Type)
1818 0, /* ob_size */
1819 "sortwrapper", /* tp_name */
1820 sizeof(sortwrapperobject), /* tp_basicsize */
1821 0, /* tp_itemsize */
1822 /* methods */
1823 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1824 0, /* tp_print */
1825 0, /* tp_getattr */
1826 0, /* tp_setattr */
1827 0, /* tp_compare */
1828 0, /* tp_repr */
1829 0, /* tp_as_number */
1830 0, /* tp_as_sequence */
1831 0, /* tp_as_mapping */
1832 0, /* tp_hash */
1833 0, /* tp_call */
1834 0, /* tp_str */
1835 PyObject_GenericGetAttr, /* tp_getattro */
1836 0, /* tp_setattro */
1837 0, /* tp_as_buffer */
Tim Petersb38e2b62004-07-29 02:29:26 +00001838 Py_TPFLAGS_DEFAULT |
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001839 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1840 sortwrapper_doc, /* tp_doc */
1841 0, /* tp_traverse */
1842 0, /* tp_clear */
1843 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1844};
1845
Anthony Baxter377be112006-04-11 06:54:30 +00001846
1847static PyObject *
1848sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1849{
1850 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1851 PyErr_SetString(PyExc_TypeError,
1852 "expected a sortwrapperobject");
1853 return NULL;
1854 }
1855 return PyObject_RichCompare(a->key, b->key, op);
1856}
1857
1858static void
1859sortwrapper_dealloc(sortwrapperobject *so)
1860{
1861 Py_XDECREF(so->key);
1862 Py_XDECREF(so->value);
1863 PyObject_Del(so);
1864}
1865
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001866/* Returns a new reference to a sortwrapper.
1867 Consumes the references to the two underlying objects. */
1868
1869static PyObject *
1870build_sortwrapper(PyObject *key, PyObject *value)
1871{
1872 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001873
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001874 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1875 if (so == NULL)
1876 return NULL;
1877 so->key = key;
1878 so->value = value;
1879 return (PyObject *)so;
1880}
1881
1882/* Returns a new reference to the value underlying the wrapper. */
1883static PyObject *
1884sortwrapper_getvalue(PyObject *so)
1885{
1886 PyObject *value;
1887
1888 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001889 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001890 "expected a sortwrapperobject");
1891 return NULL;
1892 }
1893 value = ((sortwrapperobject *)so)->value;
1894 Py_INCREF(value);
1895 return value;
1896}
1897
1898/* Wrapper for user specified cmp functions in combination with a
1899 specified key function. Makes sure the cmp function is presented
1900 with the actual key instead of the sortwrapper */
1901
1902typedef struct {
1903 PyObject_HEAD
1904 PyObject *func;
1905} cmpwrapperobject;
1906
1907static void
1908cmpwrapper_dealloc(cmpwrapperobject *co)
1909{
1910 Py_XDECREF(co->func);
1911 PyObject_Del(co);
1912}
1913
1914static PyObject *
1915cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1916{
1917 PyObject *x, *y, *xx, *yy;
1918
1919 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1920 return NULL;
1921 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001922 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001923 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001924 "expected a sortwrapperobject");
1925 return NULL;
1926 }
1927 xx = ((sortwrapperobject *)x)->key;
1928 yy = ((sortwrapperobject *)y)->key;
1929 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1930}
1931
1932PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1933
1934static PyTypeObject cmpwrapper_type = {
1935 PyObject_HEAD_INIT(&PyType_Type)
1936 0, /* ob_size */
1937 "cmpwrapper", /* tp_name */
1938 sizeof(cmpwrapperobject), /* tp_basicsize */
1939 0, /* tp_itemsize */
1940 /* methods */
1941 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1942 0, /* tp_print */
1943 0, /* tp_getattr */
1944 0, /* tp_setattr */
1945 0, /* tp_compare */
1946 0, /* tp_repr */
1947 0, /* tp_as_number */
1948 0, /* tp_as_sequence */
1949 0, /* tp_as_mapping */
1950 0, /* tp_hash */
1951 (ternaryfunc)cmpwrapper_call, /* tp_call */
1952 0, /* tp_str */
1953 PyObject_GenericGetAttr, /* tp_getattro */
1954 0, /* tp_setattro */
1955 0, /* tp_as_buffer */
1956 Py_TPFLAGS_DEFAULT, /* tp_flags */
1957 cmpwrapper_doc, /* tp_doc */
1958};
1959
1960static PyObject *
1961build_cmpwrapper(PyObject *cmpfunc)
1962{
1963 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001964
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001965 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1966 if (co == NULL)
1967 return NULL;
1968 Py_INCREF(cmpfunc);
1969 co->func = cmpfunc;
1970 return (PyObject *)co;
1971}
1972
Tim Petersa64dc242002-08-01 02:13:36 +00001973/* An adaptive, stable, natural mergesort. See listsort.txt.
1974 * Returns Py_None on success, NULL on error. Even in case of error, the
1975 * list will be some permutation of its input state (nothing is lost or
1976 * duplicated).
1977 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001978static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001979listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001980{
Tim Petersa64dc242002-08-01 02:13:36 +00001981 MergeState ms;
1982 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001983 Py_ssize_t nremaining;
1984 Py_ssize_t minrun;
1985 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001986 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001987 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001988 PyObject *compare = NULL;
1989 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001990 int reverse = 0;
1991 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001992 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001993 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001994 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001995
Tim Petersa64dc242002-08-01 02:13:36 +00001996 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001997 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001998 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001999 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2000 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002001 return NULL;
2002 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002003 if (compare == Py_None)
2004 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002005 if (keyfunc == Py_None)
2006 keyfunc = NULL;
2007 if (compare != NULL && keyfunc != NULL) {
2008 compare = build_cmpwrapper(compare);
2009 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002010 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002011 } else
2012 Py_XINCREF(compare);
2013
Tim Petersb9099c32002-11-12 22:08:10 +00002014 /* The list is temporarily made empty, so that mutations performed
2015 * by comparison functions can't affect the slice of memory we're
2016 * sorting (allowing mutations during sorting is a core-dump
2017 * factory, since ob_item may change).
2018 */
2019 saved_ob_size = self->ob_size;
2020 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002021 saved_allocated = self->allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002022 self->ob_size = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002023 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002024 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002025
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002026 if (keyfunc != NULL) {
2027 for (i=0 ; i < saved_ob_size ; i++) {
2028 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002029 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002030 NULL);
2031 if (key == NULL) {
2032 for (i=i-1 ; i>=0 ; i--) {
2033 kvpair = saved_ob_item[i];
2034 value = sortwrapper_getvalue(kvpair);
2035 saved_ob_item[i] = value;
2036 Py_DECREF(kvpair);
2037 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002038 goto dsu_fail;
2039 }
2040 kvpair = build_sortwrapper(key, value);
2041 if (kvpair == NULL)
2042 goto dsu_fail;
2043 saved_ob_item[i] = kvpair;
2044 }
2045 }
2046
2047 /* Reverse sort stability achieved by initially reversing the list,
2048 applying a stable forward sort, then reversing the final result. */
2049 if (reverse && saved_ob_size > 1)
2050 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2051
2052 merge_init(&ms, compare);
2053
Tim Petersb9099c32002-11-12 22:08:10 +00002054 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002055 if (nremaining < 2)
2056 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002057
Tim Petersa64dc242002-08-01 02:13:36 +00002058 /* March over the array once, left to right, finding natural runs,
2059 * and extending short natural runs to minrun elements.
2060 */
Tim Petersb9099c32002-11-12 22:08:10 +00002061 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002062 hi = lo + nremaining;
2063 minrun = merge_compute_minrun(nremaining);
2064 do {
2065 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002066 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002067
Tim Petersa64dc242002-08-01 02:13:36 +00002068 /* Identify next run. */
2069 n = count_run(lo, hi, compare, &descending);
2070 if (n < 0)
2071 goto fail;
2072 if (descending)
2073 reverse_slice(lo, lo + n);
2074 /* If short, extend to min(minrun, nremaining). */
2075 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002076 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002077 nremaining : minrun;
2078 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2079 goto fail;
2080 n = force;
2081 }
2082 /* Push run onto pending-runs stack, and maybe merge. */
2083 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002084 ms.pending[ms.n].base = lo;
2085 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002086 ++ms.n;
2087 if (merge_collapse(&ms) < 0)
2088 goto fail;
2089 /* Advance to find next run. */
2090 lo += n;
2091 nremaining -= n;
2092 } while (nremaining);
2093 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002094
Tim Petersa64dc242002-08-01 02:13:36 +00002095 if (merge_force_collapse(&ms) < 0)
2096 goto fail;
2097 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002098 assert(ms.pending[0].base == saved_ob_item);
2099 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002100
2101succeed:
2102 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002103fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002104 if (keyfunc != NULL) {
2105 for (i=0 ; i < saved_ob_size ; i++) {
2106 kvpair = saved_ob_item[i];
2107 value = sortwrapper_getvalue(kvpair);
2108 saved_ob_item[i] = value;
2109 Py_DECREF(kvpair);
2110 }
2111 }
2112
Armin Rigo93677f02004-07-29 12:40:23 +00002113 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002114 /* The user mucked with the list during the sort,
2115 * and we don't already have another error to report.
2116 */
2117 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2118 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002119 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002120
2121 if (reverse && saved_ob_size > 1)
2122 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2123
2124 merge_freemem(&ms);
2125
2126dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002127 final_ob_item = self->ob_item;
2128 i = self->ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002129 self->ob_size = saved_ob_size;
2130 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002131 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002132 if (final_ob_item != NULL) {
2133 /* we cannot use list_clear() for this because it does not
2134 guarantee that the list is really empty when it returns */
2135 while (--i >= 0) {
2136 Py_XDECREF(final_ob_item[i]);
2137 }
2138 PyMem_FREE(final_ob_item);
2139 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002140 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002141 Py_XINCREF(result);
2142 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002143}
Tim Peters330f9e92002-07-19 07:05:44 +00002144#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002145#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002146
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002147int
Fred Drakea2f55112000-07-09 15:16:51 +00002148PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002149{
2150 if (v == NULL || !PyList_Check(v)) {
2151 PyErr_BadInternalCall();
2152 return -1;
2153 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002154 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002155 if (v == NULL)
2156 return -1;
2157 Py_DECREF(v);
2158 return 0;
2159}
2160
Guido van Rossumb86c5492001-02-12 22:06:02 +00002161static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002162listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002163{
Tim Peters326b4482002-07-19 04:04:16 +00002164 if (self->ob_size > 1)
2165 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002166 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002167}
2168
Guido van Rossum84c76f51990-10-30 13:32:20 +00002169int
Fred Drakea2f55112000-07-09 15:16:51 +00002170PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002171{
Tim Peters6063e262002-08-08 01:06:39 +00002172 PyListObject *self = (PyListObject *)v;
2173
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002174 if (v == NULL || !PyList_Check(v)) {
2175 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002176 return -1;
2177 }
Tim Peters6063e262002-08-08 01:06:39 +00002178 if (self->ob_size > 1)
2179 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002180 return 0;
2181}
2182
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002183PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002184PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002185{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002186 PyObject *w;
2187 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002188 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002189 if (v == NULL || !PyList_Check(v)) {
2190 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002191 return NULL;
2192 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002193 n = ((PyListObject *)v)->ob_size;
2194 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002195 if (w == NULL)
2196 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002197 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002198 memcpy((void *)p,
2199 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002200 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002201 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002202 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002203 p++;
2204 }
2205 return w;
2206}
2207
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002208static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002209listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002210{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002211 Py_ssize_t i, start=0, stop=self->ob_size;
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002212 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002213
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002214 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2215 _PyEval_SliceIndex, &start,
2216 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002217 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002218 if (start < 0) {
2219 start += self->ob_size;
2220 if (start < 0)
2221 start = 0;
2222 }
2223 if (stop < 0) {
2224 stop += self->ob_size;
2225 if (stop < 0)
2226 stop = 0;
2227 }
Neal Norwitzf0769532004-08-13 03:18:29 +00002228 for (i = start; i < stop && i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002229 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2230 if (cmp > 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002231 return PyInt_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002232 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002233 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002234 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002235 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002236 return NULL;
2237}
2238
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002239static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002240listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002241{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002242 Py_ssize_t count = 0;
2243 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002244
Guido van Rossume6f7d181991-10-20 20:20:40 +00002245 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002246 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2247 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002248 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002249 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002250 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002251 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002252 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002253}
2254
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002255static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002256listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002257{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002258 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002259
Guido van Rossumed98d481991-03-06 13:07:53 +00002260 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002261 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2262 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002263 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002264 (PyObject *)NULL) == 0)
2265 Py_RETURN_NONE;
2266 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002267 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002268 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002269 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002270 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002271 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002272 return NULL;
2273}
2274
Jeremy Hylton8caad492000-06-23 14:18:11 +00002275static int
2276list_traverse(PyListObject *o, visitproc visit, void *arg)
2277{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002278 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002279
Thomas Woutersc6e55062006-04-15 21:47:09 +00002280 for (i = o->ob_size; --i >= 0; )
2281 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002282 return 0;
2283}
2284
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002285static PyObject *
2286list_richcompare(PyObject *v, PyObject *w, int op)
2287{
2288 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002289 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002290
2291 if (!PyList_Check(v) || !PyList_Check(w)) {
2292 Py_INCREF(Py_NotImplemented);
2293 return Py_NotImplemented;
2294 }
2295
2296 vl = (PyListObject *)v;
2297 wl = (PyListObject *)w;
2298
2299 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
2300 /* Shortcut: if the lengths differ, the lists differ */
2301 PyObject *res;
2302 if (op == Py_EQ)
2303 res = Py_False;
2304 else
2305 res = Py_True;
2306 Py_INCREF(res);
2307 return res;
2308 }
2309
2310 /* Search for the first index where items are different */
2311 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
2312 int k = PyObject_RichCompareBool(vl->ob_item[i],
2313 wl->ob_item[i], Py_EQ);
2314 if (k < 0)
2315 return NULL;
2316 if (!k)
2317 break;
2318 }
2319
2320 if (i >= vl->ob_size || i >= wl->ob_size) {
2321 /* No more items to compare -- compare sizes */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002322 Py_ssize_t vs = vl->ob_size;
2323 Py_ssize_t ws = wl->ob_size;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002324 int cmp;
2325 PyObject *res;
2326 switch (op) {
2327 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002328 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002329 case Py_EQ: cmp = vs == ws; break;
2330 case Py_NE: cmp = vs != ws; break;
2331 case Py_GT: cmp = vs > ws; break;
2332 case Py_GE: cmp = vs >= ws; break;
2333 default: return NULL; /* cannot happen */
2334 }
2335 if (cmp)
2336 res = Py_True;
2337 else
2338 res = Py_False;
2339 Py_INCREF(res);
2340 return res;
2341 }
2342
2343 /* We have an item that differs -- shortcuts for EQ/NE */
2344 if (op == Py_EQ) {
2345 Py_INCREF(Py_False);
2346 return Py_False;
2347 }
2348 if (op == Py_NE) {
2349 Py_INCREF(Py_True);
2350 return Py_True;
2351 }
2352
2353 /* Compare the final item again using the proper operator */
2354 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2355}
2356
Tim Peters6d6c1a32001-08-02 04:15:00 +00002357static int
2358list_init(PyListObject *self, PyObject *args, PyObject *kw)
2359{
2360 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002361 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002362
2363 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2364 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002365
2366 /* Verify list invariants established by PyType_GenericAlloc() */
Armin Rigoa37bbf22004-07-30 11:20:18 +00002367 assert(0 <= self->ob_size);
2368 assert(self->ob_size <= self->allocated || self->allocated == -1);
2369 assert(self->ob_item != NULL ||
2370 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002371
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002372 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002373 if (self->ob_item != NULL) {
2374 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002375 }
2376 if (arg != NULL) {
2377 PyObject *rv = listextend(self, arg);
2378 if (rv == NULL)
2379 return -1;
2380 Py_DECREF(rv);
2381 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002382 return 0;
2383}
2384
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002385static long
2386list_nohash(PyObject *self)
2387{
2388 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2389 return -1;
2390}
2391
Raymond Hettinger1021c442003-11-07 15:38:09 +00002392static PyObject *list_iter(PyObject *seq);
2393static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2394
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002395PyDoc_STRVAR(getitem_doc,
2396"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002397PyDoc_STRVAR(reversed_doc,
2398"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002399PyDoc_STRVAR(append_doc,
2400"L.append(object) -- append object to end");
2401PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002402"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002403PyDoc_STRVAR(insert_doc,
2404"L.insert(index, object) -- insert object before index");
2405PyDoc_STRVAR(pop_doc,
2406"L.pop([index]) -> item -- remove and return item at index (default last)");
2407PyDoc_STRVAR(remove_doc,
2408"L.remove(value) -- remove first occurrence of value");
2409PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002410"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002411PyDoc_STRVAR(count_doc,
2412"L.count(value) -> integer -- return number of occurrences of value");
2413PyDoc_STRVAR(reverse_doc,
2414"L.reverse() -- reverse *IN PLACE*");
2415PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002416"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2417cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002418
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002419static PyObject *list_subscript(PyListObject*, PyObject*);
2420
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002421static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002422 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002423 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002424 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002425 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002426 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002427 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002428 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002429 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002430 {"count", (PyCFunction)listcount, METH_O, count_doc},
2431 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002432 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002433 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002434};
2435
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002436static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002437 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002438 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002439 (ssizeargfunc)list_repeat, /* sq_repeat */
2440 (ssizeargfunc)list_item, /* sq_item */
2441 (ssizessizeargfunc)list_slice, /* sq_slice */
2442 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2443 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002444 (objobjproc)list_contains, /* sq_contains */
2445 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002446 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002447};
2448
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002449PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002450"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002451"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002452
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002453#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX)
2454
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002455static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002456list_subscript(PyListObject* self, PyObject* item)
2457{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002458 PyNumberMethods *nb = item->ob_type->tp_as_number;
2459 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
2460 Py_ssize_t i = nb->nb_index(item);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002461 if (i == -1 && PyErr_Occurred())
2462 return NULL;
2463 if (i < 0)
2464 i += PyList_GET_SIZE(self);
2465 return list_item(self, i);
2466 }
2467 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002468 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002469 PyObject* result;
2470 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002471 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002472
2473 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2474 &start, &stop, &step, &slicelength) < 0) {
2475 return NULL;
2476 }
2477
2478 if (slicelength <= 0) {
2479 return PyList_New(0);
2480 }
2481 else {
2482 result = PyList_New(slicelength);
2483 if (!result) return NULL;
2484
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002485 src = self->ob_item;
2486 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002487 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002488 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002489 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002490 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002491 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002492 }
Tim Peters3b01a122002-07-19 02:35:45 +00002493
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002494 return result;
2495 }
2496 }
2497 else {
2498 PyErr_SetString(PyExc_TypeError,
2499 "list indices must be integers");
2500 return NULL;
2501 }
2502}
2503
Tim Peters3b01a122002-07-19 02:35:45 +00002504static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002505list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2506{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002507 PyNumberMethods *nb = item->ob_type->tp_as_number;
2508 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
2509 Py_ssize_t i = nb->nb_index(item);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002510 if (i == -1 && PyErr_Occurred())
2511 return -1;
2512 if (i < 0)
2513 i += PyList_GET_SIZE(self);
2514 return list_ass_item(self, i, value);
2515 }
2516 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002517 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002518
2519 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2520 &start, &stop, &step, &slicelength) < 0) {
2521 return -1;
2522 }
2523
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002524 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2525 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2526 return list_ass_slice(self, start, stop, value);
2527
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002528 if (value == NULL) {
2529 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002530 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002531 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002532
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002533 if (slicelength <= 0)
2534 return 0;
2535
2536 if (step < 0) {
2537 stop = start + 1;
2538 start = stop + step*(slicelength - 1) - 1;
2539 step = -step;
2540 }
2541
2542 garbage = (PyObject**)
2543 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002544
2545 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002546 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002547 for (cur = start, i = 0;
2548 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002549 cur += step, i++) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002550 Py_ssize_t lim = step;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002551
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002552 garbage[i] = PyList_GET_ITEM(self, cur);
2553
Michael W. Hudson56796f62002-07-29 14:35:04 +00002554 if (cur + step >= self->ob_size) {
2555 lim = self->ob_size - cur - 1;
2556 }
2557
Tim Petersb38e2b62004-07-29 02:29:26 +00002558 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002559 self->ob_item + cur + 1,
2560 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002561 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002562
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002563 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002564 cur < self->ob_size; cur++) {
2565 PyList_SET_ITEM(self, cur - slicelength,
2566 PyList_GET_ITEM(self, cur));
2567 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002568
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002569 self->ob_size -= slicelength;
Raymond Hettingerd4ff7412004-03-15 09:01:31 +00002570 list_resize(self, self->ob_size);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002571
2572 for (i = 0; i < slicelength; i++) {
2573 Py_DECREF(garbage[i]);
2574 }
2575 PyMem_FREE(garbage);
2576
2577 return 0;
2578 }
2579 else {
2580 /* assign slice */
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002581 PyObject **garbage, *ins, *seq, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002582 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002583
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002584 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002585 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002586 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002587 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002588 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002589 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002590 seq = PySequence_Fast(value,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002591 "must assign iterable to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002592 if (!seq)
2593 return -1;
2594 }
2595
2596 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2597 PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00002598 "attempt to assign sequence of size %zd to extended slice of size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002599 PySequence_Fast_GET_SIZE(seq),
2600 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002601 Py_DECREF(seq);
2602 return -1;
2603 }
2604
2605 if (!slicelength) {
2606 Py_DECREF(seq);
2607 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002608 }
2609
2610 garbage = (PyObject**)
2611 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Tim Peters3b01a122002-07-19 02:35:45 +00002612
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002613 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002614 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002615 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002616 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002617 garbage[i] = selfitems[cur];
2618 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002619 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002620 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002621 }
2622
2623 for (i = 0; i < slicelength; i++) {
2624 Py_DECREF(garbage[i]);
2625 }
Tim Peters3b01a122002-07-19 02:35:45 +00002626
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002627 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002628 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002629
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002630 return 0;
2631 }
Tim Peters3b01a122002-07-19 02:35:45 +00002632 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002633 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002634 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002635 "list indices must be integers");
2636 return -1;
2637 }
2638}
2639
2640static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002641 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002642 (binaryfunc)list_subscript,
2643 (objobjargproc)list_ass_subscript
2644};
2645
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002646PyTypeObject PyList_Type = {
2647 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002648 0,
2649 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002650 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002651 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002652 (destructor)list_dealloc, /* tp_dealloc */
2653 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002654 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002655 0, /* tp_setattr */
2656 0, /* tp_compare */
2657 (reprfunc)list_repr, /* tp_repr */
2658 0, /* tp_as_number */
2659 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002660 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002661 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002662 0, /* tp_call */
2663 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002664 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002665 0, /* tp_setattro */
2666 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002667 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002668 Py_TPFLAGS_BASETYPE, /* tp_flags */
2669 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002670 (traverseproc)list_traverse, /* tp_traverse */
2671 (inquiry)list_clear, /* tp_clear */
2672 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002673 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002674 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002675 0, /* tp_iternext */
2676 list_methods, /* tp_methods */
2677 0, /* tp_members */
2678 0, /* tp_getset */
2679 0, /* tp_base */
2680 0, /* tp_dict */
2681 0, /* tp_descr_get */
2682 0, /* tp_descr_set */
2683 0, /* tp_dictoffset */
2684 (initproc)list_init, /* tp_init */
2685 PyType_GenericAlloc, /* tp_alloc */
2686 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002687 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002688};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002689
2690
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002691/*********************** List Iterator **************************/
2692
2693typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002694 PyObject_HEAD
2695 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002696 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002697} listiterobject;
2698
Anthony Baxter377be112006-04-11 06:54:30 +00002699static PyObject *list_iter(PyObject *);
2700static void listiter_dealloc(listiterobject *);
2701static int listiter_traverse(listiterobject *, visitproc, void *);
2702static PyObject *listiter_next(listiterobject *);
2703static PyObject *listiter_len(listiterobject *);
2704
2705PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2706
2707static PyMethodDef listiter_methods[] = {
2708 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2709 {NULL, NULL} /* sentinel */
2710};
2711
2712PyTypeObject PyListIter_Type = {
2713 PyObject_HEAD_INIT(&PyType_Type)
2714 0, /* ob_size */
2715 "listiterator", /* tp_name */
2716 sizeof(listiterobject), /* tp_basicsize */
2717 0, /* tp_itemsize */
2718 /* methods */
2719 (destructor)listiter_dealloc, /* tp_dealloc */
2720 0, /* tp_print */
2721 0, /* tp_getattr */
2722 0, /* tp_setattr */
2723 0, /* tp_compare */
2724 0, /* tp_repr */
2725 0, /* tp_as_number */
2726 0, /* tp_as_sequence */
2727 0, /* tp_as_mapping */
2728 0, /* tp_hash */
2729 0, /* tp_call */
2730 0, /* tp_str */
2731 PyObject_GenericGetAttr, /* tp_getattro */
2732 0, /* tp_setattro */
2733 0, /* tp_as_buffer */
2734 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2735 0, /* tp_doc */
2736 (traverseproc)listiter_traverse, /* tp_traverse */
2737 0, /* tp_clear */
2738 0, /* tp_richcompare */
2739 0, /* tp_weaklistoffset */
2740 PyObject_SelfIter, /* tp_iter */
2741 (iternextfunc)listiter_next, /* tp_iternext */
2742 listiter_methods, /* tp_methods */
2743 0, /* tp_members */
2744};
2745
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002746
Guido van Rossum5086e492002-07-16 15:56:52 +00002747static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002748list_iter(PyObject *seq)
2749{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002750 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002751
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002752 if (!PyList_Check(seq)) {
2753 PyErr_BadInternalCall();
2754 return NULL;
2755 }
2756 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2757 if (it == NULL)
2758 return NULL;
2759 it->it_index = 0;
2760 Py_INCREF(seq);
2761 it->it_seq = (PyListObject *)seq;
2762 _PyObject_GC_TRACK(it);
2763 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002764}
2765
2766static void
2767listiter_dealloc(listiterobject *it)
2768{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002769 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002770 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002771 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002772}
2773
2774static int
2775listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2776{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002777 Py_VISIT(it->it_seq);
2778 return 0;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002779}
2780
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002781static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002782listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002783{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002784 PyListObject *seq;
2785 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002786
Tim Peters93b2cc42002-06-01 05:22:55 +00002787 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002788 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002789 if (seq == NULL)
2790 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002791 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002792
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002793 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002794 item = PyList_GET_ITEM(seq, it->it_index);
2795 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002796 Py_INCREF(item);
2797 return item;
2798 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002799
2800 Py_DECREF(seq);
2801 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002802 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002803}
2804
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002805static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +00002806listiter_len(listiterobject *it)
2807{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002808 Py_ssize_t len;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002809 if (it->it_seq) {
2810 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2811 if (len >= 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002812 return PyInt_FromSsize_t(len);
Raymond Hettinger40a03822004-04-12 13:05:09 +00002813 }
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002814 return PyInt_FromLong(0);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002815}
Anthony Baxter377be112006-04-11 06:54:30 +00002816/*********************** List Reverse Iterator **************************/
Raymond Hettinger435bf582004-03-18 22:43:10 +00002817
Anthony Baxter377be112006-04-11 06:54:30 +00002818typedef struct {
2819 PyObject_HEAD
2820 Py_ssize_t it_index;
2821 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2822} listreviterobject;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002823
Anthony Baxter377be112006-04-11 06:54:30 +00002824static PyObject *list_reversed(PyListObject *, PyObject *);
2825static void listreviter_dealloc(listreviterobject *);
2826static int listreviter_traverse(listreviterobject *, visitproc, void *);
2827static PyObject *listreviter_next(listreviterobject *);
2828static Py_ssize_t listreviter_len(listreviterobject *);
2829
2830static PySequenceMethods listreviter_as_sequence = {
2831 (lenfunc)listreviter_len, /* sq_length */
2832 0, /* sq_concat */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002833};
2834
Anthony Baxter377be112006-04-11 06:54:30 +00002835PyTypeObject PyListRevIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002836 PyObject_HEAD_INIT(&PyType_Type)
2837 0, /* ob_size */
Anthony Baxter377be112006-04-11 06:54:30 +00002838 "listreverseiterator", /* tp_name */
2839 sizeof(listreviterobject), /* tp_basicsize */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002840 0, /* tp_itemsize */
2841 /* methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002842 (destructor)listreviter_dealloc, /* tp_dealloc */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002843 0, /* tp_print */
2844 0, /* tp_getattr */
2845 0, /* tp_setattr */
2846 0, /* tp_compare */
2847 0, /* tp_repr */
2848 0, /* tp_as_number */
Anthony Baxter377be112006-04-11 06:54:30 +00002849 &listreviter_as_sequence, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002850 0, /* tp_as_mapping */
2851 0, /* tp_hash */
2852 0, /* tp_call */
2853 0, /* tp_str */
2854 PyObject_GenericGetAttr, /* tp_getattro */
2855 0, /* tp_setattro */
2856 0, /* tp_as_buffer */
2857 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2858 0, /* tp_doc */
Anthony Baxter377be112006-04-11 06:54:30 +00002859 (traverseproc)listreviter_traverse, /* tp_traverse */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002860 0, /* tp_clear */
2861 0, /* tp_richcompare */
2862 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002863 PyObject_SelfIter, /* tp_iter */
Anthony Baxter377be112006-04-11 06:54:30 +00002864 (iternextfunc)listreviter_next, /* tp_iternext */
2865 0,
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002866};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002867
Raymond Hettinger1021c442003-11-07 15:38:09 +00002868static PyObject *
2869list_reversed(PyListObject *seq, PyObject *unused)
2870{
2871 listreviterobject *it;
2872
2873 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2874 if (it == NULL)
2875 return NULL;
2876 assert(PyList_Check(seq));
2877 it->it_index = PyList_GET_SIZE(seq) - 1;
2878 Py_INCREF(seq);
2879 it->it_seq = seq;
2880 PyObject_GC_Track(it);
2881 return (PyObject *)it;
2882}
2883
2884static void
2885listreviter_dealloc(listreviterobject *it)
2886{
2887 PyObject_GC_UnTrack(it);
2888 Py_XDECREF(it->it_seq);
2889 PyObject_GC_Del(it);
2890}
2891
2892static int
2893listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2894{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002895 Py_VISIT(it->it_seq);
2896 return 0;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002897}
2898
2899static PyObject *
2900listreviter_next(listreviterobject *it)
2901{
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002902 PyObject *item;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002903 Py_ssize_t index = it->it_index;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002904 PyListObject *seq = it->it_seq;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002905
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002906 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2907 item = PyList_GET_ITEM(seq, index);
Raymond Hettinger1021c442003-11-07 15:38:09 +00002908 it->it_index--;
2909 Py_INCREF(item);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002910 return item;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002911 }
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002912 it->it_index = -1;
2913 if (seq != NULL) {
2914 it->it_seq = NULL;
2915 Py_DECREF(seq);
2916 }
2917 return NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002918}
2919
Martin v. Löwis18e16552006-02-15 17:27:45 +00002920static Py_ssize_t
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002921listreviter_len(listreviterobject *it)
2922{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002923 Py_ssize_t len = it->it_index + 1;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002924 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2925 return 0;
2926 return len;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002927}
2928