blob: 8389a86ea713efa143269f3f80df71f91d4194b7 [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);
Martin v. Löwis68192102007-07-21 06:55:02 +000037 Py_Size(self) = newsize;
Raymond Hettinger4bb95402004-02-13 11:36:39 +000038 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;
Martin v. Löwis68192102007-07-21 06:55:02 +000061 Py_Size(self) = 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 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000117 Py_Size(op) = 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
Martin v. Löwis68192102007-07-21 06:55:02 +0000131 return Py_Size(op);
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 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000143 if (i < 0 || i >= Py_Size(op)) {
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 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000164 if (i < 0 || i >= Py_Size(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 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öwis68192102007-07-21 06:55:02 +0000180 Py_ssize_t i, n = Py_Size(self);
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. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000262 i = Py_Size(op);
Guido van Rossumfa717011999-06-09 15:19:34 +0000263 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
Martin v. Löwis68192102007-07-21 06:55:02 +0000271 Py_Type(op)->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;
Brett Cannon01531592007-09-17 03:28:34 +0000285 Py_BEGIN_ALLOW_THREADS
Guido van Rossumfb376de1998-04-10 22:47:27 +0000286 fprintf(fp, "[...]");
Brett Cannon01531592007-09-17 03:28:34 +0000287 Py_END_ALLOW_THREADS
Guido van Rossumfb376de1998-04-10 22:47:27 +0000288 return 0;
289 }
Brett Cannon01531592007-09-17 03:28:34 +0000290 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 fprintf(fp, "[");
Brett Cannon01531592007-09-17 03:28:34 +0000292 Py_END_ALLOW_THREADS
Martin v. Löwis68192102007-07-21 06:55:02 +0000293 for (i = 0; i < Py_Size(op); i++) {
Brett Cannon01531592007-09-17 03:28:34 +0000294 if (i > 0) {
295 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +0000297 Py_END_ALLOW_THREADS
298 }
Guido van Rossumfb376de1998-04-10 22:47:27 +0000299 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
300 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000301 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000302 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 }
Brett Cannon01531592007-09-17 03:28:34 +0000304 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 fprintf(fp, "]");
Brett Cannon01531592007-09-17 03:28:34 +0000306 Py_END_ALLOW_THREADS
Guido van Rossumfb376de1998-04-10 22:47:27 +0000307 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000308 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309}
310
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000312list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000314 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000315 PyObject *s, *temp;
316 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000317
318 i = Py_ReprEnter((PyObject*)v);
319 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000320 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000321 }
Tim Petersa7259592001-06-16 05:11:17 +0000322
Martin v. Löwis68192102007-07-21 06:55:02 +0000323 if (Py_Size(v) == 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000324 result = PyString_FromString("[]");
325 goto Done;
326 }
327
328 pieces = PyList_New(0);
329 if (pieces == NULL)
330 goto Done;
331
332 /* Do repr() on each element. Note that this may mutate the list,
333 so must refetch the list size on each iteration. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000334 for (i = 0; i < Py_Size(v); ++i) {
Tim Petersa7259592001-06-16 05:11:17 +0000335 int status;
Brett Cannona0c05512007-09-10 21:38:27 +0000336 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
337 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000338 s = PyObject_Repr(v->ob_item[i]);
Brett Cannona0c05512007-09-10 21:38:27 +0000339 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000340 if (s == NULL)
341 goto Done;
342 status = PyList_Append(pieces, s);
343 Py_DECREF(s); /* append created a new ref */
344 if (status < 0)
345 goto Done;
346 }
347
348 /* Add "[]" decorations to the first and last items. */
349 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000351 if (s == NULL)
352 goto Done;
353 temp = PyList_GET_ITEM(pieces, 0);
354 PyString_ConcatAndDel(&s, temp);
355 PyList_SET_ITEM(pieces, 0, s);
356 if (s == NULL)
357 goto Done;
358
359 s = PyString_FromString("]");
360 if (s == NULL)
361 goto Done;
362 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
363 PyString_ConcatAndDel(&temp, s);
364 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
365 if (temp == NULL)
366 goto Done;
367
368 /* Paste them all together with ", " between. */
369 s = PyString_FromString(", ");
370 if (s == NULL)
371 goto Done;
372 result = _PyString_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000373 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000374
375Done:
376 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000377 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000378 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379}
380
Martin v. Löwis18e16552006-02-15 17:27:45 +0000381static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000382list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383{
Martin v. Löwis68192102007-07-21 06:55:02 +0000384 return Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385}
386
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000387static int
Fred Drakea2f55112000-07-09 15:16:51 +0000388list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000389{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000390 Py_ssize_t i;
391 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000392
Martin v. Löwis68192102007-07-21 06:55:02 +0000393 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_Size(a); ++i)
Raymond Hettingeraae59992002-09-05 14:23:49 +0000394 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000395 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000396 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000397}
398
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000400list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401{
Martin v. Löwis68192102007-07-21 06:55:02 +0000402 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000403 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 indexerr = PyString_FromString(
405 "list index out of range");
406 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 return NULL;
408 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410 return a->ob_item[i];
411}
412
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000414list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000417 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000418 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 if (ilow < 0)
420 ilow = 0;
Martin v. Löwis68192102007-07-21 06:55:02 +0000421 else if (ilow > Py_Size(a))
422 ilow = Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423 if (ihigh < ilow)
424 ihigh = ilow;
Martin v. Löwis68192102007-07-21 06:55:02 +0000425 else if (ihigh > Py_Size(a))
426 ihigh = Py_Size(a);
Raymond Hettinger99842b62004-03-08 05:56:15 +0000427 len = ihigh - ilow;
428 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 if (np == NULL)
430 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000431
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000432 src = a->ob_item + ilow;
433 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000434 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000435 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000437 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440}
441
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000444{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 if (!PyList_Check(a)) {
446 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000447 return NULL;
448 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000450}
451
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000453list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000455 Py_ssize_t size;
456 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000457 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 PyListObject *np;
459 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000460 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000461 "can only concatenate list (not \"%.200s\") to list",
462 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463 return NULL;
464 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465#define b ((PyListObject *)bb)
Martin v. Löwis68192102007-07-21 06:55:02 +0000466 size = Py_Size(a) + Py_Size(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000467 if (size < 0)
468 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000471 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000473 src = a->ob_item;
474 dest = np->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +0000475 for (i = 0; i < Py_Size(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000476 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000478 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000480 src = b->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +0000481 dest = np->ob_item + Py_Size(a);
482 for (i = 0; i < Py_Size(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000483 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000485 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488#undef b
489}
490
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000492list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000493{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000494 Py_ssize_t i, j;
495 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000497 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000498 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000499 if (n < 0)
500 n = 0;
Martin v. Löwis68192102007-07-21 06:55:02 +0000501 size = Py_Size(a) * n;
Martin v. Löwis68192102007-07-21 06:55:02 +0000502 if (n && size/n != Py_Size(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000503 return PyErr_NoMemory();
Armin Rigoa1e42e12007-10-17 18:46:37 +0000504 if (size == 0)
505 return PyList_New(0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000507 if (np == NULL)
508 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000509
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000510 items = np->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +0000511 if (Py_Size(a) == 1) {
Raymond Hettinger6624e682003-05-21 05:58:46 +0000512 elem = a->ob_item[0];
513 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000514 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000515 Py_INCREF(elem);
516 }
517 return (PyObject *) np;
518 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000519 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000520 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000521 for (i = 0; i < n; i++) {
Martin v. Löwis68192102007-07-21 06:55:02 +0000522 for (j = 0; j < Py_Size(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000523 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000525 p++;
526 }
527 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000529}
530
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531static int
Armin Rigo93677f02004-07-29 12:40:23 +0000532list_clear(PyListObject *a)
533{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000534 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000535 PyObject **item = a->ob_item;
536 if (item != NULL) {
537 /* Because XDECREF can recursively invoke operations on
538 this list, we make it empty first. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000539 i = Py_Size(a);
540 Py_Size(a) = 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000541 a->ob_item = NULL;
542 a->allocated = 0;
543 while (--i >= 0) {
544 Py_XDECREF(item[i]);
545 }
546 PyMem_FREE(item);
547 }
548 /* Never fails; the return value can be ignored.
549 Note that there is no guarantee that the list is actually empty
550 at this point, because XDECREF may have populated it again! */
551 return 0;
552}
553
Tim Peters8fc4a912004-07-31 21:53:19 +0000554/* a[ilow:ihigh] = v if v != NULL.
555 * del a[ilow:ihigh] if v == NULL.
556 *
557 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
558 * guaranteed the call cannot fail.
559 */
Armin Rigo93677f02004-07-29 12:40:23 +0000560static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000561list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000563 /* Because [X]DECREF can recursively invoke list operations on
564 this list, we must postpone all [X]DECREF activity until
565 after the list is back in its canonical shape. Therefore
566 we must allocate an additional array, 'recycle', into which
567 we temporarily copy the items that are deleted from the
568 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000569 PyObject *recycle_on_stack[8];
570 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000572 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000573 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000574 Py_ssize_t n; /* # of elements in replacement list */
575 Py_ssize_t norig; /* # of elements in list getting replaced */
576 Py_ssize_t d; /* Change in size */
577 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000578 size_t s;
579 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581 if (v == NULL)
582 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000583 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000584 if (a == b) {
585 /* Special case "a[i:j] = a" -- copy b first */
Martin v. Löwis68192102007-07-21 06:55:02 +0000586 v = list_slice(b, 0, Py_Size(b));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000587 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000588 return result;
589 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000591 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000592 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000593 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000594 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000595 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000596 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000597 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000598 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000599 if (ilow < 0)
600 ilow = 0;
Martin v. Löwis68192102007-07-21 06:55:02 +0000601 else if (ilow > Py_Size(a))
602 ilow = Py_Size(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000603
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604 if (ihigh < ilow)
605 ihigh = ilow;
Martin v. Löwis68192102007-07-21 06:55:02 +0000606 else if (ihigh > Py_Size(a))
607 ihigh = Py_Size(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000608
Tim Peters8d9eb102004-07-31 02:24:20 +0000609 norig = ihigh - ilow;
610 assert(norig >= 0);
611 d = n - norig;
Martin v. Löwis68192102007-07-21 06:55:02 +0000612 if (Py_Size(a) + d == 0) {
Armin Rigo93677f02004-07-29 12:40:23 +0000613 Py_XDECREF(v_as_SF);
614 return list_clear(a);
615 }
616 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000617 /* recycle the items that we are about to remove */
618 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000619 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000620 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000621 if (recycle == NULL) {
622 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000623 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000624 }
625 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000626 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000627
Armin Rigo1dd04a02004-07-30 11:38:22 +0000628 if (d < 0) { /* Delete -d items */
629 memmove(&item[ihigh+d], &item[ihigh],
Martin v. Löwis68192102007-07-21 06:55:02 +0000630 (Py_Size(a) - ihigh)*sizeof(PyObject *));
631 list_resize(a, Py_Size(a) + d);
Armin Rigo1dd04a02004-07-30 11:38:22 +0000632 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000634 else if (d > 0) { /* Insert d items */
Martin v. Löwis68192102007-07-21 06:55:02 +0000635 k = Py_Size(a);
Tim Peters73572222004-07-31 02:54:42 +0000636 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000637 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000638 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000639 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000640 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000641 }
642 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000643 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000645 item[ilow] = w;
646 }
Tim Peters73572222004-07-31 02:54:42 +0000647 for (k = norig - 1; k >= 0; --k)
648 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000649 result = 0;
650 Error:
Tim Peters73572222004-07-31 02:54:42 +0000651 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000652 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000653 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000654 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000655#undef b
656}
657
Guido van Rossum234f9421993-06-17 12:35:49 +0000658int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000659PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000660{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 if (!PyList_Check(a)) {
662 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000663 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000664 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000666}
667
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000668static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000669list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000670{
671 PyObject **items;
Armin Rigoa1e42e12007-10-17 18:46:37 +0000672 Py_ssize_t size, i, j, p, newsize;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000673
674
675 size = PyList_GET_SIZE(self);
676 if (size == 0) {
677 Py_INCREF(self);
678 return (PyObject *)self;
679 }
680
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000681 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000682 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000683 Py_INCREF(self);
684 return (PyObject *)self;
685 }
686
Armin Rigoa1e42e12007-10-17 18:46:37 +0000687 newsize = size * n;
688 if (newsize/n != size)
689 return PyErr_NoMemory();
690 if (list_resize(self, newsize) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000691 return NULL;
692
693 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000694 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000695 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
696 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000697 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000698 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000699 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000700 }
701 }
702 Py_INCREF(self);
703 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000704}
705
Guido van Rossum4a450d01991-04-03 19:05:18 +0000706static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000707list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000708{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 PyObject *old_value;
Martin v. Löwis68192102007-07-21 06:55:02 +0000710 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 PyErr_SetString(PyExc_IndexError,
712 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000713 return -1;
714 }
715 if (v == NULL)
716 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000718 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000719 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000720 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000721 return 0;
722}
723
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000725listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000727 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000729 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000731 if (ins1(self, i, v) == 0)
732 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000733 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000734}
735
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000737listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000738{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000739 if (app1(self, v) == 0)
740 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000741 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000742}
743
Barry Warsawdedf6d61998-10-09 16:37:25 +0000744static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000745listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000746{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000747 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000748 Py_ssize_t m; /* size of self */
749 Py_ssize_t n; /* guess for size of b */
750 Py_ssize_t mn; /* m + n */
751 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000752 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000753
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000754 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000755 1) lists and tuples which can use PySequence_Fast ops
756 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000757 */
758 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000759 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000760 b = PySequence_Fast(b, "argument must be iterable");
761 if (!b)
762 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000763 n = PySequence_Fast_GET_SIZE(b);
764 if (n == 0) {
765 /* short circuit when b is empty */
766 Py_DECREF(b);
767 Py_RETURN_NONE;
768 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000769 m = Py_Size(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000770 if (list_resize(self, m + n) == -1) {
771 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000772 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000773 }
774 /* note that we may still have self == b here for the
775 * situation a.extend(a), but the following code works
776 * in that case too. Just make sure to resize self
777 * before calling PySequence_Fast_ITEMS.
778 */
779 /* populate the end of self with b's items */
780 src = PySequence_Fast_ITEMS(b);
781 dest = self->ob_item + m;
782 for (i = 0; i < n; i++) {
783 PyObject *o = src[i];
784 Py_INCREF(o);
785 dest[i] = o;
786 }
787 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000788 Py_RETURN_NONE;
789 }
790
791 it = PyObject_GetIter(b);
792 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000793 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000794 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000795
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000796 /* Guess a result list size. */
Armin Rigof5b3e362006-02-11 21:32:43 +0000797 n = _PyObject_LengthHint(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000798 if (n < 0) {
Christian Heimesfe4826f2007-12-05 12:49:14 +0000799 if (PyErr_Occurred()
800 && !PyErr_ExceptionMatches(PyExc_TypeError)
801 && !PyErr_ExceptionMatches(PyExc_AttributeError)) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000802 Py_DECREF(it);
803 return NULL;
804 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000805 PyErr_Clear();
806 n = 8; /* arbitrary */
807 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000808 m = Py_Size(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000809 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000810 if (mn >= m) {
811 /* Make room. */
812 if (list_resize(self, mn) == -1)
813 goto error;
814 /* Make the list sane again. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000815 Py_Size(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000816 }
817 /* Else m + n overflowed; on the chance that n lied, and there really
818 * is enough room, ignore it. If n was telling the truth, we'll
819 * eventually run out of memory during the loop.
820 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000821
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000822 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000823 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000824 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000825 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000826 if (PyErr_Occurred()) {
827 if (PyErr_ExceptionMatches(PyExc_StopIteration))
828 PyErr_Clear();
829 else
830 goto error;
831 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000832 break;
833 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000834 if (Py_Size(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000835 /* steals ref */
Martin v. Löwis68192102007-07-21 06:55:02 +0000836 PyList_SET_ITEM(self, Py_Size(self), item);
837 ++Py_Size(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000838 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000839 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000840 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000841 Py_DECREF(item); /* append creates a new ref */
842 if (status < 0)
843 goto error;
844 }
845 }
846
847 /* Cut back result list if initial guess was too large. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000848 if (Py_Size(self) < self->allocated)
849 list_resize(self, Py_Size(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000850
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000851 Py_DECREF(it);
852 Py_RETURN_NONE;
853
854 error:
855 Py_DECREF(it);
856 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857}
858
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000859PyObject *
860_PyList_Extend(PyListObject *self, PyObject *b)
861{
862 return listextend(self, b);
863}
864
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000865static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000866list_inplace_concat(PyListObject *self, PyObject *other)
867{
868 PyObject *result;
869
870 result = listextend(self, other);
871 if (result == NULL)
872 return result;
873 Py_DECREF(result);
874 Py_INCREF(self);
875 return (PyObject *)self;
876}
877
878static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000879listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000880{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000881 Py_ssize_t i = -1;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000882 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000883 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000884
Armin Rigo7ccbca92006-10-04 12:17:45 +0000885 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000886 return NULL;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000887
Martin v. Löwis68192102007-07-21 06:55:02 +0000888 if (Py_Size(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000889 /* Special-case most common failure cause */
890 PyErr_SetString(PyExc_IndexError, "pop from empty list");
891 return NULL;
892 }
893 if (i < 0)
Martin v. Löwis68192102007-07-21 06:55:02 +0000894 i += Py_Size(self);
895 if (i < 0 || i >= Py_Size(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000896 PyErr_SetString(PyExc_IndexError, "pop index out of range");
897 return NULL;
898 }
899 v = self->ob_item[i];
Martin v. Löwis68192102007-07-21 06:55:02 +0000900 if (i == Py_Size(self) - 1) {
901 status = list_resize(self, Py_Size(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000902 assert(status >= 0);
903 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000904 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000905 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000906 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
907 assert(status >= 0);
908 /* Use status, so that in a release build compilers don't
909 * complain about the unused name.
910 */
Brett Cannon651dd522004-08-08 21:21:18 +0000911 (void) status;
912
913 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000914}
915
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000916/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
917static void
918reverse_slice(PyObject **lo, PyObject **hi)
919{
920 assert(lo && hi);
921
922 --hi;
923 while (lo < hi) {
924 PyObject *t = *lo;
925 *lo = *hi;
926 *hi = t;
927 ++lo;
928 --hi;
929 }
930}
931
Tim Petersa64dc242002-08-01 02:13:36 +0000932/* Lots of code for an adaptive, stable, natural mergesort. There are many
933 * pieces to this algorithm; read listsort.txt for overviews and details.
934 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000935
Guido van Rossum3f236de1996-12-10 23:55:39 +0000936/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000937 * comparison function (any callable Python object), which must not be
938 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
939 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000940 * Returns -1 on error, 1 if x < y, 0 if x >= y.
941 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000942static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000943islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000944{
Tim Petersf2a04732002-07-11 21:46:16 +0000945 PyObject *res;
946 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000947 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000948
Tim Peters66860f62002-08-04 17:47:26 +0000949 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000950 /* Call the user's comparison function and translate the 3-way
951 * result into true or false (or error).
952 */
Tim Petersf2a04732002-07-11 21:46:16 +0000953 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000954 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000955 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000956 Py_INCREF(x);
957 Py_INCREF(y);
958 PyTuple_SET_ITEM(args, 0, x);
959 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000960 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000962 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000963 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 if (!PyInt_Check(res)) {
Georg Brandl283a1352006-11-19 08:48:30 +0000965 PyErr_Format(PyExc_TypeError,
966 "comparison function must return int, not %.200s",
967 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000969 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000970 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 i = PyInt_AsLong(res);
972 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000973 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000974}
975
Tim Peters66860f62002-08-04 17:47:26 +0000976/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
977 * islt. This avoids a layer of function call in the usual case, and
978 * sorting does many comparisons.
979 * Returns -1 on error, 1 if x < y, 0 if x >= y.
980 */
981#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
982 PyObject_RichCompareBool(X, Y, Py_LT) : \
983 islt(X, Y, COMPARE))
984
985/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000986 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
987 started. It makes more sense in context <wink>. X and Y are PyObject*s.
988*/
Tim Peters66860f62002-08-04 17:47:26 +0000989#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000990 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000991
992/* binarysort is the best method for sorting small arrays: it does
993 few compares, but can do data movement quadratic in the number of
994 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000995 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000996 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000997 On entry, must have lo <= start <= hi, and that [lo, start) is already
998 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000999 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001000 Even in case of error, the output slice will be some permutation of
1001 the input (nothing is lost or duplicated).
1002*/
Guido van Rossum3f236de1996-12-10 23:55:39 +00001003static int
Fred Drakea2f55112000-07-09 15:16:51 +00001004binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
1005 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001006{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001007 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001008 register PyObject **l, **p, **r;
1009 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001010
Tim Petersa8c974c2002-07-19 03:30:57 +00001011 assert(lo <= start && start <= hi);
1012 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001013 if (lo == start)
1014 ++start;
1015 for (; start < hi; ++start) {
1016 /* set l to where *start belongs */
1017 l = lo;
1018 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001019 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +00001020 /* Invariants:
1021 * pivot >= all in [lo, l).
1022 * pivot < all in [r, start).
1023 * The second is vacuously true at the start.
1024 */
1025 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001026 do {
1027 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +00001028 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001029 r = p;
1030 else
Tim Peters0fe977c2002-07-19 06:12:32 +00001031 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001032 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001033 assert(l == r);
1034 /* The invariants still hold, so pivot >= all in [lo, l) and
1035 pivot < all in [l, start), so pivot belongs at l. Note
1036 that if there are elements equal to pivot, l points to the
1037 first slot after them -- that's why this sort is stable.
1038 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001039 Caution: using memmove is much slower under MSVC 5;
1040 we're not usually moving many slots. */
1041 for (p = start; p > l; --p)
1042 *p = *(p-1);
1043 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001044 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001045 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001046
1047 fail:
1048 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001049}
1050
Tim Petersa64dc242002-08-01 02:13:36 +00001051/*
1052Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1053is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001054
Tim Petersa64dc242002-08-01 02:13:36 +00001055 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001056
Tim Petersa64dc242002-08-01 02:13:36 +00001057or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001058
Tim Petersa64dc242002-08-01 02:13:36 +00001059 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001060
Tim Petersa64dc242002-08-01 02:13:36 +00001061Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1062For its intended use in a stable mergesort, the strictness of the defn of
1063"descending" is needed so that the caller can safely reverse a descending
1064sequence without violating stability (strict > ensures there are no equal
1065elements to get out of order).
1066
1067Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001068*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001069static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001070count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001071{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001072 Py_ssize_t k;
1073 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001074
Tim Petersa64dc242002-08-01 02:13:36 +00001075 assert(lo < hi);
1076 *descending = 0;
1077 ++lo;
1078 if (lo == hi)
1079 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001080
Tim Petersa64dc242002-08-01 02:13:36 +00001081 n = 2;
1082 IFLT(*lo, *(lo-1)) {
1083 *descending = 1;
1084 for (lo = lo+1; lo < hi; ++lo, ++n) {
1085 IFLT(*lo, *(lo-1))
1086 ;
1087 else
1088 break;
1089 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001090 }
Tim Petersa64dc242002-08-01 02:13:36 +00001091 else {
1092 for (lo = lo+1; lo < hi; ++lo, ++n) {
1093 IFLT(*lo, *(lo-1))
1094 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001095 }
1096 }
1097
Tim Petersa64dc242002-08-01 02:13:36 +00001098 return n;
1099fail:
1100 return -1;
1101}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001102
Tim Petersa64dc242002-08-01 02:13:36 +00001103/*
1104Locate the proper position of key in a sorted vector; if the vector contains
1105an element equal to key, return the position immediately to the left of
1106the leftmost equal element. [gallop_right() does the same except returns
1107the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001108
Tim Petersa64dc242002-08-01 02:13:36 +00001109"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001110
Tim Petersa64dc242002-08-01 02:13:36 +00001111"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1112hint is to the final result, the faster this runs.
1113
1114The return value is the int k in 0..n such that
1115
1116 a[k-1] < key <= a[k]
1117
1118pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1119key belongs at index k; or, IOW, the first k elements of a should precede
1120key, and the last n-k should follow key.
1121
1122Returns -1 on error. See listsort.txt for info on the method.
1123*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001124static Py_ssize_t
1125gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001126{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001127 Py_ssize_t ofs;
1128 Py_ssize_t lastofs;
1129 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001130
1131 assert(key && a && n > 0 && hint >= 0 && hint < n);
1132
1133 a += hint;
1134 lastofs = 0;
1135 ofs = 1;
1136 IFLT(*a, key) {
1137 /* a[hint] < key -- gallop right, until
1138 * a[hint + lastofs] < key <= a[hint + ofs]
1139 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001140 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001141 while (ofs < maxofs) {
1142 IFLT(a[ofs], key) {
1143 lastofs = ofs;
1144 ofs = (ofs << 1) + 1;
1145 if (ofs <= 0) /* int overflow */
1146 ofs = maxofs;
1147 }
1148 else /* key <= a[hint + ofs] */
1149 break;
1150 }
1151 if (ofs > maxofs)
1152 ofs = maxofs;
1153 /* Translate back to offsets relative to &a[0]. */
1154 lastofs += hint;
1155 ofs += hint;
1156 }
1157 else {
1158 /* key <= a[hint] -- gallop left, until
1159 * a[hint - ofs] < key <= a[hint - lastofs]
1160 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001161 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001162 while (ofs < maxofs) {
1163 IFLT(*(a-ofs), key)
1164 break;
1165 /* key <= a[hint - ofs] */
1166 lastofs = ofs;
1167 ofs = (ofs << 1) + 1;
1168 if (ofs <= 0) /* int overflow */
1169 ofs = maxofs;
1170 }
1171 if (ofs > maxofs)
1172 ofs = maxofs;
1173 /* Translate back to positive offsets relative to &a[0]. */
1174 k = lastofs;
1175 lastofs = hint - ofs;
1176 ofs = hint - k;
1177 }
1178 a -= hint;
1179
1180 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1181 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1182 * right of lastofs but no farther right than ofs. Do a binary
1183 * search, with invariant a[lastofs-1] < key <= a[ofs].
1184 */
1185 ++lastofs;
1186 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001187 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001188
1189 IFLT(a[m], key)
1190 lastofs = m+1; /* a[m] < key */
1191 else
1192 ofs = m; /* key <= a[m] */
1193 }
1194 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1195 return ofs;
1196
1197fail:
1198 return -1;
1199}
1200
1201/*
1202Exactly like gallop_left(), except that if key already exists in a[0:n],
1203finds the position immediately to the right of the rightmost equal value.
1204
1205The return value is the int k in 0..n such that
1206
1207 a[k-1] <= key < a[k]
1208
1209or -1 if error.
1210
1211The code duplication is massive, but this is enough different given that
1212we're sticking to "<" comparisons that it's much harder to follow if
1213written as one routine with yet another "left or right?" flag.
1214*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001215static Py_ssize_t
1216gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001217{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001218 Py_ssize_t ofs;
1219 Py_ssize_t lastofs;
1220 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001221
1222 assert(key && a && n > 0 && hint >= 0 && hint < n);
1223
1224 a += hint;
1225 lastofs = 0;
1226 ofs = 1;
1227 IFLT(key, *a) {
1228 /* key < a[hint] -- gallop left, until
1229 * a[hint - ofs] <= key < a[hint - lastofs]
1230 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001231 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001232 while (ofs < maxofs) {
1233 IFLT(key, *(a-ofs)) {
1234 lastofs = ofs;
1235 ofs = (ofs << 1) + 1;
1236 if (ofs <= 0) /* int overflow */
1237 ofs = maxofs;
1238 }
1239 else /* a[hint - ofs] <= key */
1240 break;
1241 }
1242 if (ofs > maxofs)
1243 ofs = maxofs;
1244 /* Translate back to positive offsets relative to &a[0]. */
1245 k = lastofs;
1246 lastofs = hint - ofs;
1247 ofs = hint - k;
1248 }
1249 else {
1250 /* a[hint] <= key -- gallop right, until
1251 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001252 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001253 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001254 while (ofs < maxofs) {
1255 IFLT(key, a[ofs])
1256 break;
1257 /* a[hint + ofs] <= key */
1258 lastofs = ofs;
1259 ofs = (ofs << 1) + 1;
1260 if (ofs <= 0) /* int overflow */
1261 ofs = maxofs;
1262 }
1263 if (ofs > maxofs)
1264 ofs = maxofs;
1265 /* Translate back to offsets relative to &a[0]. */
1266 lastofs += hint;
1267 ofs += hint;
1268 }
1269 a -= hint;
1270
1271 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1272 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1273 * right of lastofs but no farther right than ofs. Do a binary
1274 * search, with invariant a[lastofs-1] <= key < a[ofs].
1275 */
1276 ++lastofs;
1277 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001278 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001279
1280 IFLT(key, a[m])
1281 ofs = m; /* key < a[m] */
1282 else
1283 lastofs = m+1; /* a[m] <= key */
1284 }
1285 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1286 return ofs;
1287
1288fail:
1289 return -1;
1290}
1291
1292/* The maximum number of entries in a MergeState's pending-runs stack.
1293 * This is enough to sort arrays of size up to about
1294 * 32 * phi ** MAX_MERGE_PENDING
1295 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1296 * with 2**64 elements.
1297 */
1298#define MAX_MERGE_PENDING 85
1299
Tim Peterse05f65a2002-08-10 05:21:15 +00001300/* When we get into galloping mode, we stay there until both runs win less
1301 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001302 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001303#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001304
1305/* Avoid malloc for small temp arrays. */
1306#define MERGESTATE_TEMP_SIZE 256
1307
1308/* One MergeState exists on the stack per invocation of mergesort. It's just
1309 * a convenient way to pass state around among the helper functions.
1310 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001311struct s_slice {
1312 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001313 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001314};
1315
Tim Petersa64dc242002-08-01 02:13:36 +00001316typedef struct s_MergeState {
1317 /* The user-supplied comparison function. or NULL if none given. */
1318 PyObject *compare;
1319
Tim Peterse05f65a2002-08-10 05:21:15 +00001320 /* This controls when we get *into* galloping mode. It's initialized
1321 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1322 * random data, and lower for highly structured data.
1323 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001324 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001325
Tim Petersa64dc242002-08-01 02:13:36 +00001326 /* 'a' is temp storage to help with merges. It contains room for
1327 * alloced entries.
1328 */
1329 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001330 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001331
1332 /* A stack of n pending runs yet to be merged. Run #i starts at
1333 * address base[i] and extends for len[i] elements. It's always
1334 * true (so long as the indices are in bounds) that
1335 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001336 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001337 *
1338 * so we could cut the storage for this, but it's a minor amount,
1339 * and keeping all the info explicit simplifies the code.
1340 */
1341 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001342 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001343
1344 /* 'a' points to this when possible, rather than muck with malloc. */
1345 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1346} MergeState;
1347
1348/* Conceptually a MergeState's constructor. */
1349static void
1350merge_init(MergeState *ms, PyObject *compare)
1351{
1352 assert(ms != NULL);
1353 ms->compare = compare;
1354 ms->a = ms->temparray;
1355 ms->alloced = MERGESTATE_TEMP_SIZE;
1356 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001357 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001358}
1359
1360/* Free all the temp memory owned by the MergeState. This must be called
1361 * when you're done with a MergeState, and may be called before then if
1362 * you want to free the temp memory early.
1363 */
1364static void
1365merge_freemem(MergeState *ms)
1366{
1367 assert(ms != NULL);
1368 if (ms->a != ms->temparray)
1369 PyMem_Free(ms->a);
1370 ms->a = ms->temparray;
1371 ms->alloced = MERGESTATE_TEMP_SIZE;
1372}
1373
1374/* Ensure enough temp memory for 'need' array slots is available.
1375 * Returns 0 on success and -1 if the memory can't be gotten.
1376 */
1377static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001378merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001379{
1380 assert(ms != NULL);
1381 if (need <= ms->alloced)
1382 return 0;
1383 /* Don't realloc! That can cost cycles to copy the old data, but
1384 * we don't care what's in the block.
1385 */
1386 merge_freemem(ms);
1387 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1388 if (ms->a) {
1389 ms->alloced = need;
1390 return 0;
1391 }
1392 PyErr_NoMemory();
1393 merge_freemem(ms); /* reset to sane state */
1394 return -1;
1395}
1396#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1397 merge_getmem(MS, NEED))
1398
1399/* Merge the na elements starting at pa with the nb elements starting at pb
1400 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1401 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1402 * merge, and should have na <= nb. See listsort.txt for more info.
1403 * Return 0 if successful, -1 if error.
1404 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001405static Py_ssize_t
1406merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1407 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001408{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001409 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001410 PyObject *compare;
1411 PyObject **dest;
1412 int result = -1; /* guilty until proved innocent */
Neal Norwitz7fd96072006-08-19 04:28:55 +00001413 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001414
1415 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1416 if (MERGE_GETMEM(ms, na) < 0)
1417 return -1;
1418 memcpy(ms->a, pa, na * sizeof(PyObject*));
1419 dest = pa;
1420 pa = ms->a;
1421
1422 *dest++ = *pb++;
1423 --nb;
1424 if (nb == 0)
1425 goto Succeed;
1426 if (na == 1)
1427 goto CopyB;
1428
Neal Norwitz7fd96072006-08-19 04:28:55 +00001429 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001430 compare = ms->compare;
1431 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001432 Py_ssize_t acount = 0; /* # of times A won in a row */
1433 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001434
1435 /* Do the straightforward thing until (if ever) one run
1436 * appears to win consistently.
1437 */
1438 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001439 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001440 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001441 if (k) {
1442 if (k < 0)
1443 goto Fail;
1444 *dest++ = *pb++;
1445 ++bcount;
1446 acount = 0;
1447 --nb;
1448 if (nb == 0)
1449 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001450 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001451 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001452 }
1453 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001454 *dest++ = *pa++;
1455 ++acount;
1456 bcount = 0;
1457 --na;
1458 if (na == 1)
1459 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001460 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001461 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001462 }
Tim Petersa64dc242002-08-01 02:13:36 +00001463 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001464
Tim Petersa64dc242002-08-01 02:13:36 +00001465 /* One run is winning so consistently that galloping may
1466 * be a huge win. So try that, and continue galloping until
1467 * (if ever) neither run appears to be winning consistently
1468 * anymore.
1469 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001470 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001471 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001472 assert(na > 1 && nb > 0);
1473 min_gallop -= min_gallop > 1;
1474 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001475 k = gallop_right(*pb, pa, na, 0, compare);
1476 acount = k;
1477 if (k) {
1478 if (k < 0)
1479 goto Fail;
1480 memcpy(dest, pa, k * sizeof(PyObject *));
1481 dest += k;
1482 pa += k;
1483 na -= k;
1484 if (na == 1)
1485 goto CopyB;
1486 /* na==0 is impossible now if the comparison
1487 * function is consistent, but we can't assume
1488 * that it is.
1489 */
1490 if (na == 0)
1491 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001492 }
Tim Petersa64dc242002-08-01 02:13:36 +00001493 *dest++ = *pb++;
1494 --nb;
1495 if (nb == 0)
1496 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001497
Tim Petersa64dc242002-08-01 02:13:36 +00001498 k = gallop_left(*pa, pb, nb, 0, compare);
1499 bcount = k;
1500 if (k) {
1501 if (k < 0)
1502 goto Fail;
1503 memmove(dest, pb, k * sizeof(PyObject *));
1504 dest += k;
1505 pb += k;
1506 nb -= k;
1507 if (nb == 0)
1508 goto Succeed;
1509 }
1510 *dest++ = *pa++;
1511 --na;
1512 if (na == 1)
1513 goto CopyB;
1514 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001515 ++min_gallop; /* penalize it for leaving galloping mode */
1516 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001517 }
1518Succeed:
1519 result = 0;
1520Fail:
1521 if (na)
1522 memcpy(dest, pa, na * sizeof(PyObject*));
1523 return result;
1524CopyB:
1525 assert(na == 1 && nb > 0);
1526 /* The last element of pa belongs at the end of the merge. */
1527 memmove(dest, pb, nb * sizeof(PyObject *));
1528 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001529 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001530}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001531
Tim Petersa64dc242002-08-01 02:13:36 +00001532/* Merge the na elements starting at pa with the nb elements starting at pb
1533 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1534 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1535 * merge, and should have na >= nb. See listsort.txt for more info.
1536 * Return 0 if successful, -1 if error.
1537 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001538static Py_ssize_t
1539merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001540{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001541 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001542 PyObject *compare;
1543 PyObject **dest;
1544 int result = -1; /* guilty until proved innocent */
1545 PyObject **basea;
1546 PyObject **baseb;
Neal Norwitz7fd96072006-08-19 04:28:55 +00001547 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001548
1549 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1550 if (MERGE_GETMEM(ms, nb) < 0)
1551 return -1;
1552 dest = pb + nb - 1;
1553 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1554 basea = pa;
1555 baseb = ms->a;
1556 pb = ms->a + nb - 1;
1557 pa += na - 1;
1558
1559 *dest-- = *pa--;
1560 --na;
1561 if (na == 0)
1562 goto Succeed;
1563 if (nb == 1)
1564 goto CopyA;
1565
Neal Norwitz7fd96072006-08-19 04:28:55 +00001566 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001567 compare = ms->compare;
1568 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001569 Py_ssize_t acount = 0; /* # of times A won in a row */
1570 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001571
1572 /* Do the straightforward thing until (if ever) one run
1573 * appears to win consistently.
1574 */
1575 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001576 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001577 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001578 if (k) {
1579 if (k < 0)
1580 goto Fail;
1581 *dest-- = *pa--;
1582 ++acount;
1583 bcount = 0;
1584 --na;
1585 if (na == 0)
1586 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001587 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001588 break;
1589 }
1590 else {
1591 *dest-- = *pb--;
1592 ++bcount;
1593 acount = 0;
1594 --nb;
1595 if (nb == 1)
1596 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001597 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001598 break;
1599 }
1600 }
1601
1602 /* One run is winning so consistently that galloping may
1603 * be a huge win. So try that, and continue galloping until
1604 * (if ever) neither run appears to be winning consistently
1605 * anymore.
1606 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001607 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001608 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001609 assert(na > 0 && nb > 1);
1610 min_gallop -= min_gallop > 1;
1611 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001612 k = gallop_right(*pb, basea, na, na-1, compare);
1613 if (k < 0)
1614 goto Fail;
1615 k = na - k;
1616 acount = k;
1617 if (k) {
1618 dest -= k;
1619 pa -= k;
1620 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1621 na -= k;
1622 if (na == 0)
1623 goto Succeed;
1624 }
1625 *dest-- = *pb--;
1626 --nb;
1627 if (nb == 1)
1628 goto CopyA;
1629
1630 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1631 if (k < 0)
1632 goto Fail;
1633 k = nb - k;
1634 bcount = k;
1635 if (k) {
1636 dest -= k;
1637 pb -= k;
1638 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1639 nb -= k;
1640 if (nb == 1)
1641 goto CopyA;
1642 /* nb==0 is impossible now if the comparison
1643 * function is consistent, but we can't assume
1644 * that it is.
1645 */
1646 if (nb == 0)
1647 goto Succeed;
1648 }
1649 *dest-- = *pa--;
1650 --na;
1651 if (na == 0)
1652 goto Succeed;
1653 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001654 ++min_gallop; /* penalize it for leaving galloping mode */
1655 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001656 }
1657Succeed:
1658 result = 0;
1659Fail:
1660 if (nb)
1661 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1662 return result;
1663CopyA:
1664 assert(nb == 1 && na > 0);
1665 /* The first element of pb belongs at the front of the merge. */
1666 dest -= na;
1667 pa -= na;
1668 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1669 *dest = *pb;
1670 return 0;
1671}
1672
1673/* Merge the two runs at stack indices i and i+1.
1674 * Returns 0 on success, -1 on error.
1675 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001676static Py_ssize_t
1677merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001678{
1679 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001680 Py_ssize_t na, nb;
1681 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001682 PyObject *compare;
1683
1684 assert(ms != NULL);
1685 assert(ms->n >= 2);
1686 assert(i >= 0);
1687 assert(i == ms->n - 2 || i == ms->n - 3);
1688
Tim Peterse05f65a2002-08-10 05:21:15 +00001689 pa = ms->pending[i].base;
1690 na = ms->pending[i].len;
1691 pb = ms->pending[i+1].base;
1692 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001693 assert(na > 0 && nb > 0);
1694 assert(pa + na == pb);
1695
1696 /* Record the length of the combined runs; if i is the 3rd-last
1697 * run now, also slide over the last run (which isn't involved
1698 * in this merge). The current run i+1 goes away in any case.
1699 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001700 ms->pending[i].len = na + nb;
1701 if (i == ms->n - 3)
1702 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001703 --ms->n;
1704
1705 /* Where does b start in a? Elements in a before that can be
1706 * ignored (already in place).
1707 */
1708 compare = ms->compare;
1709 k = gallop_right(*pb, pa, na, 0, compare);
1710 if (k < 0)
1711 return -1;
1712 pa += k;
1713 na -= k;
1714 if (na == 0)
1715 return 0;
1716
1717 /* Where does a end in b? Elements in b after that can be
1718 * ignored (already in place).
1719 */
1720 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1721 if (nb <= 0)
1722 return nb;
1723
1724 /* Merge what remains of the runs, using a temp array with
1725 * min(na, nb) elements.
1726 */
1727 if (na <= nb)
1728 return merge_lo(ms, pa, na, pb, nb);
1729 else
1730 return merge_hi(ms, pa, na, pb, nb);
1731}
1732
1733/* Examine the stack of runs waiting to be merged, merging adjacent runs
1734 * until the stack invariants are re-established:
1735 *
1736 * 1. len[-3] > len[-2] + len[-1]
1737 * 2. len[-2] > len[-1]
1738 *
1739 * See listsort.txt for more info.
1740 *
1741 * Returns 0 on success, -1 on error.
1742 */
1743static int
1744merge_collapse(MergeState *ms)
1745{
Tim Peterse05f65a2002-08-10 05:21:15 +00001746 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001747
1748 assert(ms);
1749 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001750 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001751 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1752 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001753 --n;
1754 if (merge_at(ms, n) < 0)
1755 return -1;
1756 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001757 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001758 if (merge_at(ms, n) < 0)
1759 return -1;
1760 }
1761 else
1762 break;
1763 }
1764 return 0;
1765}
1766
1767/* Regardless of invariants, merge all runs on the stack until only one
1768 * remains. This is used at the end of the mergesort.
1769 *
1770 * Returns 0 on success, -1 on error.
1771 */
1772static int
1773merge_force_collapse(MergeState *ms)
1774{
Tim Peterse05f65a2002-08-10 05:21:15 +00001775 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001776
1777 assert(ms);
1778 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001779 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001780 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001781 --n;
1782 if (merge_at(ms, n) < 0)
1783 return -1;
1784 }
1785 return 0;
1786}
1787
1788/* Compute a good value for the minimum run length; natural runs shorter
1789 * than this are boosted artificially via binary insertion.
1790 *
1791 * If n < 64, return n (it's too small to bother with fancy stuff).
1792 * Else if n is an exact power of 2, return 32.
1793 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1794 * strictly less than, an exact power of 2.
1795 *
1796 * See listsort.txt for more info.
1797 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001798static Py_ssize_t
1799merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001800{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001801 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001802
1803 assert(n >= 0);
1804 while (n >= 64) {
1805 r |= n & 1;
1806 n >>= 1;
1807 }
1808 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001809}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001810
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001811/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001812 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001813 which is returned during the undecorate phase. By exposing only the key
1814 during comparisons, the underlying sort stability characteristics are left
1815 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001816 the key instead of a full record. */
1817
1818typedef struct {
1819 PyObject_HEAD
1820 PyObject *key;
1821 PyObject *value;
1822} sortwrapperobject;
1823
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001824PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Anthony Baxter377be112006-04-11 06:54:30 +00001825static PyObject *
1826sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1827static void
1828sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001829
1830static PyTypeObject sortwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001831 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001832 "sortwrapper", /* tp_name */
1833 sizeof(sortwrapperobject), /* tp_basicsize */
1834 0, /* tp_itemsize */
1835 /* methods */
1836 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1837 0, /* tp_print */
1838 0, /* tp_getattr */
1839 0, /* tp_setattr */
1840 0, /* tp_compare */
1841 0, /* tp_repr */
1842 0, /* tp_as_number */
1843 0, /* tp_as_sequence */
1844 0, /* tp_as_mapping */
1845 0, /* tp_hash */
1846 0, /* tp_call */
1847 0, /* tp_str */
1848 PyObject_GenericGetAttr, /* tp_getattro */
1849 0, /* tp_setattro */
1850 0, /* tp_as_buffer */
Tim Petersb38e2b62004-07-29 02:29:26 +00001851 Py_TPFLAGS_DEFAULT |
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001852 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1853 sortwrapper_doc, /* tp_doc */
1854 0, /* tp_traverse */
1855 0, /* tp_clear */
1856 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1857};
1858
Anthony Baxter377be112006-04-11 06:54:30 +00001859
1860static PyObject *
1861sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1862{
1863 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1864 PyErr_SetString(PyExc_TypeError,
1865 "expected a sortwrapperobject");
1866 return NULL;
1867 }
1868 return PyObject_RichCompare(a->key, b->key, op);
1869}
1870
1871static void
1872sortwrapper_dealloc(sortwrapperobject *so)
1873{
1874 Py_XDECREF(so->key);
1875 Py_XDECREF(so->value);
1876 PyObject_Del(so);
1877}
1878
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001879/* Returns a new reference to a sortwrapper.
1880 Consumes the references to the two underlying objects. */
1881
1882static PyObject *
1883build_sortwrapper(PyObject *key, PyObject *value)
1884{
1885 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001886
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001887 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1888 if (so == NULL)
1889 return NULL;
1890 so->key = key;
1891 so->value = value;
1892 return (PyObject *)so;
1893}
1894
1895/* Returns a new reference to the value underlying the wrapper. */
1896static PyObject *
1897sortwrapper_getvalue(PyObject *so)
1898{
1899 PyObject *value;
1900
1901 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001902 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001903 "expected a sortwrapperobject");
1904 return NULL;
1905 }
1906 value = ((sortwrapperobject *)so)->value;
1907 Py_INCREF(value);
1908 return value;
1909}
1910
1911/* Wrapper for user specified cmp functions in combination with a
1912 specified key function. Makes sure the cmp function is presented
1913 with the actual key instead of the sortwrapper */
1914
1915typedef struct {
1916 PyObject_HEAD
1917 PyObject *func;
1918} cmpwrapperobject;
1919
1920static void
1921cmpwrapper_dealloc(cmpwrapperobject *co)
1922{
1923 Py_XDECREF(co->func);
1924 PyObject_Del(co);
1925}
1926
1927static PyObject *
1928cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1929{
1930 PyObject *x, *y, *xx, *yy;
1931
1932 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1933 return NULL;
1934 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001935 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001936 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001937 "expected a sortwrapperobject");
1938 return NULL;
1939 }
1940 xx = ((sortwrapperobject *)x)->key;
1941 yy = ((sortwrapperobject *)y)->key;
1942 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1943}
1944
1945PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1946
1947static PyTypeObject cmpwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001948 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001949 "cmpwrapper", /* tp_name */
1950 sizeof(cmpwrapperobject), /* tp_basicsize */
1951 0, /* tp_itemsize */
1952 /* methods */
1953 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1954 0, /* tp_print */
1955 0, /* tp_getattr */
1956 0, /* tp_setattr */
1957 0, /* tp_compare */
1958 0, /* tp_repr */
1959 0, /* tp_as_number */
1960 0, /* tp_as_sequence */
1961 0, /* tp_as_mapping */
1962 0, /* tp_hash */
1963 (ternaryfunc)cmpwrapper_call, /* tp_call */
1964 0, /* tp_str */
1965 PyObject_GenericGetAttr, /* tp_getattro */
1966 0, /* tp_setattro */
1967 0, /* tp_as_buffer */
1968 Py_TPFLAGS_DEFAULT, /* tp_flags */
1969 cmpwrapper_doc, /* tp_doc */
1970};
1971
1972static PyObject *
1973build_cmpwrapper(PyObject *cmpfunc)
1974{
1975 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001976
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001977 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1978 if (co == NULL)
1979 return NULL;
1980 Py_INCREF(cmpfunc);
1981 co->func = cmpfunc;
1982 return (PyObject *)co;
1983}
1984
Tim Petersa64dc242002-08-01 02:13:36 +00001985/* An adaptive, stable, natural mergesort. See listsort.txt.
1986 * Returns Py_None on success, NULL on error. Even in case of error, the
1987 * list will be some permutation of its input state (nothing is lost or
1988 * duplicated).
1989 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001990static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001991listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001992{
Tim Petersa64dc242002-08-01 02:13:36 +00001993 MergeState ms;
1994 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001995 Py_ssize_t nremaining;
1996 Py_ssize_t minrun;
1997 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001998 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001999 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002000 PyObject *compare = NULL;
2001 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002002 int reverse = 0;
2003 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002004 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002005 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002006 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002007
Tim Petersa64dc242002-08-01 02:13:36 +00002008 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002009 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002010 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002011 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2012 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002013 return NULL;
2014 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002015 if (compare == Py_None)
2016 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002017 if (keyfunc == Py_None)
2018 keyfunc = NULL;
2019 if (compare != NULL && keyfunc != NULL) {
2020 compare = build_cmpwrapper(compare);
2021 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002022 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002023 } else
2024 Py_XINCREF(compare);
2025
Tim Petersb9099c32002-11-12 22:08:10 +00002026 /* The list is temporarily made empty, so that mutations performed
2027 * by comparison functions can't affect the slice of memory we're
2028 * sorting (allowing mutations during sorting is a core-dump
2029 * factory, since ob_item may change).
2030 */
Martin v. Löwis68192102007-07-21 06:55:02 +00002031 saved_ob_size = Py_Size(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002032 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002033 saved_allocated = self->allocated;
Martin v. Löwis68192102007-07-21 06:55:02 +00002034 Py_Size(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002035 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002036 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002037
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002038 if (keyfunc != NULL) {
2039 for (i=0 ; i < saved_ob_size ; i++) {
2040 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002041 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002042 NULL);
2043 if (key == NULL) {
2044 for (i=i-1 ; i>=0 ; i--) {
2045 kvpair = saved_ob_item[i];
2046 value = sortwrapper_getvalue(kvpair);
2047 saved_ob_item[i] = value;
2048 Py_DECREF(kvpair);
2049 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002050 goto dsu_fail;
2051 }
2052 kvpair = build_sortwrapper(key, value);
2053 if (kvpair == NULL)
2054 goto dsu_fail;
2055 saved_ob_item[i] = kvpair;
2056 }
2057 }
2058
2059 /* Reverse sort stability achieved by initially reversing the list,
2060 applying a stable forward sort, then reversing the final result. */
2061 if (reverse && saved_ob_size > 1)
2062 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2063
2064 merge_init(&ms, compare);
2065
Tim Petersb9099c32002-11-12 22:08:10 +00002066 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002067 if (nremaining < 2)
2068 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002069
Tim Petersa64dc242002-08-01 02:13:36 +00002070 /* March over the array once, left to right, finding natural runs,
2071 * and extending short natural runs to minrun elements.
2072 */
Tim Petersb9099c32002-11-12 22:08:10 +00002073 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002074 hi = lo + nremaining;
2075 minrun = merge_compute_minrun(nremaining);
2076 do {
2077 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002078 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002079
Tim Petersa64dc242002-08-01 02:13:36 +00002080 /* Identify next run. */
2081 n = count_run(lo, hi, compare, &descending);
2082 if (n < 0)
2083 goto fail;
2084 if (descending)
2085 reverse_slice(lo, lo + n);
2086 /* If short, extend to min(minrun, nremaining). */
2087 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002088 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002089 nremaining : minrun;
2090 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2091 goto fail;
2092 n = force;
2093 }
2094 /* Push run onto pending-runs stack, and maybe merge. */
2095 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002096 ms.pending[ms.n].base = lo;
2097 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002098 ++ms.n;
2099 if (merge_collapse(&ms) < 0)
2100 goto fail;
2101 /* Advance to find next run. */
2102 lo += n;
2103 nremaining -= n;
2104 } while (nremaining);
2105 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002106
Tim Petersa64dc242002-08-01 02:13:36 +00002107 if (merge_force_collapse(&ms) < 0)
2108 goto fail;
2109 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002110 assert(ms.pending[0].base == saved_ob_item);
2111 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002112
2113succeed:
2114 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002115fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002116 if (keyfunc != NULL) {
2117 for (i=0 ; i < saved_ob_size ; i++) {
2118 kvpair = saved_ob_item[i];
2119 value = sortwrapper_getvalue(kvpair);
2120 saved_ob_item[i] = value;
2121 Py_DECREF(kvpair);
2122 }
2123 }
2124
Armin Rigo93677f02004-07-29 12:40:23 +00002125 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002126 /* The user mucked with the list during the sort,
2127 * and we don't already have another error to report.
2128 */
2129 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2130 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002131 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002132
2133 if (reverse && saved_ob_size > 1)
2134 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2135
2136 merge_freemem(&ms);
2137
2138dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002139 final_ob_item = self->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +00002140 i = Py_Size(self);
2141 Py_Size(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002142 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002143 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002144 if (final_ob_item != NULL) {
2145 /* we cannot use list_clear() for this because it does not
2146 guarantee that the list is really empty when it returns */
2147 while (--i >= 0) {
2148 Py_XDECREF(final_ob_item[i]);
2149 }
2150 PyMem_FREE(final_ob_item);
2151 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002152 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002153 Py_XINCREF(result);
2154 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002155}
Tim Peters330f9e92002-07-19 07:05:44 +00002156#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002157#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002158
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002159int
Fred Drakea2f55112000-07-09 15:16:51 +00002160PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002161{
2162 if (v == NULL || !PyList_Check(v)) {
2163 PyErr_BadInternalCall();
2164 return -1;
2165 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002166 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002167 if (v == NULL)
2168 return -1;
2169 Py_DECREF(v);
2170 return 0;
2171}
2172
Guido van Rossumb86c5492001-02-12 22:06:02 +00002173static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002174listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002175{
Martin v. Löwis68192102007-07-21 06:55:02 +00002176 if (Py_Size(self) > 1)
2177 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002178 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002179}
2180
Guido van Rossum84c76f51990-10-30 13:32:20 +00002181int
Fred Drakea2f55112000-07-09 15:16:51 +00002182PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002183{
Tim Peters6063e262002-08-08 01:06:39 +00002184 PyListObject *self = (PyListObject *)v;
2185
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002186 if (v == NULL || !PyList_Check(v)) {
2187 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002188 return -1;
2189 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002190 if (Py_Size(self) > 1)
2191 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002192 return 0;
2193}
2194
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002195PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002196PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002197{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002198 PyObject *w;
2199 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002200 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002201 if (v == NULL || !PyList_Check(v)) {
2202 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002203 return NULL;
2204 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002205 n = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002206 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002207 if (w == NULL)
2208 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002209 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002210 memcpy((void *)p,
2211 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002212 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002213 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002214 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002215 p++;
2216 }
2217 return w;
2218}
2219
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002220static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002221listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002222{
Martin v. Löwis68192102007-07-21 06:55:02 +00002223 Py_ssize_t i, start=0, stop=Py_Size(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002224 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002225
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002226 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2227 _PyEval_SliceIndex, &start,
2228 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002229 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002230 if (start < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002231 start += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002232 if (start < 0)
2233 start = 0;
2234 }
2235 if (stop < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002236 stop += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002237 if (stop < 0)
2238 stop = 0;
2239 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002240 for (i = start; i < stop && i < Py_Size(self); 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)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002243 return PyInt_FromSsize_t(i);
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 Rossumed98d481991-03-06 13:07:53 +00002246 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002247 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002248 return NULL;
2249}
2250
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002251static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002252listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002253{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002254 Py_ssize_t count = 0;
2255 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002256
Martin v. Löwis68192102007-07-21 06:55:02 +00002257 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002258 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2259 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002260 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002261 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002262 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002263 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002264 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002265}
2266
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002267static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002268listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002269{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002270 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002271
Martin v. Löwis68192102007-07-21 06:55:02 +00002272 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002273 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2274 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002275 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002276 (PyObject *)NULL) == 0)
2277 Py_RETURN_NONE;
2278 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002279 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002280 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002281 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002282 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002283 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002284 return NULL;
2285}
2286
Jeremy Hylton8caad492000-06-23 14:18:11 +00002287static int
2288list_traverse(PyListObject *o, visitproc visit, void *arg)
2289{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002290 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002291
Martin v. Löwis68192102007-07-21 06:55:02 +00002292 for (i = Py_Size(o); --i >= 0; )
Thomas Woutersc6e55062006-04-15 21:47:09 +00002293 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002294 return 0;
2295}
2296
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002297static PyObject *
2298list_richcompare(PyObject *v, PyObject *w, int op)
2299{
2300 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002301 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002302
2303 if (!PyList_Check(v) || !PyList_Check(w)) {
2304 Py_INCREF(Py_NotImplemented);
2305 return Py_NotImplemented;
2306 }
2307
2308 vl = (PyListObject *)v;
2309 wl = (PyListObject *)w;
2310
Martin v. Löwis68192102007-07-21 06:55:02 +00002311 if (Py_Size(vl) != Py_Size(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002312 /* Shortcut: if the lengths differ, the lists differ */
2313 PyObject *res;
2314 if (op == Py_EQ)
2315 res = Py_False;
2316 else
2317 res = Py_True;
2318 Py_INCREF(res);
2319 return res;
2320 }
2321
2322 /* Search for the first index where items are different */
Martin v. Löwis68192102007-07-21 06:55:02 +00002323 for (i = 0; i < Py_Size(vl) && i < Py_Size(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002324 int k = PyObject_RichCompareBool(vl->ob_item[i],
2325 wl->ob_item[i], Py_EQ);
2326 if (k < 0)
2327 return NULL;
2328 if (!k)
2329 break;
2330 }
2331
Martin v. Löwis68192102007-07-21 06:55:02 +00002332 if (i >= Py_Size(vl) || i >= Py_Size(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002333 /* No more items to compare -- compare sizes */
Martin v. Löwis68192102007-07-21 06:55:02 +00002334 Py_ssize_t vs = Py_Size(vl);
2335 Py_ssize_t ws = Py_Size(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002336 int cmp;
2337 PyObject *res;
2338 switch (op) {
2339 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002340 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002341 case Py_EQ: cmp = vs == ws; break;
2342 case Py_NE: cmp = vs != ws; break;
2343 case Py_GT: cmp = vs > ws; break;
2344 case Py_GE: cmp = vs >= ws; break;
2345 default: return NULL; /* cannot happen */
2346 }
2347 if (cmp)
2348 res = Py_True;
2349 else
2350 res = Py_False;
2351 Py_INCREF(res);
2352 return res;
2353 }
2354
2355 /* We have an item that differs -- shortcuts for EQ/NE */
2356 if (op == Py_EQ) {
2357 Py_INCREF(Py_False);
2358 return Py_False;
2359 }
2360 if (op == Py_NE) {
2361 Py_INCREF(Py_True);
2362 return Py_True;
2363 }
2364
2365 /* Compare the final item again using the proper operator */
2366 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2367}
2368
Tim Peters6d6c1a32001-08-02 04:15:00 +00002369static int
2370list_init(PyListObject *self, PyObject *args, PyObject *kw)
2371{
2372 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002373 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002374
2375 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2376 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002377
2378 /* Verify list invariants established by PyType_GenericAlloc() */
Martin v. Löwis68192102007-07-21 06:55:02 +00002379 assert(0 <= Py_Size(self));
2380 assert(Py_Size(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002381 assert(self->ob_item != NULL ||
2382 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002383
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002384 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002385 if (self->ob_item != NULL) {
2386 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002387 }
2388 if (arg != NULL) {
2389 PyObject *rv = listextend(self, arg);
2390 if (rv == NULL)
2391 return -1;
2392 Py_DECREF(rv);
2393 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002394 return 0;
2395}
2396
Raymond Hettinger1021c442003-11-07 15:38:09 +00002397static PyObject *list_iter(PyObject *seq);
2398static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2399
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002400PyDoc_STRVAR(getitem_doc,
2401"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002402PyDoc_STRVAR(reversed_doc,
2403"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002404PyDoc_STRVAR(append_doc,
2405"L.append(object) -- append object to end");
2406PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002407"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002408PyDoc_STRVAR(insert_doc,
2409"L.insert(index, object) -- insert object before index");
2410PyDoc_STRVAR(pop_doc,
2411"L.pop([index]) -> item -- remove and return item at index (default last)");
2412PyDoc_STRVAR(remove_doc,
2413"L.remove(value) -- remove first occurrence of value");
2414PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002415"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002416PyDoc_STRVAR(count_doc,
2417"L.count(value) -> integer -- return number of occurrences of value");
2418PyDoc_STRVAR(reverse_doc,
2419"L.reverse() -- reverse *IN PLACE*");
2420PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002421"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2422cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002423
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002424static PyObject *list_subscript(PyListObject*, PyObject*);
2425
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002426static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002427 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002428 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002429 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002430 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002431 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002432 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002433 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002434 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002435 {"count", (PyCFunction)listcount, METH_O, count_doc},
2436 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002437 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002438 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002439};
2440
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002441static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002442 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002443 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002444 (ssizeargfunc)list_repeat, /* sq_repeat */
2445 (ssizeargfunc)list_item, /* sq_item */
2446 (ssizessizeargfunc)list_slice, /* sq_slice */
2447 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2448 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002449 (objobjproc)list_contains, /* sq_contains */
2450 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002451 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002452};
2453
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002454PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002455"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002456"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002457
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002458
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002459static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002460list_subscript(PyListObject* self, PyObject* item)
2461{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002462 if (PyIndex_Check(item)) {
2463 Py_ssize_t i;
2464 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002465 if (i == -1 && PyErr_Occurred())
2466 return NULL;
2467 if (i < 0)
2468 i += PyList_GET_SIZE(self);
2469 return list_item(self, i);
2470 }
2471 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002472 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002473 PyObject* result;
2474 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002475 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002476
Martin v. Löwis68192102007-07-21 06:55:02 +00002477 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002478 &start, &stop, &step, &slicelength) < 0) {
2479 return NULL;
2480 }
2481
2482 if (slicelength <= 0) {
2483 return PyList_New(0);
2484 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002485 else if (step == 1) {
2486 return list_slice(self, start, stop);
2487 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002488 else {
2489 result = PyList_New(slicelength);
2490 if (!result) return NULL;
2491
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002492 src = self->ob_item;
2493 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002494 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002495 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002496 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002497 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002498 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002499 }
Tim Peters3b01a122002-07-19 02:35:45 +00002500
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002501 return result;
2502 }
2503 }
2504 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002505 PyErr_Format(PyExc_TypeError,
2506 "list indices must be integers, not %.200s",
2507 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002508 return NULL;
2509 }
2510}
2511
Tim Peters3b01a122002-07-19 02:35:45 +00002512static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002513list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2514{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002515 if (PyIndex_Check(item)) {
2516 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002517 if (i == -1 && PyErr_Occurred())
2518 return -1;
2519 if (i < 0)
2520 i += PyList_GET_SIZE(self);
2521 return list_ass_item(self, i, value);
2522 }
2523 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002524 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002525
Martin v. Löwis68192102007-07-21 06:55:02 +00002526 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002527 &start, &stop, &step, &slicelength) < 0) {
2528 return -1;
2529 }
2530
Thomas Wouters3ccec682007-08-28 15:28:19 +00002531 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002532 return list_ass_slice(self, start, stop, value);
2533
Thomas Wouters3ccec682007-08-28 15:28:19 +00002534 /* Make sure s[5:2] = [..] inserts at the right place:
2535 before 5, not before 2. */
2536 if ((step < 0 && start < stop) ||
2537 (step > 0 && start > stop))
2538 stop = start;
2539
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002540 if (value == NULL) {
2541 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002542 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002543 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002544
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002545 if (slicelength <= 0)
2546 return 0;
2547
2548 if (step < 0) {
2549 stop = start + 1;
2550 start = stop + step*(slicelength - 1) - 1;
2551 step = -step;
2552 }
2553
2554 garbage = (PyObject**)
2555 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002556 if (!garbage) {
2557 PyErr_NoMemory();
2558 return -1;
2559 }
Tim Peters3b01a122002-07-19 02:35:45 +00002560
Thomas Wouters3ccec682007-08-28 15:28:19 +00002561 /* drawing pictures might help understand these for
2562 loops. Basically, we memmove the parts of the
2563 list that are *not* part of the slice: step-1
2564 items for each item that is part of the slice,
2565 and then tail end of the list that was not
2566 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002567 for (cur = start, i = 0;
2568 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002569 cur += step, i++) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00002570 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002571
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002572 garbage[i] = PyList_GET_ITEM(self, cur);
2573
Martin v. Löwis68192102007-07-21 06:55:02 +00002574 if (cur + step >= Py_Size(self)) {
2575 lim = Py_Size(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002576 }
2577
Tim Petersb38e2b62004-07-29 02:29:26 +00002578 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002579 self->ob_item + cur + 1,
2580 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002581 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002582 cur = start + slicelength*step;
2583 if (cur < Py_Size(self)) {
2584 memmove(self->ob_item + cur - slicelength,
2585 self->ob_item + cur,
2586 (Py_Size(self) - cur) *
2587 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002588 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002589
Martin v. Löwis68192102007-07-21 06:55:02 +00002590 Py_Size(self) -= slicelength;
2591 list_resize(self, Py_Size(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002592
2593 for (i = 0; i < slicelength; i++) {
2594 Py_DECREF(garbage[i]);
2595 }
2596 PyMem_FREE(garbage);
2597
2598 return 0;
2599 }
2600 else {
2601 /* assign slice */
Thomas Wouters3ccec682007-08-28 15:28:19 +00002602 PyObject *ins, *seq;
2603 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002604 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002605
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002606 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002607 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002608 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002609 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002610 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002611 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002612 seq = PySequence_Fast(value,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002613 "must assign iterable "
2614 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002615 }
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002616 if (!seq)
2617 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002618
2619 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2620 PyErr_Format(PyExc_ValueError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002621 "attempt to assign sequence of "
2622 "size %zd to extended slice of "
2623 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002624 PySequence_Fast_GET_SIZE(seq),
2625 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002626 Py_DECREF(seq);
2627 return -1;
2628 }
2629
2630 if (!slicelength) {
2631 Py_DECREF(seq);
2632 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002633 }
2634
2635 garbage = (PyObject**)
2636 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitze7e4e2d2006-10-28 21:20:12 +00002637 if (!garbage) {
2638 Py_DECREF(seq);
2639 PyErr_NoMemory();
2640 return -1;
2641 }
Tim Peters3b01a122002-07-19 02:35:45 +00002642
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002643 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002644 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002645 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002646 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002647 garbage[i] = selfitems[cur];
2648 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002649 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002650 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002651 }
2652
2653 for (i = 0; i < slicelength; i++) {
2654 Py_DECREF(garbage[i]);
2655 }
Tim Peters3b01a122002-07-19 02:35:45 +00002656
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002657 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002658 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002659
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002660 return 0;
2661 }
Tim Peters3b01a122002-07-19 02:35:45 +00002662 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002663 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002664 PyErr_Format(PyExc_TypeError,
2665 "list indices must be integers, not %.200s",
2666 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002667 return -1;
2668 }
2669}
2670
2671static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002672 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002673 (binaryfunc)list_subscript,
2674 (objobjargproc)list_ass_subscript
2675};
2676
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002677PyTypeObject PyList_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002678 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002679 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002680 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002681 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002682 (destructor)list_dealloc, /* tp_dealloc */
2683 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002684 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002685 0, /* tp_setattr */
2686 0, /* tp_compare */
2687 (reprfunc)list_repr, /* tp_repr */
2688 0, /* tp_as_number */
2689 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002690 &list_as_mapping, /* tp_as_mapping */
Guido van Rossum64c06e32007-11-22 00:55:51 +00002691 0, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002692 0, /* tp_call */
2693 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002694 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002695 0, /* tp_setattro */
2696 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002697 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002698 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002699 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002700 (traverseproc)list_traverse, /* tp_traverse */
2701 (inquiry)list_clear, /* tp_clear */
2702 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002703 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002704 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002705 0, /* tp_iternext */
2706 list_methods, /* tp_methods */
2707 0, /* tp_members */
2708 0, /* tp_getset */
2709 0, /* tp_base */
2710 0, /* tp_dict */
2711 0, /* tp_descr_get */
2712 0, /* tp_descr_set */
2713 0, /* tp_dictoffset */
2714 (initproc)list_init, /* tp_init */
2715 PyType_GenericAlloc, /* tp_alloc */
2716 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002717 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002718};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002719
2720
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002721/*********************** List Iterator **************************/
2722
2723typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002724 PyObject_HEAD
2725 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002726 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002727} listiterobject;
2728
Anthony Baxter377be112006-04-11 06:54:30 +00002729static PyObject *list_iter(PyObject *);
2730static void listiter_dealloc(listiterobject *);
2731static int listiter_traverse(listiterobject *, visitproc, void *);
2732static PyObject *listiter_next(listiterobject *);
2733static PyObject *listiter_len(listiterobject *);
2734
2735PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2736
2737static PyMethodDef listiter_methods[] = {
2738 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2739 {NULL, NULL} /* sentinel */
2740};
2741
2742PyTypeObject PyListIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002743 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002744 "listiterator", /* tp_name */
2745 sizeof(listiterobject), /* tp_basicsize */
2746 0, /* tp_itemsize */
2747 /* methods */
2748 (destructor)listiter_dealloc, /* tp_dealloc */
2749 0, /* tp_print */
2750 0, /* tp_getattr */
2751 0, /* tp_setattr */
2752 0, /* tp_compare */
2753 0, /* tp_repr */
2754 0, /* tp_as_number */
2755 0, /* tp_as_sequence */
2756 0, /* tp_as_mapping */
2757 0, /* tp_hash */
2758 0, /* tp_call */
2759 0, /* tp_str */
2760 PyObject_GenericGetAttr, /* tp_getattro */
2761 0, /* tp_setattro */
2762 0, /* tp_as_buffer */
2763 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2764 0, /* tp_doc */
2765 (traverseproc)listiter_traverse, /* tp_traverse */
2766 0, /* tp_clear */
2767 0, /* tp_richcompare */
2768 0, /* tp_weaklistoffset */
2769 PyObject_SelfIter, /* tp_iter */
2770 (iternextfunc)listiter_next, /* tp_iternext */
2771 listiter_methods, /* tp_methods */
2772 0, /* tp_members */
2773};
2774
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002775
Guido van Rossum5086e492002-07-16 15:56:52 +00002776static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002777list_iter(PyObject *seq)
2778{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002779 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002780
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002781 if (!PyList_Check(seq)) {
2782 PyErr_BadInternalCall();
2783 return NULL;
2784 }
2785 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2786 if (it == NULL)
2787 return NULL;
2788 it->it_index = 0;
2789 Py_INCREF(seq);
2790 it->it_seq = (PyListObject *)seq;
2791 _PyObject_GC_TRACK(it);
2792 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002793}
2794
2795static void
2796listiter_dealloc(listiterobject *it)
2797{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002798 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002799 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002800 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002801}
2802
2803static int
2804listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2805{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002806 Py_VISIT(it->it_seq);
2807 return 0;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002808}
2809
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002810static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002811listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002812{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002813 PyListObject *seq;
2814 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002815
Tim Peters93b2cc42002-06-01 05:22:55 +00002816 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002817 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002818 if (seq == NULL)
2819 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002820 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002821
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002822 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002823 item = PyList_GET_ITEM(seq, it->it_index);
2824 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002825 Py_INCREF(item);
2826 return item;
2827 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002828
2829 Py_DECREF(seq);
2830 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002831 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002832}
2833
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002834static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +00002835listiter_len(listiterobject *it)
2836{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002837 Py_ssize_t len;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002838 if (it->it_seq) {
2839 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2840 if (len >= 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002841 return PyInt_FromSsize_t(len);
Raymond Hettinger40a03822004-04-12 13:05:09 +00002842 }
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002843 return PyInt_FromLong(0);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002844}
Anthony Baxter377be112006-04-11 06:54:30 +00002845/*********************** List Reverse Iterator **************************/
Raymond Hettinger435bf582004-03-18 22:43:10 +00002846
Anthony Baxter377be112006-04-11 06:54:30 +00002847typedef struct {
2848 PyObject_HEAD
2849 Py_ssize_t it_index;
2850 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2851} listreviterobject;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002852
Anthony Baxter377be112006-04-11 06:54:30 +00002853static PyObject *list_reversed(PyListObject *, PyObject *);
2854static void listreviter_dealloc(listreviterobject *);
2855static int listreviter_traverse(listreviterobject *, visitproc, void *);
2856static PyObject *listreviter_next(listreviterobject *);
2857static Py_ssize_t listreviter_len(listreviterobject *);
2858
2859static PySequenceMethods listreviter_as_sequence = {
2860 (lenfunc)listreviter_len, /* sq_length */
2861 0, /* sq_concat */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002862};
2863
Anthony Baxter377be112006-04-11 06:54:30 +00002864PyTypeObject PyListRevIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002865 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002866 "listreverseiterator", /* tp_name */
2867 sizeof(listreviterobject), /* tp_basicsize */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002868 0, /* tp_itemsize */
2869 /* methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002870 (destructor)listreviter_dealloc, /* tp_dealloc */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002871 0, /* tp_print */
2872 0, /* tp_getattr */
2873 0, /* tp_setattr */
2874 0, /* tp_compare */
2875 0, /* tp_repr */
2876 0, /* tp_as_number */
Anthony Baxter377be112006-04-11 06:54:30 +00002877 &listreviter_as_sequence, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002878 0, /* tp_as_mapping */
2879 0, /* tp_hash */
2880 0, /* tp_call */
2881 0, /* tp_str */
2882 PyObject_GenericGetAttr, /* tp_getattro */
2883 0, /* tp_setattro */
2884 0, /* tp_as_buffer */
2885 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2886 0, /* tp_doc */
Anthony Baxter377be112006-04-11 06:54:30 +00002887 (traverseproc)listreviter_traverse, /* tp_traverse */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002888 0, /* tp_clear */
2889 0, /* tp_richcompare */
2890 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002891 PyObject_SelfIter, /* tp_iter */
Anthony Baxter377be112006-04-11 06:54:30 +00002892 (iternextfunc)listreviter_next, /* tp_iternext */
2893 0,
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002894};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002895
Raymond Hettinger1021c442003-11-07 15:38:09 +00002896static PyObject *
2897list_reversed(PyListObject *seq, PyObject *unused)
2898{
2899 listreviterobject *it;
2900
2901 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2902 if (it == NULL)
2903 return NULL;
2904 assert(PyList_Check(seq));
2905 it->it_index = PyList_GET_SIZE(seq) - 1;
2906 Py_INCREF(seq);
2907 it->it_seq = seq;
2908 PyObject_GC_Track(it);
2909 return (PyObject *)it;
2910}
2911
2912static void
2913listreviter_dealloc(listreviterobject *it)
2914{
2915 PyObject_GC_UnTrack(it);
2916 Py_XDECREF(it->it_seq);
2917 PyObject_GC_Del(it);
2918}
2919
2920static int
2921listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2922{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002923 Py_VISIT(it->it_seq);
2924 return 0;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002925}
2926
2927static PyObject *
2928listreviter_next(listreviterobject *it)
2929{
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002930 PyObject *item;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002931 Py_ssize_t index = it->it_index;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002932 PyListObject *seq = it->it_seq;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002933
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002934 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2935 item = PyList_GET_ITEM(seq, index);
Raymond Hettinger1021c442003-11-07 15:38:09 +00002936 it->it_index--;
2937 Py_INCREF(item);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002938 return item;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002939 }
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002940 it->it_index = -1;
2941 if (seq != NULL) {
2942 it->it_seq = NULL;
2943 Py_DECREF(seq);
2944 }
2945 return NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002946}
2947
Martin v. Löwis18e16552006-02-15 17:27:45 +00002948static Py_ssize_t
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002949listreviter_len(listreviterobject *it)
2950{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002951 Py_ssize_t len = it->it_index + 1;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002952 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2953 return 0;
2954 return len;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002955}