blob: 739a571b9b5b6129ce398c66f664fbe90aaafbbe [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;
Armin Rigo4b63c212006-10-04 11:44:06 +0000866 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000867 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000868
Armin Rigo4b63c212006-10-04 11:44:06 +0000869 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000870 return NULL;
Armin Rigo4b63c212006-10-04 11:44:06 +0000871
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000872 if (self->ob_size == 0) {
873 /* Special-case most common failure cause */
874 PyErr_SetString(PyExc_IndexError, "pop from empty list");
875 return NULL;
876 }
877 if (i < 0)
878 i += self->ob_size;
879 if (i < 0 || i >= self->ob_size) {
880 PyErr_SetString(PyExc_IndexError, "pop index out of range");
881 return NULL;
882 }
883 v = self->ob_item[i];
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000884 if (i == self->ob_size - 1) {
Tim Peters8fc4a912004-07-31 21:53:19 +0000885 status = list_resize(self, self->ob_size - 1);
886 assert(status >= 0);
887 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000888 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000889 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000890 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
891 assert(status >= 0);
892 /* Use status, so that in a release build compilers don't
893 * complain about the unused name.
894 */
Brett Cannon651dd522004-08-08 21:21:18 +0000895 (void) status;
896
897 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000898}
899
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000900/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
901static void
902reverse_slice(PyObject **lo, PyObject **hi)
903{
904 assert(lo && hi);
905
906 --hi;
907 while (lo < hi) {
908 PyObject *t = *lo;
909 *lo = *hi;
910 *hi = t;
911 ++lo;
912 --hi;
913 }
914}
915
Tim Petersa64dc242002-08-01 02:13:36 +0000916/* Lots of code for an adaptive, stable, natural mergesort. There are many
917 * pieces to this algorithm; read listsort.txt for overviews and details.
918 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000919
Guido van Rossum3f236de1996-12-10 23:55:39 +0000920/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000921 * comparison function (any callable Python object), which must not be
922 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
923 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000924 * Returns -1 on error, 1 if x < y, 0 if x >= y.
925 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000926static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000927islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000928{
Tim Petersf2a04732002-07-11 21:46:16 +0000929 PyObject *res;
930 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000931 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000932
Tim Peters66860f62002-08-04 17:47:26 +0000933 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000934 /* Call the user's comparison function and translate the 3-way
935 * result into true or false (or error).
936 */
Tim Petersf2a04732002-07-11 21:46:16 +0000937 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000938 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000939 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000940 Py_INCREF(x);
941 Py_INCREF(y);
942 PyTuple_SET_ITEM(args, 0, x);
943 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000944 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000946 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000947 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 if (!PyInt_Check(res)) {
949 Py_DECREF(res);
950 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000951 "comparison function must return int");
Tim Petersa8c974c2002-07-19 03:30:57 +0000952 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000953 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 i = PyInt_AsLong(res);
955 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000956 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000957}
958
Tim Peters66860f62002-08-04 17:47:26 +0000959/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
960 * islt. This avoids a layer of function call in the usual case, and
961 * sorting does many comparisons.
962 * Returns -1 on error, 1 if x < y, 0 if x >= y.
963 */
964#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
965 PyObject_RichCompareBool(X, Y, Py_LT) : \
966 islt(X, Y, COMPARE))
967
968/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000969 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
970 started. It makes more sense in context <wink>. X and Y are PyObject*s.
971*/
Tim Peters66860f62002-08-04 17:47:26 +0000972#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000973 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000974
975/* binarysort is the best method for sorting small arrays: it does
976 few compares, but can do data movement quadratic in the number of
977 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000978 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000979 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000980 On entry, must have lo <= start <= hi, and that [lo, start) is already
981 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000982 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000983 Even in case of error, the output slice will be some permutation of
984 the input (nothing is lost or duplicated).
985*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000986static int
Fred Drakea2f55112000-07-09 15:16:51 +0000987binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
988 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000989{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000990 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000991 register PyObject **l, **p, **r;
992 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000993
Tim Petersa8c974c2002-07-19 03:30:57 +0000994 assert(lo <= start && start <= hi);
995 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000996 if (lo == start)
997 ++start;
998 for (; start < hi; ++start) {
999 /* set l to where *start belongs */
1000 l = lo;
1001 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001002 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +00001003 /* Invariants:
1004 * pivot >= all in [lo, l).
1005 * pivot < all in [r, start).
1006 * The second is vacuously true at the start.
1007 */
1008 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001009 do {
1010 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +00001011 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001012 r = p;
1013 else
Tim Peters0fe977c2002-07-19 06:12:32 +00001014 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001015 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001016 assert(l == r);
1017 /* The invariants still hold, so pivot >= all in [lo, l) and
1018 pivot < all in [l, start), so pivot belongs at l. Note
1019 that if there are elements equal to pivot, l points to the
1020 first slot after them -- that's why this sort is stable.
1021 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001022 Caution: using memmove is much slower under MSVC 5;
1023 we're not usually moving many slots. */
1024 for (p = start; p > l; --p)
1025 *p = *(p-1);
1026 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001027 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001028 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001029
1030 fail:
1031 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001032}
1033
Tim Petersa64dc242002-08-01 02:13:36 +00001034/*
1035Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1036is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001037
Tim Petersa64dc242002-08-01 02:13:36 +00001038 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001039
Tim Petersa64dc242002-08-01 02:13:36 +00001040or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001041
Tim Petersa64dc242002-08-01 02:13:36 +00001042 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001043
Tim Petersa64dc242002-08-01 02:13:36 +00001044Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1045For its intended use in a stable mergesort, the strictness of the defn of
1046"descending" is needed so that the caller can safely reverse a descending
1047sequence without violating stability (strict > ensures there are no equal
1048elements to get out of order).
1049
1050Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001051*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001052static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001053count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001054{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001055 Py_ssize_t k;
1056 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001057
Tim Petersa64dc242002-08-01 02:13:36 +00001058 assert(lo < hi);
1059 *descending = 0;
1060 ++lo;
1061 if (lo == hi)
1062 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001063
Tim Petersa64dc242002-08-01 02:13:36 +00001064 n = 2;
1065 IFLT(*lo, *(lo-1)) {
1066 *descending = 1;
1067 for (lo = lo+1; lo < hi; ++lo, ++n) {
1068 IFLT(*lo, *(lo-1))
1069 ;
1070 else
1071 break;
1072 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001073 }
Tim Petersa64dc242002-08-01 02:13:36 +00001074 else {
1075 for (lo = lo+1; lo < hi; ++lo, ++n) {
1076 IFLT(*lo, *(lo-1))
1077 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001078 }
1079 }
1080
Tim Petersa64dc242002-08-01 02:13:36 +00001081 return n;
1082fail:
1083 return -1;
1084}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001085
Tim Petersa64dc242002-08-01 02:13:36 +00001086/*
1087Locate the proper position of key in a sorted vector; if the vector contains
1088an element equal to key, return the position immediately to the left of
1089the leftmost equal element. [gallop_right() does the same except returns
1090the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001091
Tim Petersa64dc242002-08-01 02:13:36 +00001092"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001093
Tim Petersa64dc242002-08-01 02:13:36 +00001094"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1095hint is to the final result, the faster this runs.
1096
1097The return value is the int k in 0..n such that
1098
1099 a[k-1] < key <= a[k]
1100
1101pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1102key belongs at index k; or, IOW, the first k elements of a should precede
1103key, and the last n-k should follow key.
1104
1105Returns -1 on error. See listsort.txt for info on the method.
1106*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001107static Py_ssize_t
1108gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001109{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001110 Py_ssize_t ofs;
1111 Py_ssize_t lastofs;
1112 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001113
1114 assert(key && a && n > 0 && hint >= 0 && hint < n);
1115
1116 a += hint;
1117 lastofs = 0;
1118 ofs = 1;
1119 IFLT(*a, key) {
1120 /* a[hint] < key -- gallop right, until
1121 * a[hint + lastofs] < key <= a[hint + ofs]
1122 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001123 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001124 while (ofs < maxofs) {
1125 IFLT(a[ofs], key) {
1126 lastofs = ofs;
1127 ofs = (ofs << 1) + 1;
1128 if (ofs <= 0) /* int overflow */
1129 ofs = maxofs;
1130 }
1131 else /* key <= a[hint + ofs] */
1132 break;
1133 }
1134 if (ofs > maxofs)
1135 ofs = maxofs;
1136 /* Translate back to offsets relative to &a[0]. */
1137 lastofs += hint;
1138 ofs += hint;
1139 }
1140 else {
1141 /* key <= a[hint] -- gallop left, until
1142 * a[hint - ofs] < key <= a[hint - lastofs]
1143 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001144 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001145 while (ofs < maxofs) {
1146 IFLT(*(a-ofs), key)
1147 break;
1148 /* key <= a[hint - ofs] */
1149 lastofs = ofs;
1150 ofs = (ofs << 1) + 1;
1151 if (ofs <= 0) /* int overflow */
1152 ofs = maxofs;
1153 }
1154 if (ofs > maxofs)
1155 ofs = maxofs;
1156 /* Translate back to positive offsets relative to &a[0]. */
1157 k = lastofs;
1158 lastofs = hint - ofs;
1159 ofs = hint - k;
1160 }
1161 a -= hint;
1162
1163 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1164 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1165 * right of lastofs but no farther right than ofs. Do a binary
1166 * search, with invariant a[lastofs-1] < key <= a[ofs].
1167 */
1168 ++lastofs;
1169 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001170 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001171
1172 IFLT(a[m], key)
1173 lastofs = m+1; /* a[m] < key */
1174 else
1175 ofs = m; /* key <= a[m] */
1176 }
1177 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1178 return ofs;
1179
1180fail:
1181 return -1;
1182}
1183
1184/*
1185Exactly like gallop_left(), except that if key already exists in a[0:n],
1186finds the position immediately to the right of the rightmost equal value.
1187
1188The return value is the int k in 0..n such that
1189
1190 a[k-1] <= key < a[k]
1191
1192or -1 if error.
1193
1194The code duplication is massive, but this is enough different given that
1195we're sticking to "<" comparisons that it's much harder to follow if
1196written as one routine with yet another "left or right?" flag.
1197*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001198static Py_ssize_t
1199gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001200{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001201 Py_ssize_t ofs;
1202 Py_ssize_t lastofs;
1203 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001204
1205 assert(key && a && n > 0 && hint >= 0 && hint < n);
1206
1207 a += hint;
1208 lastofs = 0;
1209 ofs = 1;
1210 IFLT(key, *a) {
1211 /* key < a[hint] -- gallop left, until
1212 * a[hint - ofs] <= key < a[hint - lastofs]
1213 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001214 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001215 while (ofs < maxofs) {
1216 IFLT(key, *(a-ofs)) {
1217 lastofs = ofs;
1218 ofs = (ofs << 1) + 1;
1219 if (ofs <= 0) /* int overflow */
1220 ofs = maxofs;
1221 }
1222 else /* a[hint - ofs] <= key */
1223 break;
1224 }
1225 if (ofs > maxofs)
1226 ofs = maxofs;
1227 /* Translate back to positive offsets relative to &a[0]. */
1228 k = lastofs;
1229 lastofs = hint - ofs;
1230 ofs = hint - k;
1231 }
1232 else {
1233 /* a[hint] <= key -- gallop right, until
1234 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001235 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001236 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001237 while (ofs < maxofs) {
1238 IFLT(key, a[ofs])
1239 break;
1240 /* a[hint + ofs] <= key */
1241 lastofs = ofs;
1242 ofs = (ofs << 1) + 1;
1243 if (ofs <= 0) /* int overflow */
1244 ofs = maxofs;
1245 }
1246 if (ofs > maxofs)
1247 ofs = maxofs;
1248 /* Translate back to offsets relative to &a[0]. */
1249 lastofs += hint;
1250 ofs += hint;
1251 }
1252 a -= hint;
1253
1254 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1255 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1256 * right of lastofs but no farther right than ofs. Do a binary
1257 * search, with invariant a[lastofs-1] <= key < a[ofs].
1258 */
1259 ++lastofs;
1260 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001261 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001262
1263 IFLT(key, a[m])
1264 ofs = m; /* key < a[m] */
1265 else
1266 lastofs = m+1; /* a[m] <= key */
1267 }
1268 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1269 return ofs;
1270
1271fail:
1272 return -1;
1273}
1274
1275/* The maximum number of entries in a MergeState's pending-runs stack.
1276 * This is enough to sort arrays of size up to about
1277 * 32 * phi ** MAX_MERGE_PENDING
1278 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1279 * with 2**64 elements.
1280 */
1281#define MAX_MERGE_PENDING 85
1282
Tim Peterse05f65a2002-08-10 05:21:15 +00001283/* When we get into galloping mode, we stay there until both runs win less
1284 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001285 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001286#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001287
1288/* Avoid malloc for small temp arrays. */
1289#define MERGESTATE_TEMP_SIZE 256
1290
1291/* One MergeState exists on the stack per invocation of mergesort. It's just
1292 * a convenient way to pass state around among the helper functions.
1293 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001294struct s_slice {
1295 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001296 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001297};
1298
Tim Petersa64dc242002-08-01 02:13:36 +00001299typedef struct s_MergeState {
1300 /* The user-supplied comparison function. or NULL if none given. */
1301 PyObject *compare;
1302
Tim Peterse05f65a2002-08-10 05:21:15 +00001303 /* This controls when we get *into* galloping mode. It's initialized
1304 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1305 * random data, and lower for highly structured data.
1306 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001307 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001308
Tim Petersa64dc242002-08-01 02:13:36 +00001309 /* 'a' is temp storage to help with merges. It contains room for
1310 * alloced entries.
1311 */
1312 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001313 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001314
1315 /* A stack of n pending runs yet to be merged. Run #i starts at
1316 * address base[i] and extends for len[i] elements. It's always
1317 * true (so long as the indices are in bounds) that
1318 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001319 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001320 *
1321 * so we could cut the storage for this, but it's a minor amount,
1322 * and keeping all the info explicit simplifies the code.
1323 */
1324 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001325 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001326
1327 /* 'a' points to this when possible, rather than muck with malloc. */
1328 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1329} MergeState;
1330
1331/* Conceptually a MergeState's constructor. */
1332static void
1333merge_init(MergeState *ms, PyObject *compare)
1334{
1335 assert(ms != NULL);
1336 ms->compare = compare;
1337 ms->a = ms->temparray;
1338 ms->alloced = MERGESTATE_TEMP_SIZE;
1339 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001340 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001341}
1342
1343/* Free all the temp memory owned by the MergeState. This must be called
1344 * when you're done with a MergeState, and may be called before then if
1345 * you want to free the temp memory early.
1346 */
1347static void
1348merge_freemem(MergeState *ms)
1349{
1350 assert(ms != NULL);
1351 if (ms->a != ms->temparray)
1352 PyMem_Free(ms->a);
1353 ms->a = ms->temparray;
1354 ms->alloced = MERGESTATE_TEMP_SIZE;
1355}
1356
1357/* Ensure enough temp memory for 'need' array slots is available.
1358 * Returns 0 on success and -1 if the memory can't be gotten.
1359 */
1360static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001361merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001362{
1363 assert(ms != NULL);
1364 if (need <= ms->alloced)
1365 return 0;
1366 /* Don't realloc! That can cost cycles to copy the old data, but
1367 * we don't care what's in the block.
1368 */
1369 merge_freemem(ms);
1370 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1371 if (ms->a) {
1372 ms->alloced = need;
1373 return 0;
1374 }
1375 PyErr_NoMemory();
1376 merge_freemem(ms); /* reset to sane state */
1377 return -1;
1378}
1379#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1380 merge_getmem(MS, NEED))
1381
1382/* Merge the na elements starting at pa with the nb elements starting at pb
1383 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1384 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1385 * merge, and should have na <= nb. See listsort.txt for more info.
1386 * Return 0 if successful, -1 if error.
1387 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001388static Py_ssize_t
1389merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1390 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001391{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001392 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001393 PyObject *compare;
1394 PyObject **dest;
1395 int result = -1; /* guilty until proved innocent */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001396 Py_ssize_t min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001397
1398 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1399 if (MERGE_GETMEM(ms, na) < 0)
1400 return -1;
1401 memcpy(ms->a, pa, na * sizeof(PyObject*));
1402 dest = pa;
1403 pa = ms->a;
1404
1405 *dest++ = *pb++;
1406 --nb;
1407 if (nb == 0)
1408 goto Succeed;
1409 if (na == 1)
1410 goto CopyB;
1411
1412 compare = ms->compare;
1413 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001414 Py_ssize_t acount = 0; /* # of times A won in a row */
1415 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001416
1417 /* Do the straightforward thing until (if ever) one run
1418 * appears to win consistently.
1419 */
1420 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001421 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001422 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001423 if (k) {
1424 if (k < 0)
1425 goto Fail;
1426 *dest++ = *pb++;
1427 ++bcount;
1428 acount = 0;
1429 --nb;
1430 if (nb == 0)
1431 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001432 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001433 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001434 }
1435 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001436 *dest++ = *pa++;
1437 ++acount;
1438 bcount = 0;
1439 --na;
1440 if (na == 1)
1441 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001442 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001443 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001444 }
Tim Petersa64dc242002-08-01 02:13:36 +00001445 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001446
Tim Petersa64dc242002-08-01 02:13:36 +00001447 /* One run is winning so consistently that galloping may
1448 * be a huge win. So try that, and continue galloping until
1449 * (if ever) neither run appears to be winning consistently
1450 * anymore.
1451 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001452 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001453 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001454 assert(na > 1 && nb > 0);
1455 min_gallop -= min_gallop > 1;
1456 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001457 k = gallop_right(*pb, pa, na, 0, compare);
1458 acount = k;
1459 if (k) {
1460 if (k < 0)
1461 goto Fail;
1462 memcpy(dest, pa, k * sizeof(PyObject *));
1463 dest += k;
1464 pa += k;
1465 na -= k;
1466 if (na == 1)
1467 goto CopyB;
1468 /* na==0 is impossible now if the comparison
1469 * function is consistent, but we can't assume
1470 * that it is.
1471 */
1472 if (na == 0)
1473 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001474 }
Tim Petersa64dc242002-08-01 02:13:36 +00001475 *dest++ = *pb++;
1476 --nb;
1477 if (nb == 0)
1478 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001479
Tim Petersa64dc242002-08-01 02:13:36 +00001480 k = gallop_left(*pa, pb, nb, 0, compare);
1481 bcount = k;
1482 if (k) {
1483 if (k < 0)
1484 goto Fail;
1485 memmove(dest, pb, k * sizeof(PyObject *));
1486 dest += k;
1487 pb += k;
1488 nb -= k;
1489 if (nb == 0)
1490 goto Succeed;
1491 }
1492 *dest++ = *pa++;
1493 --na;
1494 if (na == 1)
1495 goto CopyB;
1496 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001497 ++min_gallop; /* penalize it for leaving galloping mode */
1498 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001499 }
1500Succeed:
1501 result = 0;
1502Fail:
1503 if (na)
1504 memcpy(dest, pa, na * sizeof(PyObject*));
1505 return result;
1506CopyB:
1507 assert(na == 1 && nb > 0);
1508 /* The last element of pa belongs at the end of the merge. */
1509 memmove(dest, pb, nb * sizeof(PyObject *));
1510 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001511 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001512}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001513
Tim Petersa64dc242002-08-01 02:13:36 +00001514/* Merge the na elements starting at pa with the nb elements starting at pb
1515 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1516 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1517 * merge, and should have na >= nb. See listsort.txt for more info.
1518 * Return 0 if successful, -1 if error.
1519 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001520static Py_ssize_t
1521merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001522{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001523 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001524 PyObject *compare;
1525 PyObject **dest;
1526 int result = -1; /* guilty until proved innocent */
1527 PyObject **basea;
1528 PyObject **baseb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001529 Py_ssize_t min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001530
1531 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1532 if (MERGE_GETMEM(ms, nb) < 0)
1533 return -1;
1534 dest = pb + nb - 1;
1535 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1536 basea = pa;
1537 baseb = ms->a;
1538 pb = ms->a + nb - 1;
1539 pa += na - 1;
1540
1541 *dest-- = *pa--;
1542 --na;
1543 if (na == 0)
1544 goto Succeed;
1545 if (nb == 1)
1546 goto CopyA;
1547
1548 compare = ms->compare;
1549 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001550 Py_ssize_t acount = 0; /* # of times A won in a row */
1551 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001552
1553 /* Do the straightforward thing until (if ever) one run
1554 * appears to win consistently.
1555 */
1556 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001557 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001558 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001559 if (k) {
1560 if (k < 0)
1561 goto Fail;
1562 *dest-- = *pa--;
1563 ++acount;
1564 bcount = 0;
1565 --na;
1566 if (na == 0)
1567 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001568 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001569 break;
1570 }
1571 else {
1572 *dest-- = *pb--;
1573 ++bcount;
1574 acount = 0;
1575 --nb;
1576 if (nb == 1)
1577 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001578 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001579 break;
1580 }
1581 }
1582
1583 /* One run is winning so consistently that galloping may
1584 * be a huge win. So try that, and continue galloping until
1585 * (if ever) neither run appears to be winning consistently
1586 * anymore.
1587 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001588 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001589 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001590 assert(na > 0 && nb > 1);
1591 min_gallop -= min_gallop > 1;
1592 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001593 k = gallop_right(*pb, basea, na, na-1, compare);
1594 if (k < 0)
1595 goto Fail;
1596 k = na - k;
1597 acount = k;
1598 if (k) {
1599 dest -= k;
1600 pa -= k;
1601 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1602 na -= k;
1603 if (na == 0)
1604 goto Succeed;
1605 }
1606 *dest-- = *pb--;
1607 --nb;
1608 if (nb == 1)
1609 goto CopyA;
1610
1611 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1612 if (k < 0)
1613 goto Fail;
1614 k = nb - k;
1615 bcount = k;
1616 if (k) {
1617 dest -= k;
1618 pb -= k;
1619 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1620 nb -= k;
1621 if (nb == 1)
1622 goto CopyA;
1623 /* nb==0 is impossible now if the comparison
1624 * function is consistent, but we can't assume
1625 * that it is.
1626 */
1627 if (nb == 0)
1628 goto Succeed;
1629 }
1630 *dest-- = *pa--;
1631 --na;
1632 if (na == 0)
1633 goto Succeed;
1634 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001635 ++min_gallop; /* penalize it for leaving galloping mode */
1636 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001637 }
1638Succeed:
1639 result = 0;
1640Fail:
1641 if (nb)
1642 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1643 return result;
1644CopyA:
1645 assert(nb == 1 && na > 0);
1646 /* The first element of pb belongs at the front of the merge. */
1647 dest -= na;
1648 pa -= na;
1649 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1650 *dest = *pb;
1651 return 0;
1652}
1653
1654/* Merge the two runs at stack indices i and i+1.
1655 * Returns 0 on success, -1 on error.
1656 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001657static Py_ssize_t
1658merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001659{
1660 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001661 Py_ssize_t na, nb;
1662 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001663 PyObject *compare;
1664
1665 assert(ms != NULL);
1666 assert(ms->n >= 2);
1667 assert(i >= 0);
1668 assert(i == ms->n - 2 || i == ms->n - 3);
1669
Tim Peterse05f65a2002-08-10 05:21:15 +00001670 pa = ms->pending[i].base;
1671 na = ms->pending[i].len;
1672 pb = ms->pending[i+1].base;
1673 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001674 assert(na > 0 && nb > 0);
1675 assert(pa + na == pb);
1676
1677 /* Record the length of the combined runs; if i is the 3rd-last
1678 * run now, also slide over the last run (which isn't involved
1679 * in this merge). The current run i+1 goes away in any case.
1680 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001681 ms->pending[i].len = na + nb;
1682 if (i == ms->n - 3)
1683 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001684 --ms->n;
1685
1686 /* Where does b start in a? Elements in a before that can be
1687 * ignored (already in place).
1688 */
1689 compare = ms->compare;
1690 k = gallop_right(*pb, pa, na, 0, compare);
1691 if (k < 0)
1692 return -1;
1693 pa += k;
1694 na -= k;
1695 if (na == 0)
1696 return 0;
1697
1698 /* Where does a end in b? Elements in b after that can be
1699 * ignored (already in place).
1700 */
1701 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1702 if (nb <= 0)
1703 return nb;
1704
1705 /* Merge what remains of the runs, using a temp array with
1706 * min(na, nb) elements.
1707 */
1708 if (na <= nb)
1709 return merge_lo(ms, pa, na, pb, nb);
1710 else
1711 return merge_hi(ms, pa, na, pb, nb);
1712}
1713
1714/* Examine the stack of runs waiting to be merged, merging adjacent runs
1715 * until the stack invariants are re-established:
1716 *
1717 * 1. len[-3] > len[-2] + len[-1]
1718 * 2. len[-2] > len[-1]
1719 *
1720 * See listsort.txt for more info.
1721 *
1722 * Returns 0 on success, -1 on error.
1723 */
1724static int
1725merge_collapse(MergeState *ms)
1726{
Tim Peterse05f65a2002-08-10 05:21:15 +00001727 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001728
1729 assert(ms);
1730 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001731 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001732 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1733 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001734 --n;
1735 if (merge_at(ms, n) < 0)
1736 return -1;
1737 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001738 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001739 if (merge_at(ms, n) < 0)
1740 return -1;
1741 }
1742 else
1743 break;
1744 }
1745 return 0;
1746}
1747
1748/* Regardless of invariants, merge all runs on the stack until only one
1749 * remains. This is used at the end of the mergesort.
1750 *
1751 * Returns 0 on success, -1 on error.
1752 */
1753static int
1754merge_force_collapse(MergeState *ms)
1755{
Tim Peterse05f65a2002-08-10 05:21:15 +00001756 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001757
1758 assert(ms);
1759 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001760 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001761 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001762 --n;
1763 if (merge_at(ms, n) < 0)
1764 return -1;
1765 }
1766 return 0;
1767}
1768
1769/* Compute a good value for the minimum run length; natural runs shorter
1770 * than this are boosted artificially via binary insertion.
1771 *
1772 * If n < 64, return n (it's too small to bother with fancy stuff).
1773 * Else if n is an exact power of 2, return 32.
1774 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1775 * strictly less than, an exact power of 2.
1776 *
1777 * See listsort.txt for more info.
1778 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001779static Py_ssize_t
1780merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001781{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001782 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001783
1784 assert(n >= 0);
1785 while (n >= 64) {
1786 r |= n & 1;
1787 n >>= 1;
1788 }
1789 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001790}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001791
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001792/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001793 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001794 which is returned during the undecorate phase. By exposing only the key
1795 during comparisons, the underlying sort stability characteristics are left
1796 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001797 the key instead of a full record. */
1798
1799typedef struct {
1800 PyObject_HEAD
1801 PyObject *key;
1802 PyObject *value;
1803} sortwrapperobject;
1804
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001805PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Anthony Baxter377be112006-04-11 06:54:30 +00001806static PyObject *
1807sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1808static void
1809sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001810
1811static PyTypeObject sortwrapper_type = {
1812 PyObject_HEAD_INIT(&PyType_Type)
1813 0, /* ob_size */
1814 "sortwrapper", /* tp_name */
1815 sizeof(sortwrapperobject), /* tp_basicsize */
1816 0, /* tp_itemsize */
1817 /* methods */
1818 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1819 0, /* tp_print */
1820 0, /* tp_getattr */
1821 0, /* tp_setattr */
1822 0, /* tp_compare */
1823 0, /* tp_repr */
1824 0, /* tp_as_number */
1825 0, /* tp_as_sequence */
1826 0, /* tp_as_mapping */
1827 0, /* tp_hash */
1828 0, /* tp_call */
1829 0, /* tp_str */
1830 PyObject_GenericGetAttr, /* tp_getattro */
1831 0, /* tp_setattro */
1832 0, /* tp_as_buffer */
Tim Petersb38e2b62004-07-29 02:29:26 +00001833 Py_TPFLAGS_DEFAULT |
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001834 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1835 sortwrapper_doc, /* tp_doc */
1836 0, /* tp_traverse */
1837 0, /* tp_clear */
1838 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1839};
1840
Anthony Baxter377be112006-04-11 06:54:30 +00001841
1842static PyObject *
1843sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1844{
1845 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1846 PyErr_SetString(PyExc_TypeError,
1847 "expected a sortwrapperobject");
1848 return NULL;
1849 }
1850 return PyObject_RichCompare(a->key, b->key, op);
1851}
1852
1853static void
1854sortwrapper_dealloc(sortwrapperobject *so)
1855{
1856 Py_XDECREF(so->key);
1857 Py_XDECREF(so->value);
1858 PyObject_Del(so);
1859}
1860
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001861/* Returns a new reference to a sortwrapper.
1862 Consumes the references to the two underlying objects. */
1863
1864static PyObject *
1865build_sortwrapper(PyObject *key, PyObject *value)
1866{
1867 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001868
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001869 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1870 if (so == NULL)
1871 return NULL;
1872 so->key = key;
1873 so->value = value;
1874 return (PyObject *)so;
1875}
1876
1877/* Returns a new reference to the value underlying the wrapper. */
1878static PyObject *
1879sortwrapper_getvalue(PyObject *so)
1880{
1881 PyObject *value;
1882
1883 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001884 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001885 "expected a sortwrapperobject");
1886 return NULL;
1887 }
1888 value = ((sortwrapperobject *)so)->value;
1889 Py_INCREF(value);
1890 return value;
1891}
1892
1893/* Wrapper for user specified cmp functions in combination with a
1894 specified key function. Makes sure the cmp function is presented
1895 with the actual key instead of the sortwrapper */
1896
1897typedef struct {
1898 PyObject_HEAD
1899 PyObject *func;
1900} cmpwrapperobject;
1901
1902static void
1903cmpwrapper_dealloc(cmpwrapperobject *co)
1904{
1905 Py_XDECREF(co->func);
1906 PyObject_Del(co);
1907}
1908
1909static PyObject *
1910cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1911{
1912 PyObject *x, *y, *xx, *yy;
1913
1914 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1915 return NULL;
1916 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001917 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001918 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001919 "expected a sortwrapperobject");
1920 return NULL;
1921 }
1922 xx = ((sortwrapperobject *)x)->key;
1923 yy = ((sortwrapperobject *)y)->key;
1924 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1925}
1926
1927PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1928
1929static PyTypeObject cmpwrapper_type = {
1930 PyObject_HEAD_INIT(&PyType_Type)
1931 0, /* ob_size */
1932 "cmpwrapper", /* tp_name */
1933 sizeof(cmpwrapperobject), /* tp_basicsize */
1934 0, /* tp_itemsize */
1935 /* methods */
1936 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1937 0, /* tp_print */
1938 0, /* tp_getattr */
1939 0, /* tp_setattr */
1940 0, /* tp_compare */
1941 0, /* tp_repr */
1942 0, /* tp_as_number */
1943 0, /* tp_as_sequence */
1944 0, /* tp_as_mapping */
1945 0, /* tp_hash */
1946 (ternaryfunc)cmpwrapper_call, /* tp_call */
1947 0, /* tp_str */
1948 PyObject_GenericGetAttr, /* tp_getattro */
1949 0, /* tp_setattro */
1950 0, /* tp_as_buffer */
1951 Py_TPFLAGS_DEFAULT, /* tp_flags */
1952 cmpwrapper_doc, /* tp_doc */
1953};
1954
1955static PyObject *
1956build_cmpwrapper(PyObject *cmpfunc)
1957{
1958 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001959
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001960 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1961 if (co == NULL)
1962 return NULL;
1963 Py_INCREF(cmpfunc);
1964 co->func = cmpfunc;
1965 return (PyObject *)co;
1966}
1967
Tim Petersa64dc242002-08-01 02:13:36 +00001968/* An adaptive, stable, natural mergesort. See listsort.txt.
1969 * Returns Py_None on success, NULL on error. Even in case of error, the
1970 * list will be some permutation of its input state (nothing is lost or
1971 * duplicated).
1972 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001973static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001974listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001975{
Tim Petersa64dc242002-08-01 02:13:36 +00001976 MergeState ms;
1977 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001978 Py_ssize_t nremaining;
1979 Py_ssize_t minrun;
1980 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001981 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001982 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001983 PyObject *compare = NULL;
1984 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001985 int reverse = 0;
1986 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001987 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001988 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001989 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001990
Tim Petersa64dc242002-08-01 02:13:36 +00001991 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001992 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001993 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001994 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
1995 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001996 return NULL;
1997 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00001998 if (compare == Py_None)
1999 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002000 if (keyfunc == Py_None)
2001 keyfunc = NULL;
2002 if (compare != NULL && keyfunc != NULL) {
2003 compare = build_cmpwrapper(compare);
2004 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002005 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002006 } else
2007 Py_XINCREF(compare);
2008
Tim Petersb9099c32002-11-12 22:08:10 +00002009 /* The list is temporarily made empty, so that mutations performed
2010 * by comparison functions can't affect the slice of memory we're
2011 * sorting (allowing mutations during sorting is a core-dump
2012 * factory, since ob_item may change).
2013 */
2014 saved_ob_size = self->ob_size;
2015 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002016 saved_allocated = self->allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002017 self->ob_size = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002018 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002019 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002020
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002021 if (keyfunc != NULL) {
2022 for (i=0 ; i < saved_ob_size ; i++) {
2023 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002024 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002025 NULL);
2026 if (key == NULL) {
2027 for (i=i-1 ; i>=0 ; i--) {
2028 kvpair = saved_ob_item[i];
2029 value = sortwrapper_getvalue(kvpair);
2030 saved_ob_item[i] = value;
2031 Py_DECREF(kvpair);
2032 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002033 goto dsu_fail;
2034 }
2035 kvpair = build_sortwrapper(key, value);
2036 if (kvpair == NULL)
2037 goto dsu_fail;
2038 saved_ob_item[i] = kvpair;
2039 }
2040 }
2041
2042 /* Reverse sort stability achieved by initially reversing the list,
2043 applying a stable forward sort, then reversing the final result. */
2044 if (reverse && saved_ob_size > 1)
2045 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2046
2047 merge_init(&ms, compare);
2048
Tim Petersb9099c32002-11-12 22:08:10 +00002049 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002050 if (nremaining < 2)
2051 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002052
Tim Petersa64dc242002-08-01 02:13:36 +00002053 /* March over the array once, left to right, finding natural runs,
2054 * and extending short natural runs to minrun elements.
2055 */
Tim Petersb9099c32002-11-12 22:08:10 +00002056 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002057 hi = lo + nremaining;
2058 minrun = merge_compute_minrun(nremaining);
2059 do {
2060 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002061 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002062
Tim Petersa64dc242002-08-01 02:13:36 +00002063 /* Identify next run. */
2064 n = count_run(lo, hi, compare, &descending);
2065 if (n < 0)
2066 goto fail;
2067 if (descending)
2068 reverse_slice(lo, lo + n);
2069 /* If short, extend to min(minrun, nremaining). */
2070 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002071 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002072 nremaining : minrun;
2073 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2074 goto fail;
2075 n = force;
2076 }
2077 /* Push run onto pending-runs stack, and maybe merge. */
2078 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002079 ms.pending[ms.n].base = lo;
2080 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002081 ++ms.n;
2082 if (merge_collapse(&ms) < 0)
2083 goto fail;
2084 /* Advance to find next run. */
2085 lo += n;
2086 nremaining -= n;
2087 } while (nremaining);
2088 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002089
Tim Petersa64dc242002-08-01 02:13:36 +00002090 if (merge_force_collapse(&ms) < 0)
2091 goto fail;
2092 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002093 assert(ms.pending[0].base == saved_ob_item);
2094 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002095
2096succeed:
2097 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002098fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002099 if (keyfunc != NULL) {
2100 for (i=0 ; i < saved_ob_size ; i++) {
2101 kvpair = saved_ob_item[i];
2102 value = sortwrapper_getvalue(kvpair);
2103 saved_ob_item[i] = value;
2104 Py_DECREF(kvpair);
2105 }
2106 }
2107
Armin Rigo93677f02004-07-29 12:40:23 +00002108 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002109 /* The user mucked with the list during the sort,
2110 * and we don't already have another error to report.
2111 */
2112 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2113 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002114 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002115
2116 if (reverse && saved_ob_size > 1)
2117 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2118
2119 merge_freemem(&ms);
2120
2121dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002122 final_ob_item = self->ob_item;
2123 i = self->ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002124 self->ob_size = saved_ob_size;
2125 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002126 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002127 if (final_ob_item != NULL) {
2128 /* we cannot use list_clear() for this because it does not
2129 guarantee that the list is really empty when it returns */
2130 while (--i >= 0) {
2131 Py_XDECREF(final_ob_item[i]);
2132 }
2133 PyMem_FREE(final_ob_item);
2134 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002135 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002136 Py_XINCREF(result);
2137 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002138}
Tim Peters330f9e92002-07-19 07:05:44 +00002139#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002140#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002141
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002142int
Fred Drakea2f55112000-07-09 15:16:51 +00002143PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002144{
2145 if (v == NULL || !PyList_Check(v)) {
2146 PyErr_BadInternalCall();
2147 return -1;
2148 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002149 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002150 if (v == NULL)
2151 return -1;
2152 Py_DECREF(v);
2153 return 0;
2154}
2155
Guido van Rossumb86c5492001-02-12 22:06:02 +00002156static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002157listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002158{
Tim Peters326b4482002-07-19 04:04:16 +00002159 if (self->ob_size > 1)
2160 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002161 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002162}
2163
Guido van Rossum84c76f51990-10-30 13:32:20 +00002164int
Fred Drakea2f55112000-07-09 15:16:51 +00002165PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002166{
Tim Peters6063e262002-08-08 01:06:39 +00002167 PyListObject *self = (PyListObject *)v;
2168
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002169 if (v == NULL || !PyList_Check(v)) {
2170 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002171 return -1;
2172 }
Tim Peters6063e262002-08-08 01:06:39 +00002173 if (self->ob_size > 1)
2174 reverse_slice(self->ob_item, self->ob_item + self->ob_size);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002175 return 0;
2176}
2177
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002179PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002180{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002181 PyObject *w;
2182 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002183 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002184 if (v == NULL || !PyList_Check(v)) {
2185 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002186 return NULL;
2187 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002188 n = ((PyListObject *)v)->ob_size;
2189 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002190 if (w == NULL)
2191 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002192 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002193 memcpy((void *)p,
2194 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002195 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002196 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002197 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002198 p++;
2199 }
2200 return w;
2201}
2202
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002204listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002205{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002206 Py_ssize_t i, start=0, stop=self->ob_size;
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002207 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002208
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002209 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2210 _PyEval_SliceIndex, &start,
2211 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002212 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002213 if (start < 0) {
2214 start += self->ob_size;
2215 if (start < 0)
2216 start = 0;
2217 }
2218 if (stop < 0) {
2219 stop += self->ob_size;
2220 if (stop < 0)
2221 stop = 0;
2222 }
Neal Norwitzf0769532004-08-13 03:18:29 +00002223 for (i = start; i < stop && i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002224 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2225 if (cmp > 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002226 return PyInt_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002227 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002228 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002229 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002230 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002231 return NULL;
2232}
2233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002234static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002235listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002236{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002237 Py_ssize_t count = 0;
2238 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002239
Guido van Rossume6f7d181991-10-20 20:20:40 +00002240 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002241 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2242 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002243 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002244 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002245 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002246 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002247 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002248}
2249
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002250static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002251listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002252{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002253 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002254
Guido van Rossumed98d481991-03-06 13:07:53 +00002255 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002256 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2257 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002258 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002259 (PyObject *)NULL) == 0)
2260 Py_RETURN_NONE;
2261 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002262 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002263 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002264 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002266 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002267 return NULL;
2268}
2269
Jeremy Hylton8caad492000-06-23 14:18:11 +00002270static int
2271list_traverse(PyListObject *o, visitproc visit, void *arg)
2272{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002273 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002274
Thomas Woutersc6e55062006-04-15 21:47:09 +00002275 for (i = o->ob_size; --i >= 0; )
2276 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002277 return 0;
2278}
2279
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002280static PyObject *
2281list_richcompare(PyObject *v, PyObject *w, int op)
2282{
2283 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002284 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002285
2286 if (!PyList_Check(v) || !PyList_Check(w)) {
2287 Py_INCREF(Py_NotImplemented);
2288 return Py_NotImplemented;
2289 }
2290
2291 vl = (PyListObject *)v;
2292 wl = (PyListObject *)w;
2293
2294 if (vl->ob_size != wl->ob_size && (op == Py_EQ || op == Py_NE)) {
2295 /* Shortcut: if the lengths differ, the lists differ */
2296 PyObject *res;
2297 if (op == Py_EQ)
2298 res = Py_False;
2299 else
2300 res = Py_True;
2301 Py_INCREF(res);
2302 return res;
2303 }
2304
2305 /* Search for the first index where items are different */
2306 for (i = 0; i < vl->ob_size && i < wl->ob_size; i++) {
2307 int k = PyObject_RichCompareBool(vl->ob_item[i],
2308 wl->ob_item[i], Py_EQ);
2309 if (k < 0)
2310 return NULL;
2311 if (!k)
2312 break;
2313 }
2314
2315 if (i >= vl->ob_size || i >= wl->ob_size) {
2316 /* No more items to compare -- compare sizes */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002317 Py_ssize_t vs = vl->ob_size;
2318 Py_ssize_t ws = wl->ob_size;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002319 int cmp;
2320 PyObject *res;
2321 switch (op) {
2322 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002323 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002324 case Py_EQ: cmp = vs == ws; break;
2325 case Py_NE: cmp = vs != ws; break;
2326 case Py_GT: cmp = vs > ws; break;
2327 case Py_GE: cmp = vs >= ws; break;
2328 default: return NULL; /* cannot happen */
2329 }
2330 if (cmp)
2331 res = Py_True;
2332 else
2333 res = Py_False;
2334 Py_INCREF(res);
2335 return res;
2336 }
2337
2338 /* We have an item that differs -- shortcuts for EQ/NE */
2339 if (op == Py_EQ) {
2340 Py_INCREF(Py_False);
2341 return Py_False;
2342 }
2343 if (op == Py_NE) {
2344 Py_INCREF(Py_True);
2345 return Py_True;
2346 }
2347
2348 /* Compare the final item again using the proper operator */
2349 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2350}
2351
Tim Peters6d6c1a32001-08-02 04:15:00 +00002352static int
2353list_init(PyListObject *self, PyObject *args, PyObject *kw)
2354{
2355 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002356 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002357
2358 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2359 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002360
2361 /* Verify list invariants established by PyType_GenericAlloc() */
Armin Rigoa37bbf22004-07-30 11:20:18 +00002362 assert(0 <= self->ob_size);
2363 assert(self->ob_size <= self->allocated || self->allocated == -1);
2364 assert(self->ob_item != NULL ||
2365 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002366
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002367 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002368 if (self->ob_item != NULL) {
2369 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002370 }
2371 if (arg != NULL) {
2372 PyObject *rv = listextend(self, arg);
2373 if (rv == NULL)
2374 return -1;
2375 Py_DECREF(rv);
2376 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002377 return 0;
2378}
2379
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002380static long
2381list_nohash(PyObject *self)
2382{
2383 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2384 return -1;
2385}
2386
Raymond Hettinger1021c442003-11-07 15:38:09 +00002387static PyObject *list_iter(PyObject *seq);
2388static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2389
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002390PyDoc_STRVAR(getitem_doc,
2391"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002392PyDoc_STRVAR(reversed_doc,
2393"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002394PyDoc_STRVAR(append_doc,
2395"L.append(object) -- append object to end");
2396PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002397"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002398PyDoc_STRVAR(insert_doc,
2399"L.insert(index, object) -- insert object before index");
2400PyDoc_STRVAR(pop_doc,
2401"L.pop([index]) -> item -- remove and return item at index (default last)");
2402PyDoc_STRVAR(remove_doc,
2403"L.remove(value) -- remove first occurrence of value");
2404PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002405"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002406PyDoc_STRVAR(count_doc,
2407"L.count(value) -> integer -- return number of occurrences of value");
2408PyDoc_STRVAR(reverse_doc,
2409"L.reverse() -- reverse *IN PLACE*");
2410PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002411"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2412cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002413
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002414static PyObject *list_subscript(PyListObject*, PyObject*);
2415
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002416static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002417 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002418 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002419 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002420 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002421 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002422 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002423 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002424 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002425 {"count", (PyCFunction)listcount, METH_O, count_doc},
2426 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002427 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002428 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002429};
2430
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002431static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002432 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002433 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002434 (ssizeargfunc)list_repeat, /* sq_repeat */
2435 (ssizeargfunc)list_item, /* sq_item */
2436 (ssizessizeargfunc)list_slice, /* sq_slice */
2437 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2438 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002439 (objobjproc)list_contains, /* sq_contains */
2440 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002441 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002442};
2443
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002444PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002445"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002446"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002447
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002448
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002449static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002450list_subscript(PyListObject* self, PyObject* item)
2451{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002452 if (PyIndex_Check(item)) {
2453 Py_ssize_t i;
2454 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002455 if (i == -1 && PyErr_Occurred())
2456 return NULL;
2457 if (i < 0)
2458 i += PyList_GET_SIZE(self);
2459 return list_item(self, i);
2460 }
2461 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002462 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002463 PyObject* result;
2464 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002465 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002466
2467 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2468 &start, &stop, &step, &slicelength) < 0) {
2469 return NULL;
2470 }
2471
2472 if (slicelength <= 0) {
2473 return PyList_New(0);
2474 }
2475 else {
2476 result = PyList_New(slicelength);
2477 if (!result) return NULL;
2478
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002479 src = self->ob_item;
2480 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002481 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002482 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002483 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002484 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002485 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002486 }
Tim Peters3b01a122002-07-19 02:35:45 +00002487
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002488 return result;
2489 }
2490 }
2491 else {
2492 PyErr_SetString(PyExc_TypeError,
2493 "list indices must be integers");
2494 return NULL;
2495 }
2496}
2497
Tim Peters3b01a122002-07-19 02:35:45 +00002498static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002499list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2500{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002501 if (PyIndex_Check(item)) {
2502 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002503 if (i == -1 && PyErr_Occurred())
2504 return -1;
2505 if (i < 0)
2506 i += PyList_GET_SIZE(self);
2507 return list_ass_item(self, i, value);
2508 }
2509 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002510 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002511
2512 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
2513 &start, &stop, &step, &slicelength) < 0) {
2514 return -1;
2515 }
2516
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002517 /* treat L[slice(a,b)] = v _exactly_ like L[a:b] = v */
2518 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
2519 return list_ass_slice(self, start, stop, value);
2520
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002521 if (value == NULL) {
2522 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002523 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002524 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002525
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002526 if (slicelength <= 0)
2527 return 0;
2528
2529 if (step < 0) {
2530 stop = start + 1;
2531 start = stop + step*(slicelength - 1) - 1;
2532 step = -step;
2533 }
2534
2535 garbage = (PyObject**)
2536 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002537 if (!garbage) {
2538 PyErr_NoMemory();
2539 return -1;
2540 }
Tim Peters3b01a122002-07-19 02:35:45 +00002541
2542 /* drawing pictures might help
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002543 understand these for loops */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002544 for (cur = start, i = 0;
2545 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002546 cur += step, i++) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002547 Py_ssize_t lim = step;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002548
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002549 garbage[i] = PyList_GET_ITEM(self, cur);
2550
Michael W. Hudson56796f62002-07-29 14:35:04 +00002551 if (cur + step >= self->ob_size) {
2552 lim = self->ob_size - cur - 1;
2553 }
2554
Tim Petersb38e2b62004-07-29 02:29:26 +00002555 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002556 self->ob_item + cur + 1,
2557 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002558 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002559
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002560 for (cur = start + slicelength*step + 1;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002561 cur < self->ob_size; cur++) {
2562 PyList_SET_ITEM(self, cur - slicelength,
2563 PyList_GET_ITEM(self, cur));
2564 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002565
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002566 self->ob_size -= slicelength;
Raymond Hettingerd4ff7412004-03-15 09:01:31 +00002567 list_resize(self, self->ob_size);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002568
2569 for (i = 0; i < slicelength; i++) {
2570 Py_DECREF(garbage[i]);
2571 }
2572 PyMem_FREE(garbage);
2573
2574 return 0;
2575 }
2576 else {
2577 /* assign slice */
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002578 PyObject **garbage, *ins, *seq, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002579 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002580
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002581 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002582 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002583 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002584 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002585 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002586 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002587 seq = PySequence_Fast(value,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002588 "must assign iterable to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002589 }
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002590 if (!seq)
2591 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002592
2593 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2594 PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00002595 "attempt to assign sequence of size %zd to extended slice of size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002596 PySequence_Fast_GET_SIZE(seq),
2597 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002598 Py_DECREF(seq);
2599 return -1;
2600 }
2601
2602 if (!slicelength) {
2603 Py_DECREF(seq);
2604 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002605 }
2606
2607 garbage = (PyObject**)
2608 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitze0cf6242006-10-28 21:39:10 +00002609 if (!garbage) {
2610 Py_DECREF(seq);
2611 PyErr_NoMemory();
2612 return -1;
2613 }
Tim Peters3b01a122002-07-19 02:35:45 +00002614
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002615 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002616 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002617 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002618 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002619 garbage[i] = selfitems[cur];
2620 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002621 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002622 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002623 }
2624
2625 for (i = 0; i < slicelength; i++) {
2626 Py_DECREF(garbage[i]);
2627 }
Tim Peters3b01a122002-07-19 02:35:45 +00002628
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002629 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002630 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002631
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002632 return 0;
2633 }
Tim Peters3b01a122002-07-19 02:35:45 +00002634 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002635 else {
Tim Peters3b01a122002-07-19 02:35:45 +00002636 PyErr_SetString(PyExc_TypeError,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002637 "list indices must be integers");
2638 return -1;
2639 }
2640}
2641
2642static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002643 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002644 (binaryfunc)list_subscript,
2645 (objobjargproc)list_ass_subscript
2646};
2647
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002648PyTypeObject PyList_Type = {
2649 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002650 0,
2651 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002652 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002653 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002654 (destructor)list_dealloc, /* tp_dealloc */
2655 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002656 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002657 0, /* tp_setattr */
2658 0, /* tp_compare */
2659 (reprfunc)list_repr, /* tp_repr */
2660 0, /* tp_as_number */
2661 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002662 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002663 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002664 0, /* tp_call */
2665 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002666 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002667 0, /* tp_setattro */
2668 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002669 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002670 Py_TPFLAGS_BASETYPE, /* tp_flags */
2671 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002672 (traverseproc)list_traverse, /* tp_traverse */
2673 (inquiry)list_clear, /* tp_clear */
2674 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002675 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002676 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002677 0, /* tp_iternext */
2678 list_methods, /* tp_methods */
2679 0, /* tp_members */
2680 0, /* tp_getset */
2681 0, /* tp_base */
2682 0, /* tp_dict */
2683 0, /* tp_descr_get */
2684 0, /* tp_descr_set */
2685 0, /* tp_dictoffset */
2686 (initproc)list_init, /* tp_init */
2687 PyType_GenericAlloc, /* tp_alloc */
2688 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002689 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002690};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002691
2692
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002693/*********************** List Iterator **************************/
2694
2695typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002696 PyObject_HEAD
2697 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002698 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002699} listiterobject;
2700
Anthony Baxter377be112006-04-11 06:54:30 +00002701static PyObject *list_iter(PyObject *);
2702static void listiter_dealloc(listiterobject *);
2703static int listiter_traverse(listiterobject *, visitproc, void *);
2704static PyObject *listiter_next(listiterobject *);
2705static PyObject *listiter_len(listiterobject *);
2706
2707PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2708
2709static PyMethodDef listiter_methods[] = {
2710 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2711 {NULL, NULL} /* sentinel */
2712};
2713
2714PyTypeObject PyListIter_Type = {
2715 PyObject_HEAD_INIT(&PyType_Type)
2716 0, /* ob_size */
2717 "listiterator", /* tp_name */
2718 sizeof(listiterobject), /* tp_basicsize */
2719 0, /* tp_itemsize */
2720 /* methods */
2721 (destructor)listiter_dealloc, /* tp_dealloc */
2722 0, /* tp_print */
2723 0, /* tp_getattr */
2724 0, /* tp_setattr */
2725 0, /* tp_compare */
2726 0, /* tp_repr */
2727 0, /* tp_as_number */
2728 0, /* tp_as_sequence */
2729 0, /* tp_as_mapping */
2730 0, /* tp_hash */
2731 0, /* tp_call */
2732 0, /* tp_str */
2733 PyObject_GenericGetAttr, /* tp_getattro */
2734 0, /* tp_setattro */
2735 0, /* tp_as_buffer */
2736 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2737 0, /* tp_doc */
2738 (traverseproc)listiter_traverse, /* tp_traverse */
2739 0, /* tp_clear */
2740 0, /* tp_richcompare */
2741 0, /* tp_weaklistoffset */
2742 PyObject_SelfIter, /* tp_iter */
2743 (iternextfunc)listiter_next, /* tp_iternext */
2744 listiter_methods, /* tp_methods */
2745 0, /* tp_members */
2746};
2747
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002748
Guido van Rossum5086e492002-07-16 15:56:52 +00002749static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002750list_iter(PyObject *seq)
2751{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002752 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002753
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002754 if (!PyList_Check(seq)) {
2755 PyErr_BadInternalCall();
2756 return NULL;
2757 }
2758 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2759 if (it == NULL)
2760 return NULL;
2761 it->it_index = 0;
2762 Py_INCREF(seq);
2763 it->it_seq = (PyListObject *)seq;
2764 _PyObject_GC_TRACK(it);
2765 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002766}
2767
2768static void
2769listiter_dealloc(listiterobject *it)
2770{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002771 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002772 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002773 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002774}
2775
2776static int
2777listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2778{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002779 Py_VISIT(it->it_seq);
2780 return 0;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002781}
2782
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002783static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002784listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002785{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002786 PyListObject *seq;
2787 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002788
Tim Peters93b2cc42002-06-01 05:22:55 +00002789 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002790 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002791 if (seq == NULL)
2792 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002793 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002794
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002795 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002796 item = PyList_GET_ITEM(seq, it->it_index);
2797 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002798 Py_INCREF(item);
2799 return item;
2800 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002801
2802 Py_DECREF(seq);
2803 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002804 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002805}
2806
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002807static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +00002808listiter_len(listiterobject *it)
2809{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002810 Py_ssize_t len;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002811 if (it->it_seq) {
2812 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2813 if (len >= 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002814 return PyInt_FromSsize_t(len);
Raymond Hettinger40a03822004-04-12 13:05:09 +00002815 }
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002816 return PyInt_FromLong(0);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002817}
Anthony Baxter377be112006-04-11 06:54:30 +00002818/*********************** List Reverse Iterator **************************/
Raymond Hettinger435bf582004-03-18 22:43:10 +00002819
Anthony Baxter377be112006-04-11 06:54:30 +00002820typedef struct {
2821 PyObject_HEAD
2822 Py_ssize_t it_index;
2823 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2824} listreviterobject;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002825
Anthony Baxter377be112006-04-11 06:54:30 +00002826static PyObject *list_reversed(PyListObject *, PyObject *);
2827static void listreviter_dealloc(listreviterobject *);
2828static int listreviter_traverse(listreviterobject *, visitproc, void *);
2829static PyObject *listreviter_next(listreviterobject *);
2830static Py_ssize_t listreviter_len(listreviterobject *);
2831
2832static PySequenceMethods listreviter_as_sequence = {
2833 (lenfunc)listreviter_len, /* sq_length */
2834 0, /* sq_concat */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002835};
2836
Anthony Baxter377be112006-04-11 06:54:30 +00002837PyTypeObject PyListRevIter_Type = {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002838 PyObject_HEAD_INIT(&PyType_Type)
2839 0, /* ob_size */
Anthony Baxter377be112006-04-11 06:54:30 +00002840 "listreverseiterator", /* tp_name */
2841 sizeof(listreviterobject), /* tp_basicsize */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002842 0, /* tp_itemsize */
2843 /* methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002844 (destructor)listreviter_dealloc, /* tp_dealloc */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002845 0, /* tp_print */
2846 0, /* tp_getattr */
2847 0, /* tp_setattr */
2848 0, /* tp_compare */
2849 0, /* tp_repr */
2850 0, /* tp_as_number */
Anthony Baxter377be112006-04-11 06:54:30 +00002851 &listreviter_as_sequence, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002852 0, /* tp_as_mapping */
2853 0, /* tp_hash */
2854 0, /* tp_call */
2855 0, /* tp_str */
2856 PyObject_GenericGetAttr, /* tp_getattro */
2857 0, /* tp_setattro */
2858 0, /* tp_as_buffer */
2859 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2860 0, /* tp_doc */
Anthony Baxter377be112006-04-11 06:54:30 +00002861 (traverseproc)listreviter_traverse, /* tp_traverse */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002862 0, /* tp_clear */
2863 0, /* tp_richcompare */
2864 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002865 PyObject_SelfIter, /* tp_iter */
Anthony Baxter377be112006-04-11 06:54:30 +00002866 (iternextfunc)listreviter_next, /* tp_iternext */
2867 0,
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002868};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002869
Raymond Hettinger1021c442003-11-07 15:38:09 +00002870static PyObject *
2871list_reversed(PyListObject *seq, PyObject *unused)
2872{
2873 listreviterobject *it;
2874
2875 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2876 if (it == NULL)
2877 return NULL;
2878 assert(PyList_Check(seq));
2879 it->it_index = PyList_GET_SIZE(seq) - 1;
2880 Py_INCREF(seq);
2881 it->it_seq = seq;
2882 PyObject_GC_Track(it);
2883 return (PyObject *)it;
2884}
2885
2886static void
2887listreviter_dealloc(listreviterobject *it)
2888{
2889 PyObject_GC_UnTrack(it);
2890 Py_XDECREF(it->it_seq);
2891 PyObject_GC_Del(it);
2892}
2893
2894static int
2895listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2896{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002897 Py_VISIT(it->it_seq);
2898 return 0;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002899}
2900
2901static PyObject *
2902listreviter_next(listreviterobject *it)
2903{
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002904 PyObject *item;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002905 Py_ssize_t index = it->it_index;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002906 PyListObject *seq = it->it_seq;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002907
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002908 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2909 item = PyList_GET_ITEM(seq, index);
Raymond Hettinger1021c442003-11-07 15:38:09 +00002910 it->it_index--;
2911 Py_INCREF(item);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002912 return item;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002913 }
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002914 it->it_index = -1;
2915 if (seq != NULL) {
2916 it->it_seq = NULL;
2917 Py_DECREF(seq);
2918 }
2919 return NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002920}
2921
Martin v. Löwis18e16552006-02-15 17:27:45 +00002922static Py_ssize_t
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002923listreviter_len(listreviterobject *it)
2924{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002925 Py_ssize_t len = it->it_index + 1;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002926 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2927 return 0;
2928 return len;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002929}
2930