blob: fb5ce82cb0e25354c06890ba9b44bb6be7fc20b6 [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) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000799 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
800 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
801 Py_DECREF(it);
802 return NULL;
803 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000804 PyErr_Clear();
805 n = 8; /* arbitrary */
806 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000807 m = Py_Size(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000808 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000809 if (mn >= m) {
810 /* Make room. */
811 if (list_resize(self, mn) == -1)
812 goto error;
813 /* Make the list sane again. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000814 Py_Size(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000815 }
816 /* Else m + n overflowed; on the chance that n lied, and there really
817 * is enough room, ignore it. If n was telling the truth, we'll
818 * eventually run out of memory during the loop.
819 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000820
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000821 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000822 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000823 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000824 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000825 if (PyErr_Occurred()) {
826 if (PyErr_ExceptionMatches(PyExc_StopIteration))
827 PyErr_Clear();
828 else
829 goto error;
830 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000831 break;
832 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000833 if (Py_Size(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000834 /* steals ref */
Martin v. Löwis68192102007-07-21 06:55:02 +0000835 PyList_SET_ITEM(self, Py_Size(self), item);
836 ++Py_Size(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000837 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000838 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000839 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000840 Py_DECREF(item); /* append creates a new ref */
841 if (status < 0)
842 goto error;
843 }
844 }
845
846 /* Cut back result list if initial guess was too large. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000847 if (Py_Size(self) < self->allocated)
848 list_resize(self, Py_Size(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000849
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000850 Py_DECREF(it);
851 Py_RETURN_NONE;
852
853 error:
854 Py_DECREF(it);
855 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000856}
857
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000858PyObject *
859_PyList_Extend(PyListObject *self, PyObject *b)
860{
861 return listextend(self, b);
862}
863
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000864static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000865list_inplace_concat(PyListObject *self, PyObject *other)
866{
867 PyObject *result;
868
869 result = listextend(self, other);
870 if (result == NULL)
871 return result;
872 Py_DECREF(result);
873 Py_INCREF(self);
874 return (PyObject *)self;
875}
876
877static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000878listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000879{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000880 Py_ssize_t i = -1;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000881 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000882 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000883
Armin Rigo7ccbca92006-10-04 12:17:45 +0000884 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000885 return NULL;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000886
Martin v. Löwis68192102007-07-21 06:55:02 +0000887 if (Py_Size(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000888 /* Special-case most common failure cause */
889 PyErr_SetString(PyExc_IndexError, "pop from empty list");
890 return NULL;
891 }
892 if (i < 0)
Martin v. Löwis68192102007-07-21 06:55:02 +0000893 i += Py_Size(self);
894 if (i < 0 || i >= Py_Size(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000895 PyErr_SetString(PyExc_IndexError, "pop index out of range");
896 return NULL;
897 }
898 v = self->ob_item[i];
Martin v. Löwis68192102007-07-21 06:55:02 +0000899 if (i == Py_Size(self) - 1) {
900 status = list_resize(self, Py_Size(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000901 assert(status >= 0);
902 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000903 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000904 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000905 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
906 assert(status >= 0);
907 /* Use status, so that in a release build compilers don't
908 * complain about the unused name.
909 */
Brett Cannon651dd522004-08-08 21:21:18 +0000910 (void) status;
911
912 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000913}
914
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000915/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
916static void
917reverse_slice(PyObject **lo, PyObject **hi)
918{
919 assert(lo && hi);
920
921 --hi;
922 while (lo < hi) {
923 PyObject *t = *lo;
924 *lo = *hi;
925 *hi = t;
926 ++lo;
927 --hi;
928 }
929}
930
Tim Petersa64dc242002-08-01 02:13:36 +0000931/* Lots of code for an adaptive, stable, natural mergesort. There are many
932 * pieces to this algorithm; read listsort.txt for overviews and details.
933 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000934
Guido van Rossum3f236de1996-12-10 23:55:39 +0000935/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000936 * comparison function (any callable Python object), which must not be
937 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
938 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000939 * Returns -1 on error, 1 if x < y, 0 if x >= y.
940 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000941static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000942islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000943{
Tim Petersf2a04732002-07-11 21:46:16 +0000944 PyObject *res;
945 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000946 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000947
Tim Peters66860f62002-08-04 17:47:26 +0000948 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000949 /* Call the user's comparison function and translate the 3-way
950 * result into true or false (or error).
951 */
Tim Petersf2a04732002-07-11 21:46:16 +0000952 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000953 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000954 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000955 Py_INCREF(x);
956 Py_INCREF(y);
957 PyTuple_SET_ITEM(args, 0, x);
958 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000959 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000961 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000962 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 if (!PyInt_Check(res)) {
Georg Brandl283a1352006-11-19 08:48:30 +0000964 PyErr_Format(PyExc_TypeError,
965 "comparison function must return int, not %.200s",
966 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000968 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000969 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 i = PyInt_AsLong(res);
971 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000972 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000973}
974
Tim Peters66860f62002-08-04 17:47:26 +0000975/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
976 * islt. This avoids a layer of function call in the usual case, and
977 * sorting does many comparisons.
978 * Returns -1 on error, 1 if x < y, 0 if x >= y.
979 */
980#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
981 PyObject_RichCompareBool(X, Y, Py_LT) : \
982 islt(X, Y, COMPARE))
983
984/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000985 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
986 started. It makes more sense in context <wink>. X and Y are PyObject*s.
987*/
Tim Peters66860f62002-08-04 17:47:26 +0000988#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000989 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000990
991/* binarysort is the best method for sorting small arrays: it does
992 few compares, but can do data movement quadratic in the number of
993 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000994 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000995 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000996 On entry, must have lo <= start <= hi, and that [lo, start) is already
997 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000998 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000999 Even in case of error, the output slice will be some permutation of
1000 the input (nothing is lost or duplicated).
1001*/
Guido van Rossum3f236de1996-12-10 23:55:39 +00001002static int
Fred Drakea2f55112000-07-09 15:16:51 +00001003binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
1004 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001005{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001006 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001007 register PyObject **l, **p, **r;
1008 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001009
Tim Petersa8c974c2002-07-19 03:30:57 +00001010 assert(lo <= start && start <= hi);
1011 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001012 if (lo == start)
1013 ++start;
1014 for (; start < hi; ++start) {
1015 /* set l to where *start belongs */
1016 l = lo;
1017 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001018 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +00001019 /* Invariants:
1020 * pivot >= all in [lo, l).
1021 * pivot < all in [r, start).
1022 * The second is vacuously true at the start.
1023 */
1024 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001025 do {
1026 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +00001027 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001028 r = p;
1029 else
Tim Peters0fe977c2002-07-19 06:12:32 +00001030 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001031 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001032 assert(l == r);
1033 /* The invariants still hold, so pivot >= all in [lo, l) and
1034 pivot < all in [l, start), so pivot belongs at l. Note
1035 that if there are elements equal to pivot, l points to the
1036 first slot after them -- that's why this sort is stable.
1037 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001038 Caution: using memmove is much slower under MSVC 5;
1039 we're not usually moving many slots. */
1040 for (p = start; p > l; --p)
1041 *p = *(p-1);
1042 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001043 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001044 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001045
1046 fail:
1047 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001048}
1049
Tim Petersa64dc242002-08-01 02:13:36 +00001050/*
1051Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1052is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001053
Tim Petersa64dc242002-08-01 02:13:36 +00001054 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001055
Tim Petersa64dc242002-08-01 02:13:36 +00001056or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001057
Tim Petersa64dc242002-08-01 02:13:36 +00001058 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001059
Tim Petersa64dc242002-08-01 02:13:36 +00001060Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1061For its intended use in a stable mergesort, the strictness of the defn of
1062"descending" is needed so that the caller can safely reverse a descending
1063sequence without violating stability (strict > ensures there are no equal
1064elements to get out of order).
1065
1066Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001067*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001068static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001069count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001070{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001071 Py_ssize_t k;
1072 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001073
Tim Petersa64dc242002-08-01 02:13:36 +00001074 assert(lo < hi);
1075 *descending = 0;
1076 ++lo;
1077 if (lo == hi)
1078 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001079
Tim Petersa64dc242002-08-01 02:13:36 +00001080 n = 2;
1081 IFLT(*lo, *(lo-1)) {
1082 *descending = 1;
1083 for (lo = lo+1; lo < hi; ++lo, ++n) {
1084 IFLT(*lo, *(lo-1))
1085 ;
1086 else
1087 break;
1088 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001089 }
Tim Petersa64dc242002-08-01 02:13:36 +00001090 else {
1091 for (lo = lo+1; lo < hi; ++lo, ++n) {
1092 IFLT(*lo, *(lo-1))
1093 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001094 }
1095 }
1096
Tim Petersa64dc242002-08-01 02:13:36 +00001097 return n;
1098fail:
1099 return -1;
1100}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001101
Tim Petersa64dc242002-08-01 02:13:36 +00001102/*
1103Locate the proper position of key in a sorted vector; if the vector contains
1104an element equal to key, return the position immediately to the left of
1105the leftmost equal element. [gallop_right() does the same except returns
1106the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001107
Tim Petersa64dc242002-08-01 02:13:36 +00001108"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001109
Tim Petersa64dc242002-08-01 02:13:36 +00001110"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1111hint is to the final result, the faster this runs.
1112
1113The return value is the int k in 0..n such that
1114
1115 a[k-1] < key <= a[k]
1116
1117pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1118key belongs at index k; or, IOW, the first k elements of a should precede
1119key, and the last n-k should follow key.
1120
1121Returns -1 on error. See listsort.txt for info on the method.
1122*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001123static Py_ssize_t
1124gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001125{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001126 Py_ssize_t ofs;
1127 Py_ssize_t lastofs;
1128 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001129
1130 assert(key && a && n > 0 && hint >= 0 && hint < n);
1131
1132 a += hint;
1133 lastofs = 0;
1134 ofs = 1;
1135 IFLT(*a, key) {
1136 /* a[hint] < key -- gallop right, until
1137 * a[hint + lastofs] < key <= a[hint + ofs]
1138 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001139 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001140 while (ofs < maxofs) {
1141 IFLT(a[ofs], key) {
1142 lastofs = ofs;
1143 ofs = (ofs << 1) + 1;
1144 if (ofs <= 0) /* int overflow */
1145 ofs = maxofs;
1146 }
1147 else /* key <= a[hint + ofs] */
1148 break;
1149 }
1150 if (ofs > maxofs)
1151 ofs = maxofs;
1152 /* Translate back to offsets relative to &a[0]. */
1153 lastofs += hint;
1154 ofs += hint;
1155 }
1156 else {
1157 /* key <= a[hint] -- gallop left, until
1158 * a[hint - ofs] < key <= a[hint - lastofs]
1159 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001161 while (ofs < maxofs) {
1162 IFLT(*(a-ofs), key)
1163 break;
1164 /* key <= a[hint - ofs] */
1165 lastofs = ofs;
1166 ofs = (ofs << 1) + 1;
1167 if (ofs <= 0) /* int overflow */
1168 ofs = maxofs;
1169 }
1170 if (ofs > maxofs)
1171 ofs = maxofs;
1172 /* Translate back to positive offsets relative to &a[0]. */
1173 k = lastofs;
1174 lastofs = hint - ofs;
1175 ofs = hint - k;
1176 }
1177 a -= hint;
1178
1179 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1180 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1181 * right of lastofs but no farther right than ofs. Do a binary
1182 * search, with invariant a[lastofs-1] < key <= a[ofs].
1183 */
1184 ++lastofs;
1185 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001186 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001187
1188 IFLT(a[m], key)
1189 lastofs = m+1; /* a[m] < key */
1190 else
1191 ofs = m; /* key <= a[m] */
1192 }
1193 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1194 return ofs;
1195
1196fail:
1197 return -1;
1198}
1199
1200/*
1201Exactly like gallop_left(), except that if key already exists in a[0:n],
1202finds the position immediately to the right of the rightmost equal value.
1203
1204The return value is the int k in 0..n such that
1205
1206 a[k-1] <= key < a[k]
1207
1208or -1 if error.
1209
1210The code duplication is massive, but this is enough different given that
1211we're sticking to "<" comparisons that it's much harder to follow if
1212written as one routine with yet another "left or right?" flag.
1213*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001214static Py_ssize_t
1215gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001216{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001217 Py_ssize_t ofs;
1218 Py_ssize_t lastofs;
1219 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001220
1221 assert(key && a && n > 0 && hint >= 0 && hint < n);
1222
1223 a += hint;
1224 lastofs = 0;
1225 ofs = 1;
1226 IFLT(key, *a) {
1227 /* key < a[hint] -- gallop left, until
1228 * a[hint - ofs] <= key < a[hint - lastofs]
1229 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001230 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001231 while (ofs < maxofs) {
1232 IFLT(key, *(a-ofs)) {
1233 lastofs = ofs;
1234 ofs = (ofs << 1) + 1;
1235 if (ofs <= 0) /* int overflow */
1236 ofs = maxofs;
1237 }
1238 else /* a[hint - ofs] <= key */
1239 break;
1240 }
1241 if (ofs > maxofs)
1242 ofs = maxofs;
1243 /* Translate back to positive offsets relative to &a[0]. */
1244 k = lastofs;
1245 lastofs = hint - ofs;
1246 ofs = hint - k;
1247 }
1248 else {
1249 /* a[hint] <= key -- gallop right, until
1250 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001251 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001252 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001253 while (ofs < maxofs) {
1254 IFLT(key, a[ofs])
1255 break;
1256 /* a[hint + ofs] <= key */
1257 lastofs = ofs;
1258 ofs = (ofs << 1) + 1;
1259 if (ofs <= 0) /* int overflow */
1260 ofs = maxofs;
1261 }
1262 if (ofs > maxofs)
1263 ofs = maxofs;
1264 /* Translate back to offsets relative to &a[0]. */
1265 lastofs += hint;
1266 ofs += hint;
1267 }
1268 a -= hint;
1269
1270 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1271 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1272 * right of lastofs but no farther right than ofs. Do a binary
1273 * search, with invariant a[lastofs-1] <= key < a[ofs].
1274 */
1275 ++lastofs;
1276 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001277 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001278
1279 IFLT(key, a[m])
1280 ofs = m; /* key < a[m] */
1281 else
1282 lastofs = m+1; /* a[m] <= key */
1283 }
1284 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1285 return ofs;
1286
1287fail:
1288 return -1;
1289}
1290
1291/* The maximum number of entries in a MergeState's pending-runs stack.
1292 * This is enough to sort arrays of size up to about
1293 * 32 * phi ** MAX_MERGE_PENDING
1294 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1295 * with 2**64 elements.
1296 */
1297#define MAX_MERGE_PENDING 85
1298
Tim Peterse05f65a2002-08-10 05:21:15 +00001299/* When we get into galloping mode, we stay there until both runs win less
1300 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001301 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001302#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001303
1304/* Avoid malloc for small temp arrays. */
1305#define MERGESTATE_TEMP_SIZE 256
1306
1307/* One MergeState exists on the stack per invocation of mergesort. It's just
1308 * a convenient way to pass state around among the helper functions.
1309 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001310struct s_slice {
1311 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001312 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001313};
1314
Tim Petersa64dc242002-08-01 02:13:36 +00001315typedef struct s_MergeState {
1316 /* The user-supplied comparison function. or NULL if none given. */
1317 PyObject *compare;
1318
Tim Peterse05f65a2002-08-10 05:21:15 +00001319 /* This controls when we get *into* galloping mode. It's initialized
1320 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1321 * random data, and lower for highly structured data.
1322 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001323 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001324
Tim Petersa64dc242002-08-01 02:13:36 +00001325 /* 'a' is temp storage to help with merges. It contains room for
1326 * alloced entries.
1327 */
1328 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001329 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001330
1331 /* A stack of n pending runs yet to be merged. Run #i starts at
1332 * address base[i] and extends for len[i] elements. It's always
1333 * true (so long as the indices are in bounds) that
1334 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001335 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001336 *
1337 * so we could cut the storage for this, but it's a minor amount,
1338 * and keeping all the info explicit simplifies the code.
1339 */
1340 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001341 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001342
1343 /* 'a' points to this when possible, rather than muck with malloc. */
1344 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1345} MergeState;
1346
1347/* Conceptually a MergeState's constructor. */
1348static void
1349merge_init(MergeState *ms, PyObject *compare)
1350{
1351 assert(ms != NULL);
1352 ms->compare = compare;
1353 ms->a = ms->temparray;
1354 ms->alloced = MERGESTATE_TEMP_SIZE;
1355 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001356 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001357}
1358
1359/* Free all the temp memory owned by the MergeState. This must be called
1360 * when you're done with a MergeState, and may be called before then if
1361 * you want to free the temp memory early.
1362 */
1363static void
1364merge_freemem(MergeState *ms)
1365{
1366 assert(ms != NULL);
1367 if (ms->a != ms->temparray)
1368 PyMem_Free(ms->a);
1369 ms->a = ms->temparray;
1370 ms->alloced = MERGESTATE_TEMP_SIZE;
1371}
1372
1373/* Ensure enough temp memory for 'need' array slots is available.
1374 * Returns 0 on success and -1 if the memory can't be gotten.
1375 */
1376static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001377merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001378{
1379 assert(ms != NULL);
1380 if (need <= ms->alloced)
1381 return 0;
1382 /* Don't realloc! That can cost cycles to copy the old data, but
1383 * we don't care what's in the block.
1384 */
1385 merge_freemem(ms);
1386 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1387 if (ms->a) {
1388 ms->alloced = need;
1389 return 0;
1390 }
1391 PyErr_NoMemory();
1392 merge_freemem(ms); /* reset to sane state */
1393 return -1;
1394}
1395#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1396 merge_getmem(MS, NEED))
1397
1398/* Merge the na elements starting at pa with the nb elements starting at pb
1399 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1400 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1401 * merge, and should have na <= nb. See listsort.txt for more info.
1402 * Return 0 if successful, -1 if error.
1403 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001404static Py_ssize_t
1405merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1406 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001407{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001408 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001409 PyObject *compare;
1410 PyObject **dest;
1411 int result = -1; /* guilty until proved innocent */
Neal Norwitz7fd96072006-08-19 04:28:55 +00001412 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001413
1414 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1415 if (MERGE_GETMEM(ms, na) < 0)
1416 return -1;
1417 memcpy(ms->a, pa, na * sizeof(PyObject*));
1418 dest = pa;
1419 pa = ms->a;
1420
1421 *dest++ = *pb++;
1422 --nb;
1423 if (nb == 0)
1424 goto Succeed;
1425 if (na == 1)
1426 goto CopyB;
1427
Neal Norwitz7fd96072006-08-19 04:28:55 +00001428 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001429 compare = ms->compare;
1430 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001431 Py_ssize_t acount = 0; /* # of times A won in a row */
1432 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001433
1434 /* Do the straightforward thing until (if ever) one run
1435 * appears to win consistently.
1436 */
1437 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001438 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001439 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001440 if (k) {
1441 if (k < 0)
1442 goto Fail;
1443 *dest++ = *pb++;
1444 ++bcount;
1445 acount = 0;
1446 --nb;
1447 if (nb == 0)
1448 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001449 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001450 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001451 }
1452 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001453 *dest++ = *pa++;
1454 ++acount;
1455 bcount = 0;
1456 --na;
1457 if (na == 1)
1458 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001459 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001460 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001461 }
Tim Petersa64dc242002-08-01 02:13:36 +00001462 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001463
Tim Petersa64dc242002-08-01 02:13:36 +00001464 /* One run is winning so consistently that galloping may
1465 * be a huge win. So try that, and continue galloping until
1466 * (if ever) neither run appears to be winning consistently
1467 * anymore.
1468 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001469 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001470 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001471 assert(na > 1 && nb > 0);
1472 min_gallop -= min_gallop > 1;
1473 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001474 k = gallop_right(*pb, pa, na, 0, compare);
1475 acount = k;
1476 if (k) {
1477 if (k < 0)
1478 goto Fail;
1479 memcpy(dest, pa, k * sizeof(PyObject *));
1480 dest += k;
1481 pa += k;
1482 na -= k;
1483 if (na == 1)
1484 goto CopyB;
1485 /* na==0 is impossible now if the comparison
1486 * function is consistent, but we can't assume
1487 * that it is.
1488 */
1489 if (na == 0)
1490 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001491 }
Tim Petersa64dc242002-08-01 02:13:36 +00001492 *dest++ = *pb++;
1493 --nb;
1494 if (nb == 0)
1495 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001496
Tim Petersa64dc242002-08-01 02:13:36 +00001497 k = gallop_left(*pa, pb, nb, 0, compare);
1498 bcount = k;
1499 if (k) {
1500 if (k < 0)
1501 goto Fail;
1502 memmove(dest, pb, k * sizeof(PyObject *));
1503 dest += k;
1504 pb += k;
1505 nb -= k;
1506 if (nb == 0)
1507 goto Succeed;
1508 }
1509 *dest++ = *pa++;
1510 --na;
1511 if (na == 1)
1512 goto CopyB;
1513 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001514 ++min_gallop; /* penalize it for leaving galloping mode */
1515 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001516 }
1517Succeed:
1518 result = 0;
1519Fail:
1520 if (na)
1521 memcpy(dest, pa, na * sizeof(PyObject*));
1522 return result;
1523CopyB:
1524 assert(na == 1 && nb > 0);
1525 /* The last element of pa belongs at the end of the merge. */
1526 memmove(dest, pb, nb * sizeof(PyObject *));
1527 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001528 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001529}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001530
Tim Petersa64dc242002-08-01 02:13:36 +00001531/* Merge the na elements starting at pa with the nb elements starting at pb
1532 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1533 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1534 * merge, and should have na >= nb. See listsort.txt for more info.
1535 * Return 0 if successful, -1 if error.
1536 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001537static Py_ssize_t
1538merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001539{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001540 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001541 PyObject *compare;
1542 PyObject **dest;
1543 int result = -1; /* guilty until proved innocent */
1544 PyObject **basea;
1545 PyObject **baseb;
Neal Norwitz7fd96072006-08-19 04:28:55 +00001546 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001547
1548 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1549 if (MERGE_GETMEM(ms, nb) < 0)
1550 return -1;
1551 dest = pb + nb - 1;
1552 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1553 basea = pa;
1554 baseb = ms->a;
1555 pb = ms->a + nb - 1;
1556 pa += na - 1;
1557
1558 *dest-- = *pa--;
1559 --na;
1560 if (na == 0)
1561 goto Succeed;
1562 if (nb == 1)
1563 goto CopyA;
1564
Neal Norwitz7fd96072006-08-19 04:28:55 +00001565 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001566 compare = ms->compare;
1567 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001568 Py_ssize_t acount = 0; /* # of times A won in a row */
1569 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001570
1571 /* Do the straightforward thing until (if ever) one run
1572 * appears to win consistently.
1573 */
1574 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001575 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001576 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001577 if (k) {
1578 if (k < 0)
1579 goto Fail;
1580 *dest-- = *pa--;
1581 ++acount;
1582 bcount = 0;
1583 --na;
1584 if (na == 0)
1585 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001586 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001587 break;
1588 }
1589 else {
1590 *dest-- = *pb--;
1591 ++bcount;
1592 acount = 0;
1593 --nb;
1594 if (nb == 1)
1595 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001596 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001597 break;
1598 }
1599 }
1600
1601 /* One run is winning so consistently that galloping may
1602 * be a huge win. So try that, and continue galloping until
1603 * (if ever) neither run appears to be winning consistently
1604 * anymore.
1605 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001606 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001607 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001608 assert(na > 0 && nb > 1);
1609 min_gallop -= min_gallop > 1;
1610 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001611 k = gallop_right(*pb, basea, na, na-1, compare);
1612 if (k < 0)
1613 goto Fail;
1614 k = na - k;
1615 acount = k;
1616 if (k) {
1617 dest -= k;
1618 pa -= k;
1619 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1620 na -= k;
1621 if (na == 0)
1622 goto Succeed;
1623 }
1624 *dest-- = *pb--;
1625 --nb;
1626 if (nb == 1)
1627 goto CopyA;
1628
1629 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1630 if (k < 0)
1631 goto Fail;
1632 k = nb - k;
1633 bcount = k;
1634 if (k) {
1635 dest -= k;
1636 pb -= k;
1637 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1638 nb -= k;
1639 if (nb == 1)
1640 goto CopyA;
1641 /* nb==0 is impossible now if the comparison
1642 * function is consistent, but we can't assume
1643 * that it is.
1644 */
1645 if (nb == 0)
1646 goto Succeed;
1647 }
1648 *dest-- = *pa--;
1649 --na;
1650 if (na == 0)
1651 goto Succeed;
1652 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001653 ++min_gallop; /* penalize it for leaving galloping mode */
1654 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001655 }
1656Succeed:
1657 result = 0;
1658Fail:
1659 if (nb)
1660 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1661 return result;
1662CopyA:
1663 assert(nb == 1 && na > 0);
1664 /* The first element of pb belongs at the front of the merge. */
1665 dest -= na;
1666 pa -= na;
1667 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1668 *dest = *pb;
1669 return 0;
1670}
1671
1672/* Merge the two runs at stack indices i and i+1.
1673 * Returns 0 on success, -1 on error.
1674 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001675static Py_ssize_t
1676merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001677{
1678 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001679 Py_ssize_t na, nb;
1680 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001681 PyObject *compare;
1682
1683 assert(ms != NULL);
1684 assert(ms->n >= 2);
1685 assert(i >= 0);
1686 assert(i == ms->n - 2 || i == ms->n - 3);
1687
Tim Peterse05f65a2002-08-10 05:21:15 +00001688 pa = ms->pending[i].base;
1689 na = ms->pending[i].len;
1690 pb = ms->pending[i+1].base;
1691 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001692 assert(na > 0 && nb > 0);
1693 assert(pa + na == pb);
1694
1695 /* Record the length of the combined runs; if i is the 3rd-last
1696 * run now, also slide over the last run (which isn't involved
1697 * in this merge). The current run i+1 goes away in any case.
1698 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001699 ms->pending[i].len = na + nb;
1700 if (i == ms->n - 3)
1701 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001702 --ms->n;
1703
1704 /* Where does b start in a? Elements in a before that can be
1705 * ignored (already in place).
1706 */
1707 compare = ms->compare;
1708 k = gallop_right(*pb, pa, na, 0, compare);
1709 if (k < 0)
1710 return -1;
1711 pa += k;
1712 na -= k;
1713 if (na == 0)
1714 return 0;
1715
1716 /* Where does a end in b? Elements in b after that can be
1717 * ignored (already in place).
1718 */
1719 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1720 if (nb <= 0)
1721 return nb;
1722
1723 /* Merge what remains of the runs, using a temp array with
1724 * min(na, nb) elements.
1725 */
1726 if (na <= nb)
1727 return merge_lo(ms, pa, na, pb, nb);
1728 else
1729 return merge_hi(ms, pa, na, pb, nb);
1730}
1731
1732/* Examine the stack of runs waiting to be merged, merging adjacent runs
1733 * until the stack invariants are re-established:
1734 *
1735 * 1. len[-3] > len[-2] + len[-1]
1736 * 2. len[-2] > len[-1]
1737 *
1738 * See listsort.txt for more info.
1739 *
1740 * Returns 0 on success, -1 on error.
1741 */
1742static int
1743merge_collapse(MergeState *ms)
1744{
Tim Peterse05f65a2002-08-10 05:21:15 +00001745 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001746
1747 assert(ms);
1748 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001749 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001750 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1751 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001752 --n;
1753 if (merge_at(ms, n) < 0)
1754 return -1;
1755 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001756 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001757 if (merge_at(ms, n) < 0)
1758 return -1;
1759 }
1760 else
1761 break;
1762 }
1763 return 0;
1764}
1765
1766/* Regardless of invariants, merge all runs on the stack until only one
1767 * remains. This is used at the end of the mergesort.
1768 *
1769 * Returns 0 on success, -1 on error.
1770 */
1771static int
1772merge_force_collapse(MergeState *ms)
1773{
Tim Peterse05f65a2002-08-10 05:21:15 +00001774 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001775
1776 assert(ms);
1777 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001778 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001779 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001780 --n;
1781 if (merge_at(ms, n) < 0)
1782 return -1;
1783 }
1784 return 0;
1785}
1786
1787/* Compute a good value for the minimum run length; natural runs shorter
1788 * than this are boosted artificially via binary insertion.
1789 *
1790 * If n < 64, return n (it's too small to bother with fancy stuff).
1791 * Else if n is an exact power of 2, return 32.
1792 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1793 * strictly less than, an exact power of 2.
1794 *
1795 * See listsort.txt for more info.
1796 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001797static Py_ssize_t
1798merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001799{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001800 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001801
1802 assert(n >= 0);
1803 while (n >= 64) {
1804 r |= n & 1;
1805 n >>= 1;
1806 }
1807 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001808}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001809
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001810/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001811 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001812 which is returned during the undecorate phase. By exposing only the key
1813 during comparisons, the underlying sort stability characteristics are left
1814 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001815 the key instead of a full record. */
1816
1817typedef struct {
1818 PyObject_HEAD
1819 PyObject *key;
1820 PyObject *value;
1821} sortwrapperobject;
1822
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001823PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Anthony Baxter377be112006-04-11 06:54:30 +00001824static PyObject *
1825sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1826static void
1827sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001828
1829static PyTypeObject sortwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001830 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001831 "sortwrapper", /* tp_name */
1832 sizeof(sortwrapperobject), /* tp_basicsize */
1833 0, /* tp_itemsize */
1834 /* methods */
1835 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1836 0, /* tp_print */
1837 0, /* tp_getattr */
1838 0, /* tp_setattr */
1839 0, /* tp_compare */
1840 0, /* tp_repr */
1841 0, /* tp_as_number */
1842 0, /* tp_as_sequence */
1843 0, /* tp_as_mapping */
1844 0, /* tp_hash */
1845 0, /* tp_call */
1846 0, /* tp_str */
1847 PyObject_GenericGetAttr, /* tp_getattro */
1848 0, /* tp_setattro */
1849 0, /* tp_as_buffer */
Tim Petersb38e2b62004-07-29 02:29:26 +00001850 Py_TPFLAGS_DEFAULT |
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001851 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1852 sortwrapper_doc, /* tp_doc */
1853 0, /* tp_traverse */
1854 0, /* tp_clear */
1855 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1856};
1857
Anthony Baxter377be112006-04-11 06:54:30 +00001858
1859static PyObject *
1860sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1861{
1862 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1863 PyErr_SetString(PyExc_TypeError,
1864 "expected a sortwrapperobject");
1865 return NULL;
1866 }
1867 return PyObject_RichCompare(a->key, b->key, op);
1868}
1869
1870static void
1871sortwrapper_dealloc(sortwrapperobject *so)
1872{
1873 Py_XDECREF(so->key);
1874 Py_XDECREF(so->value);
1875 PyObject_Del(so);
1876}
1877
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001878/* Returns a new reference to a sortwrapper.
1879 Consumes the references to the two underlying objects. */
1880
1881static PyObject *
1882build_sortwrapper(PyObject *key, PyObject *value)
1883{
1884 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001885
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001886 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1887 if (so == NULL)
1888 return NULL;
1889 so->key = key;
1890 so->value = value;
1891 return (PyObject *)so;
1892}
1893
1894/* Returns a new reference to the value underlying the wrapper. */
1895static PyObject *
1896sortwrapper_getvalue(PyObject *so)
1897{
1898 PyObject *value;
1899
1900 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001901 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001902 "expected a sortwrapperobject");
1903 return NULL;
1904 }
1905 value = ((sortwrapperobject *)so)->value;
1906 Py_INCREF(value);
1907 return value;
1908}
1909
1910/* Wrapper for user specified cmp functions in combination with a
1911 specified key function. Makes sure the cmp function is presented
1912 with the actual key instead of the sortwrapper */
1913
1914typedef struct {
1915 PyObject_HEAD
1916 PyObject *func;
1917} cmpwrapperobject;
1918
1919static void
1920cmpwrapper_dealloc(cmpwrapperobject *co)
1921{
1922 Py_XDECREF(co->func);
1923 PyObject_Del(co);
1924}
1925
1926static PyObject *
1927cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1928{
1929 PyObject *x, *y, *xx, *yy;
1930
1931 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1932 return NULL;
1933 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001934 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001935 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001936 "expected a sortwrapperobject");
1937 return NULL;
1938 }
1939 xx = ((sortwrapperobject *)x)->key;
1940 yy = ((sortwrapperobject *)y)->key;
1941 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1942}
1943
1944PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1945
1946static PyTypeObject cmpwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001947 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001948 "cmpwrapper", /* tp_name */
1949 sizeof(cmpwrapperobject), /* tp_basicsize */
1950 0, /* tp_itemsize */
1951 /* methods */
1952 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1953 0, /* tp_print */
1954 0, /* tp_getattr */
1955 0, /* tp_setattr */
1956 0, /* tp_compare */
1957 0, /* tp_repr */
1958 0, /* tp_as_number */
1959 0, /* tp_as_sequence */
1960 0, /* tp_as_mapping */
1961 0, /* tp_hash */
1962 (ternaryfunc)cmpwrapper_call, /* tp_call */
1963 0, /* tp_str */
1964 PyObject_GenericGetAttr, /* tp_getattro */
1965 0, /* tp_setattro */
1966 0, /* tp_as_buffer */
1967 Py_TPFLAGS_DEFAULT, /* tp_flags */
1968 cmpwrapper_doc, /* tp_doc */
1969};
1970
1971static PyObject *
1972build_cmpwrapper(PyObject *cmpfunc)
1973{
1974 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001975
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001976 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1977 if (co == NULL)
1978 return NULL;
1979 Py_INCREF(cmpfunc);
1980 co->func = cmpfunc;
1981 return (PyObject *)co;
1982}
1983
Tim Petersa64dc242002-08-01 02:13:36 +00001984/* An adaptive, stable, natural mergesort. See listsort.txt.
1985 * Returns Py_None on success, NULL on error. Even in case of error, the
1986 * list will be some permutation of its input state (nothing is lost or
1987 * duplicated).
1988 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001989static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001990listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001991{
Tim Petersa64dc242002-08-01 02:13:36 +00001992 MergeState ms;
1993 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001994 Py_ssize_t nremaining;
1995 Py_ssize_t minrun;
1996 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001997 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001998 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001999 PyObject *compare = NULL;
2000 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002001 int reverse = 0;
2002 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002003 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002004 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002005 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002006
Tim Petersa64dc242002-08-01 02:13:36 +00002007 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002008 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002009 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002010 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2011 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002012 return NULL;
2013 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002014 if (compare == Py_None)
2015 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002016 if (keyfunc == Py_None)
2017 keyfunc = NULL;
2018 if (compare != NULL && keyfunc != NULL) {
2019 compare = build_cmpwrapper(compare);
2020 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002021 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002022 } else
2023 Py_XINCREF(compare);
2024
Tim Petersb9099c32002-11-12 22:08:10 +00002025 /* The list is temporarily made empty, so that mutations performed
2026 * by comparison functions can't affect the slice of memory we're
2027 * sorting (allowing mutations during sorting is a core-dump
2028 * factory, since ob_item may change).
2029 */
Martin v. Löwis68192102007-07-21 06:55:02 +00002030 saved_ob_size = Py_Size(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002031 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002032 saved_allocated = self->allocated;
Martin v. Löwis68192102007-07-21 06:55:02 +00002033 Py_Size(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002034 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002035 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002036
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002037 if (keyfunc != NULL) {
2038 for (i=0 ; i < saved_ob_size ; i++) {
2039 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002040 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002041 NULL);
2042 if (key == NULL) {
2043 for (i=i-1 ; i>=0 ; i--) {
2044 kvpair = saved_ob_item[i];
2045 value = sortwrapper_getvalue(kvpair);
2046 saved_ob_item[i] = value;
2047 Py_DECREF(kvpair);
2048 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002049 goto dsu_fail;
2050 }
2051 kvpair = build_sortwrapper(key, value);
2052 if (kvpair == NULL)
2053 goto dsu_fail;
2054 saved_ob_item[i] = kvpair;
2055 }
2056 }
2057
2058 /* Reverse sort stability achieved by initially reversing the list,
2059 applying a stable forward sort, then reversing the final result. */
2060 if (reverse && saved_ob_size > 1)
2061 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2062
2063 merge_init(&ms, compare);
2064
Tim Petersb9099c32002-11-12 22:08:10 +00002065 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002066 if (nremaining < 2)
2067 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002068
Tim Petersa64dc242002-08-01 02:13:36 +00002069 /* March over the array once, left to right, finding natural runs,
2070 * and extending short natural runs to minrun elements.
2071 */
Tim Petersb9099c32002-11-12 22:08:10 +00002072 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002073 hi = lo + nremaining;
2074 minrun = merge_compute_minrun(nremaining);
2075 do {
2076 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002077 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002078
Tim Petersa64dc242002-08-01 02:13:36 +00002079 /* Identify next run. */
2080 n = count_run(lo, hi, compare, &descending);
2081 if (n < 0)
2082 goto fail;
2083 if (descending)
2084 reverse_slice(lo, lo + n);
2085 /* If short, extend to min(minrun, nremaining). */
2086 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002087 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002088 nremaining : minrun;
2089 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2090 goto fail;
2091 n = force;
2092 }
2093 /* Push run onto pending-runs stack, and maybe merge. */
2094 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002095 ms.pending[ms.n].base = lo;
2096 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002097 ++ms.n;
2098 if (merge_collapse(&ms) < 0)
2099 goto fail;
2100 /* Advance to find next run. */
2101 lo += n;
2102 nremaining -= n;
2103 } while (nremaining);
2104 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002105
Tim Petersa64dc242002-08-01 02:13:36 +00002106 if (merge_force_collapse(&ms) < 0)
2107 goto fail;
2108 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002109 assert(ms.pending[0].base == saved_ob_item);
2110 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002111
2112succeed:
2113 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002114fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002115 if (keyfunc != NULL) {
2116 for (i=0 ; i < saved_ob_size ; i++) {
2117 kvpair = saved_ob_item[i];
2118 value = sortwrapper_getvalue(kvpair);
2119 saved_ob_item[i] = value;
2120 Py_DECREF(kvpair);
2121 }
2122 }
2123
Armin Rigo93677f02004-07-29 12:40:23 +00002124 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002125 /* The user mucked with the list during the sort,
2126 * and we don't already have another error to report.
2127 */
2128 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2129 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002130 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002131
2132 if (reverse && saved_ob_size > 1)
2133 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2134
2135 merge_freemem(&ms);
2136
2137dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002138 final_ob_item = self->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +00002139 i = Py_Size(self);
2140 Py_Size(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002141 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002142 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002143 if (final_ob_item != NULL) {
2144 /* we cannot use list_clear() for this because it does not
2145 guarantee that the list is really empty when it returns */
2146 while (--i >= 0) {
2147 Py_XDECREF(final_ob_item[i]);
2148 }
2149 PyMem_FREE(final_ob_item);
2150 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002151 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002152 Py_XINCREF(result);
2153 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002154}
Tim Peters330f9e92002-07-19 07:05:44 +00002155#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002156#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002157
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002158int
Fred Drakea2f55112000-07-09 15:16:51 +00002159PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002160{
2161 if (v == NULL || !PyList_Check(v)) {
2162 PyErr_BadInternalCall();
2163 return -1;
2164 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002165 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002166 if (v == NULL)
2167 return -1;
2168 Py_DECREF(v);
2169 return 0;
2170}
2171
Guido van Rossumb86c5492001-02-12 22:06:02 +00002172static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002173listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002174{
Martin v. Löwis68192102007-07-21 06:55:02 +00002175 if (Py_Size(self) > 1)
2176 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002177 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002178}
2179
Guido van Rossum84c76f51990-10-30 13:32:20 +00002180int
Fred Drakea2f55112000-07-09 15:16:51 +00002181PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002182{
Tim Peters6063e262002-08-08 01:06:39 +00002183 PyListObject *self = (PyListObject *)v;
2184
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002185 if (v == NULL || !PyList_Check(v)) {
2186 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002187 return -1;
2188 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002189 if (Py_Size(self) > 1)
2190 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002191 return 0;
2192}
2193
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002194PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002195PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002196{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002197 PyObject *w;
2198 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002199 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002200 if (v == NULL || !PyList_Check(v)) {
2201 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002202 return NULL;
2203 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002204 n = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002205 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002206 if (w == NULL)
2207 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002208 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002209 memcpy((void *)p,
2210 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002211 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002212 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002213 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002214 p++;
2215 }
2216 return w;
2217}
2218
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002219static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002220listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002221{
Martin v. Löwis68192102007-07-21 06:55:02 +00002222 Py_ssize_t i, start=0, stop=Py_Size(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002223 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002224
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002225 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2226 _PyEval_SliceIndex, &start,
2227 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002228 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002229 if (start < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002230 start += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002231 if (start < 0)
2232 start = 0;
2233 }
2234 if (stop < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002235 stop += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002236 if (stop < 0)
2237 stop = 0;
2238 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002239 for (i = start; i < stop && i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002240 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2241 if (cmp > 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002242 return PyInt_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002243 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002244 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002245 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002246 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002247 return NULL;
2248}
2249
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002250static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002251listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002252{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002253 Py_ssize_t count = 0;
2254 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002255
Martin v. Löwis68192102007-07-21 06:55:02 +00002256 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002257 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2258 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002259 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002260 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002261 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002262 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002263 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002264}
2265
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002266static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002267listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002268{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002269 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002270
Martin v. Löwis68192102007-07-21 06:55:02 +00002271 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002272 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2273 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002274 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002275 (PyObject *)NULL) == 0)
2276 Py_RETURN_NONE;
2277 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002278 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002279 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002280 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002281 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002282 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002283 return NULL;
2284}
2285
Jeremy Hylton8caad492000-06-23 14:18:11 +00002286static int
2287list_traverse(PyListObject *o, visitproc visit, void *arg)
2288{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002289 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002290
Martin v. Löwis68192102007-07-21 06:55:02 +00002291 for (i = Py_Size(o); --i >= 0; )
Thomas Woutersc6e55062006-04-15 21:47:09 +00002292 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002293 return 0;
2294}
2295
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002296static PyObject *
2297list_richcompare(PyObject *v, PyObject *w, int op)
2298{
2299 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002300 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002301
2302 if (!PyList_Check(v) || !PyList_Check(w)) {
2303 Py_INCREF(Py_NotImplemented);
2304 return Py_NotImplemented;
2305 }
2306
2307 vl = (PyListObject *)v;
2308 wl = (PyListObject *)w;
2309
Martin v. Löwis68192102007-07-21 06:55:02 +00002310 if (Py_Size(vl) != Py_Size(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002311 /* Shortcut: if the lengths differ, the lists differ */
2312 PyObject *res;
2313 if (op == Py_EQ)
2314 res = Py_False;
2315 else
2316 res = Py_True;
2317 Py_INCREF(res);
2318 return res;
2319 }
2320
2321 /* Search for the first index where items are different */
Martin v. Löwis68192102007-07-21 06:55:02 +00002322 for (i = 0; i < Py_Size(vl) && i < Py_Size(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002323 int k = PyObject_RichCompareBool(vl->ob_item[i],
2324 wl->ob_item[i], Py_EQ);
2325 if (k < 0)
2326 return NULL;
2327 if (!k)
2328 break;
2329 }
2330
Martin v. Löwis68192102007-07-21 06:55:02 +00002331 if (i >= Py_Size(vl) || i >= Py_Size(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002332 /* No more items to compare -- compare sizes */
Martin v. Löwis68192102007-07-21 06:55:02 +00002333 Py_ssize_t vs = Py_Size(vl);
2334 Py_ssize_t ws = Py_Size(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002335 int cmp;
2336 PyObject *res;
2337 switch (op) {
2338 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002339 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002340 case Py_EQ: cmp = vs == ws; break;
2341 case Py_NE: cmp = vs != ws; break;
2342 case Py_GT: cmp = vs > ws; break;
2343 case Py_GE: cmp = vs >= ws; break;
2344 default: return NULL; /* cannot happen */
2345 }
2346 if (cmp)
2347 res = Py_True;
2348 else
2349 res = Py_False;
2350 Py_INCREF(res);
2351 return res;
2352 }
2353
2354 /* We have an item that differs -- shortcuts for EQ/NE */
2355 if (op == Py_EQ) {
2356 Py_INCREF(Py_False);
2357 return Py_False;
2358 }
2359 if (op == Py_NE) {
2360 Py_INCREF(Py_True);
2361 return Py_True;
2362 }
2363
2364 /* Compare the final item again using the proper operator */
2365 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2366}
2367
Tim Peters6d6c1a32001-08-02 04:15:00 +00002368static int
2369list_init(PyListObject *self, PyObject *args, PyObject *kw)
2370{
2371 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002372 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002373
2374 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2375 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002376
2377 /* Verify list invariants established by PyType_GenericAlloc() */
Martin v. Löwis68192102007-07-21 06:55:02 +00002378 assert(0 <= Py_Size(self));
2379 assert(Py_Size(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002380 assert(self->ob_item != NULL ||
2381 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002382
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002383 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002384 if (self->ob_item != NULL) {
2385 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002386 }
2387 if (arg != NULL) {
2388 PyObject *rv = listextend(self, arg);
2389 if (rv == NULL)
2390 return -1;
2391 Py_DECREF(rv);
2392 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002393 return 0;
2394}
2395
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002396static long
2397list_nohash(PyObject *self)
2398{
2399 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2400 return -1;
2401}
2402
Raymond Hettinger1021c442003-11-07 15:38:09 +00002403static PyObject *list_iter(PyObject *seq);
2404static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2405
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002406PyDoc_STRVAR(getitem_doc,
2407"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002408PyDoc_STRVAR(reversed_doc,
2409"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002410PyDoc_STRVAR(append_doc,
2411"L.append(object) -- append object to end");
2412PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002413"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002414PyDoc_STRVAR(insert_doc,
2415"L.insert(index, object) -- insert object before index");
2416PyDoc_STRVAR(pop_doc,
2417"L.pop([index]) -> item -- remove and return item at index (default last)");
2418PyDoc_STRVAR(remove_doc,
2419"L.remove(value) -- remove first occurrence of value");
2420PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002421"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002422PyDoc_STRVAR(count_doc,
2423"L.count(value) -> integer -- return number of occurrences of value");
2424PyDoc_STRVAR(reverse_doc,
2425"L.reverse() -- reverse *IN PLACE*");
2426PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002427"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2428cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002429
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002430static PyObject *list_subscript(PyListObject*, PyObject*);
2431
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002432static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002433 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002434 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002435 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002436 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002437 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002438 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002439 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002440 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002441 {"count", (PyCFunction)listcount, METH_O, count_doc},
2442 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002443 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002444 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002445};
2446
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002447static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002448 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002449 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002450 (ssizeargfunc)list_repeat, /* sq_repeat */
2451 (ssizeargfunc)list_item, /* sq_item */
2452 (ssizessizeargfunc)list_slice, /* sq_slice */
2453 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2454 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002455 (objobjproc)list_contains, /* sq_contains */
2456 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002457 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002458};
2459
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002460PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002461"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002462"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002463
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002464
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002465static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002466list_subscript(PyListObject* self, PyObject* item)
2467{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002468 if (PyIndex_Check(item)) {
2469 Py_ssize_t i;
2470 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002471 if (i == -1 && PyErr_Occurred())
2472 return NULL;
2473 if (i < 0)
2474 i += PyList_GET_SIZE(self);
2475 return list_item(self, i);
2476 }
2477 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002478 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002479 PyObject* result;
2480 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002481 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002482
Martin v. Löwis68192102007-07-21 06:55:02 +00002483 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002484 &start, &stop, &step, &slicelength) < 0) {
2485 return NULL;
2486 }
2487
2488 if (slicelength <= 0) {
2489 return PyList_New(0);
2490 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002491 else if (step == 1) {
2492 return list_slice(self, start, stop);
2493 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002494 else {
2495 result = PyList_New(slicelength);
2496 if (!result) return NULL;
2497
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002498 src = self->ob_item;
2499 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002500 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002501 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002502 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002503 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002504 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002505 }
Tim Peters3b01a122002-07-19 02:35:45 +00002506
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002507 return result;
2508 }
2509 }
2510 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002511 PyErr_Format(PyExc_TypeError,
2512 "list indices must be integers, not %.200s",
2513 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002514 return NULL;
2515 }
2516}
2517
Tim Peters3b01a122002-07-19 02:35:45 +00002518static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002519list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2520{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002521 if (PyIndex_Check(item)) {
2522 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002523 if (i == -1 && PyErr_Occurred())
2524 return -1;
2525 if (i < 0)
2526 i += PyList_GET_SIZE(self);
2527 return list_ass_item(self, i, value);
2528 }
2529 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002530 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002531
Martin v. Löwis68192102007-07-21 06:55:02 +00002532 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002533 &start, &stop, &step, &slicelength) < 0) {
2534 return -1;
2535 }
2536
Thomas Wouters3ccec682007-08-28 15:28:19 +00002537 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002538 return list_ass_slice(self, start, stop, value);
2539
Thomas Wouters3ccec682007-08-28 15:28:19 +00002540 /* Make sure s[5:2] = [..] inserts at the right place:
2541 before 5, not before 2. */
2542 if ((step < 0 && start < stop) ||
2543 (step > 0 && start > stop))
2544 stop = start;
2545
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002546 if (value == NULL) {
2547 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002548 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002549 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002550
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002551 if (slicelength <= 0)
2552 return 0;
2553
2554 if (step < 0) {
2555 stop = start + 1;
2556 start = stop + step*(slicelength - 1) - 1;
2557 step = -step;
2558 }
2559
2560 garbage = (PyObject**)
2561 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002562 if (!garbage) {
2563 PyErr_NoMemory();
2564 return -1;
2565 }
Tim Peters3b01a122002-07-19 02:35:45 +00002566
Thomas Wouters3ccec682007-08-28 15:28:19 +00002567 /* drawing pictures might help understand these for
2568 loops. Basically, we memmove the parts of the
2569 list that are *not* part of the slice: step-1
2570 items for each item that is part of the slice,
2571 and then tail end of the list that was not
2572 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002573 for (cur = start, i = 0;
2574 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002575 cur += step, i++) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00002576 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002577
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002578 garbage[i] = PyList_GET_ITEM(self, cur);
2579
Martin v. Löwis68192102007-07-21 06:55:02 +00002580 if (cur + step >= Py_Size(self)) {
2581 lim = Py_Size(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002582 }
2583
Tim Petersb38e2b62004-07-29 02:29:26 +00002584 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002585 self->ob_item + cur + 1,
2586 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002587 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002588 cur = start + slicelength*step;
2589 if (cur < Py_Size(self)) {
2590 memmove(self->ob_item + cur - slicelength,
2591 self->ob_item + cur,
2592 (Py_Size(self) - cur) *
2593 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002594 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002595
Martin v. Löwis68192102007-07-21 06:55:02 +00002596 Py_Size(self) -= slicelength;
2597 list_resize(self, Py_Size(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002598
2599 for (i = 0; i < slicelength; i++) {
2600 Py_DECREF(garbage[i]);
2601 }
2602 PyMem_FREE(garbage);
2603
2604 return 0;
2605 }
2606 else {
2607 /* assign slice */
Thomas Wouters3ccec682007-08-28 15:28:19 +00002608 PyObject *ins, *seq;
2609 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002610 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002611
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002612 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002613 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002614 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002615 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002616 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002617 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002618 seq = PySequence_Fast(value,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002619 "must assign iterable "
2620 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002621 }
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002622 if (!seq)
2623 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002624
2625 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2626 PyErr_Format(PyExc_ValueError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002627 "attempt to assign sequence of "
2628 "size %zd to extended slice of "
2629 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002630 PySequence_Fast_GET_SIZE(seq),
2631 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002632 Py_DECREF(seq);
2633 return -1;
2634 }
2635
2636 if (!slicelength) {
2637 Py_DECREF(seq);
2638 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002639 }
2640
2641 garbage = (PyObject**)
2642 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitze7e4e2d2006-10-28 21:20:12 +00002643 if (!garbage) {
2644 Py_DECREF(seq);
2645 PyErr_NoMemory();
2646 return -1;
2647 }
Tim Peters3b01a122002-07-19 02:35:45 +00002648
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002649 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002650 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002651 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002652 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002653 garbage[i] = selfitems[cur];
2654 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002655 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002656 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002657 }
2658
2659 for (i = 0; i < slicelength; i++) {
2660 Py_DECREF(garbage[i]);
2661 }
Tim Peters3b01a122002-07-19 02:35:45 +00002662
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002663 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002664 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002665
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002666 return 0;
2667 }
Tim Peters3b01a122002-07-19 02:35:45 +00002668 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002669 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002670 PyErr_Format(PyExc_TypeError,
2671 "list indices must be integers, not %.200s",
2672 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002673 return -1;
2674 }
2675}
2676
2677static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002678 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002679 (binaryfunc)list_subscript,
2680 (objobjargproc)list_ass_subscript
2681};
2682
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002683PyTypeObject PyList_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002684 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002685 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002686 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002687 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002688 (destructor)list_dealloc, /* tp_dealloc */
2689 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002690 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002691 0, /* tp_setattr */
2692 0, /* tp_compare */
2693 (reprfunc)list_repr, /* tp_repr */
2694 0, /* tp_as_number */
2695 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002696 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002697 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002698 0, /* tp_call */
2699 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002700 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002701 0, /* tp_setattro */
2702 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002703 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002704 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002705 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002706 (traverseproc)list_traverse, /* tp_traverse */
2707 (inquiry)list_clear, /* tp_clear */
2708 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002709 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002710 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002711 0, /* tp_iternext */
2712 list_methods, /* tp_methods */
2713 0, /* tp_members */
2714 0, /* tp_getset */
2715 0, /* tp_base */
2716 0, /* tp_dict */
2717 0, /* tp_descr_get */
2718 0, /* tp_descr_set */
2719 0, /* tp_dictoffset */
2720 (initproc)list_init, /* tp_init */
2721 PyType_GenericAlloc, /* tp_alloc */
2722 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002723 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002724};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002725
2726
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002727/*********************** List Iterator **************************/
2728
2729typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002730 PyObject_HEAD
2731 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002732 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002733} listiterobject;
2734
Anthony Baxter377be112006-04-11 06:54:30 +00002735static PyObject *list_iter(PyObject *);
2736static void listiter_dealloc(listiterobject *);
2737static int listiter_traverse(listiterobject *, visitproc, void *);
2738static PyObject *listiter_next(listiterobject *);
2739static PyObject *listiter_len(listiterobject *);
2740
2741PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2742
2743static PyMethodDef listiter_methods[] = {
2744 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2745 {NULL, NULL} /* sentinel */
2746};
2747
2748PyTypeObject PyListIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002749 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002750 "listiterator", /* tp_name */
2751 sizeof(listiterobject), /* tp_basicsize */
2752 0, /* tp_itemsize */
2753 /* methods */
2754 (destructor)listiter_dealloc, /* tp_dealloc */
2755 0, /* tp_print */
2756 0, /* tp_getattr */
2757 0, /* tp_setattr */
2758 0, /* tp_compare */
2759 0, /* tp_repr */
2760 0, /* tp_as_number */
2761 0, /* tp_as_sequence */
2762 0, /* tp_as_mapping */
2763 0, /* tp_hash */
2764 0, /* tp_call */
2765 0, /* tp_str */
2766 PyObject_GenericGetAttr, /* tp_getattro */
2767 0, /* tp_setattro */
2768 0, /* tp_as_buffer */
2769 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2770 0, /* tp_doc */
2771 (traverseproc)listiter_traverse, /* tp_traverse */
2772 0, /* tp_clear */
2773 0, /* tp_richcompare */
2774 0, /* tp_weaklistoffset */
2775 PyObject_SelfIter, /* tp_iter */
2776 (iternextfunc)listiter_next, /* tp_iternext */
2777 listiter_methods, /* tp_methods */
2778 0, /* tp_members */
2779};
2780
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002781
Guido van Rossum5086e492002-07-16 15:56:52 +00002782static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002783list_iter(PyObject *seq)
2784{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002785 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002786
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002787 if (!PyList_Check(seq)) {
2788 PyErr_BadInternalCall();
2789 return NULL;
2790 }
2791 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2792 if (it == NULL)
2793 return NULL;
2794 it->it_index = 0;
2795 Py_INCREF(seq);
2796 it->it_seq = (PyListObject *)seq;
2797 _PyObject_GC_TRACK(it);
2798 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002799}
2800
2801static void
2802listiter_dealloc(listiterobject *it)
2803{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002804 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002805 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002806 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002807}
2808
2809static int
2810listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2811{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002812 Py_VISIT(it->it_seq);
2813 return 0;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002814}
2815
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002816static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002817listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002818{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002819 PyListObject *seq;
2820 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002821
Tim Peters93b2cc42002-06-01 05:22:55 +00002822 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002823 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002824 if (seq == NULL)
2825 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002826 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002827
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002828 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002829 item = PyList_GET_ITEM(seq, it->it_index);
2830 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002831 Py_INCREF(item);
2832 return item;
2833 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002834
2835 Py_DECREF(seq);
2836 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002837 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002838}
2839
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002840static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +00002841listiter_len(listiterobject *it)
2842{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002843 Py_ssize_t len;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002844 if (it->it_seq) {
2845 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2846 if (len >= 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002847 return PyInt_FromSsize_t(len);
Raymond Hettinger40a03822004-04-12 13:05:09 +00002848 }
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002849 return PyInt_FromLong(0);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002850}
Anthony Baxter377be112006-04-11 06:54:30 +00002851/*********************** List Reverse Iterator **************************/
Raymond Hettinger435bf582004-03-18 22:43:10 +00002852
Anthony Baxter377be112006-04-11 06:54:30 +00002853typedef struct {
2854 PyObject_HEAD
2855 Py_ssize_t it_index;
2856 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2857} listreviterobject;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002858
Anthony Baxter377be112006-04-11 06:54:30 +00002859static PyObject *list_reversed(PyListObject *, PyObject *);
2860static void listreviter_dealloc(listreviterobject *);
2861static int listreviter_traverse(listreviterobject *, visitproc, void *);
2862static PyObject *listreviter_next(listreviterobject *);
2863static Py_ssize_t listreviter_len(listreviterobject *);
2864
2865static PySequenceMethods listreviter_as_sequence = {
2866 (lenfunc)listreviter_len, /* sq_length */
2867 0, /* sq_concat */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002868};
2869
Anthony Baxter377be112006-04-11 06:54:30 +00002870PyTypeObject PyListRevIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002871 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002872 "listreverseiterator", /* tp_name */
2873 sizeof(listreviterobject), /* tp_basicsize */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002874 0, /* tp_itemsize */
2875 /* methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002876 (destructor)listreviter_dealloc, /* tp_dealloc */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002877 0, /* tp_print */
2878 0, /* tp_getattr */
2879 0, /* tp_setattr */
2880 0, /* tp_compare */
2881 0, /* tp_repr */
2882 0, /* tp_as_number */
Anthony Baxter377be112006-04-11 06:54:30 +00002883 &listreviter_as_sequence, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002884 0, /* tp_as_mapping */
2885 0, /* tp_hash */
2886 0, /* tp_call */
2887 0, /* tp_str */
2888 PyObject_GenericGetAttr, /* tp_getattro */
2889 0, /* tp_setattro */
2890 0, /* tp_as_buffer */
2891 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2892 0, /* tp_doc */
Anthony Baxter377be112006-04-11 06:54:30 +00002893 (traverseproc)listreviter_traverse, /* tp_traverse */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002894 0, /* tp_clear */
2895 0, /* tp_richcompare */
2896 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002897 PyObject_SelfIter, /* tp_iter */
Anthony Baxter377be112006-04-11 06:54:30 +00002898 (iternextfunc)listreviter_next, /* tp_iternext */
2899 0,
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002900};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002901
Raymond Hettinger1021c442003-11-07 15:38:09 +00002902static PyObject *
2903list_reversed(PyListObject *seq, PyObject *unused)
2904{
2905 listreviterobject *it;
2906
2907 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2908 if (it == NULL)
2909 return NULL;
2910 assert(PyList_Check(seq));
2911 it->it_index = PyList_GET_SIZE(seq) - 1;
2912 Py_INCREF(seq);
2913 it->it_seq = seq;
2914 PyObject_GC_Track(it);
2915 return (PyObject *)it;
2916}
2917
2918static void
2919listreviter_dealloc(listreviterobject *it)
2920{
2921 PyObject_GC_UnTrack(it);
2922 Py_XDECREF(it->it_seq);
2923 PyObject_GC_Del(it);
2924}
2925
2926static int
2927listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2928{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002929 Py_VISIT(it->it_seq);
2930 return 0;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002931}
2932
2933static PyObject *
2934listreviter_next(listreviterobject *it)
2935{
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002936 PyObject *item;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002937 Py_ssize_t index = it->it_index;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002938 PyListObject *seq = it->it_seq;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002939
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002940 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2941 item = PyList_GET_ITEM(seq, index);
Raymond Hettinger1021c442003-11-07 15:38:09 +00002942 it->it_index--;
2943 Py_INCREF(item);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002944 return item;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002945 }
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002946 it->it_index = -1;
2947 if (seq != NULL) {
2948 it->it_seq = NULL;
2949 Py_DECREF(seq);
2950 }
2951 return NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002952}
2953
Martin v. Löwis18e16552006-02-15 17:27:45 +00002954static Py_ssize_t
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002955listreviter_len(listreviterobject *it)
2956{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002957 Py_ssize_t len = it->it_index + 1;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002958 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2959 return 0;
2960 return len;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002961}
2962