blob: a3fa983c59b2f7d08cda55f774422f8640842f80 [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;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000502 if (size == 0)
503 return PyList_New(0);
Martin v. Löwis68192102007-07-21 06:55:02 +0000504 if (n && size/n != Py_Size(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000505 return PyErr_NoMemory();
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;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000672 Py_ssize_t size, i, j, p;
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
Tim Petersb38e2b62004-07-29 02:29:26 +0000687 if (list_resize(self, size*n) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000688 return NULL;
689
690 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000691 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000692 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
693 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000694 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000695 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000696 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000697 }
698 }
699 Py_INCREF(self);
700 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000701}
702
Guido van Rossum4a450d01991-04-03 19:05:18 +0000703static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000704list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000705{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 PyObject *old_value;
Martin v. Löwis68192102007-07-21 06:55:02 +0000707 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 PyErr_SetString(PyExc_IndexError,
709 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000710 return -1;
711 }
712 if (v == NULL)
713 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000715 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000716 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000717 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000718 return 0;
719}
720
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000722listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000724 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000726 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000727 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000728 if (ins1(self, i, v) == 0)
729 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000730 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000731}
732
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000734listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000735{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000736 if (app1(self, v) == 0)
737 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000738 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000739}
740
Barry Warsawdedf6d61998-10-09 16:37:25 +0000741static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000742listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000743{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000744 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000745 Py_ssize_t m; /* size of self */
746 Py_ssize_t n; /* guess for size of b */
747 Py_ssize_t mn; /* m + n */
748 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000749 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000750
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000751 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000752 1) lists and tuples which can use PySequence_Fast ops
753 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000754 */
755 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000756 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000757 b = PySequence_Fast(b, "argument must be iterable");
758 if (!b)
759 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000760 n = PySequence_Fast_GET_SIZE(b);
761 if (n == 0) {
762 /* short circuit when b is empty */
763 Py_DECREF(b);
764 Py_RETURN_NONE;
765 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000766 m = Py_Size(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000767 if (list_resize(self, m + n) == -1) {
768 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000769 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000770 }
771 /* note that we may still have self == b here for the
772 * situation a.extend(a), but the following code works
773 * in that case too. Just make sure to resize self
774 * before calling PySequence_Fast_ITEMS.
775 */
776 /* populate the end of self with b's items */
777 src = PySequence_Fast_ITEMS(b);
778 dest = self->ob_item + m;
779 for (i = 0; i < n; i++) {
780 PyObject *o = src[i];
781 Py_INCREF(o);
782 dest[i] = o;
783 }
784 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000785 Py_RETURN_NONE;
786 }
787
788 it = PyObject_GetIter(b);
789 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000791 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000792
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000793 /* Guess a result list size. */
Armin Rigof5b3e362006-02-11 21:32:43 +0000794 n = _PyObject_LengthHint(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000795 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000796 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
797 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
798 Py_DECREF(it);
799 return NULL;
800 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000801 PyErr_Clear();
802 n = 8; /* arbitrary */
803 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000804 m = Py_Size(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000805 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000806 if (mn >= m) {
807 /* Make room. */
808 if (list_resize(self, mn) == -1)
809 goto error;
810 /* Make the list sane again. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000811 Py_Size(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000812 }
813 /* Else m + n overflowed; on the chance that n lied, and there really
814 * is enough room, ignore it. If n was telling the truth, we'll
815 * eventually run out of memory during the loop.
816 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000817
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000818 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000819 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000820 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000821 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000822 if (PyErr_Occurred()) {
823 if (PyErr_ExceptionMatches(PyExc_StopIteration))
824 PyErr_Clear();
825 else
826 goto error;
827 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000828 break;
829 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000830 if (Py_Size(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000831 /* steals ref */
Martin v. Löwis68192102007-07-21 06:55:02 +0000832 PyList_SET_ITEM(self, Py_Size(self), item);
833 ++Py_Size(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000834 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000835 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000836 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000837 Py_DECREF(item); /* append creates a new ref */
838 if (status < 0)
839 goto error;
840 }
841 }
842
843 /* Cut back result list if initial guess was too large. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000844 if (Py_Size(self) < self->allocated)
845 list_resize(self, Py_Size(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000846
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000847 Py_DECREF(it);
848 Py_RETURN_NONE;
849
850 error:
851 Py_DECREF(it);
852 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000853}
854
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000855PyObject *
856_PyList_Extend(PyListObject *self, PyObject *b)
857{
858 return listextend(self, b);
859}
860
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000861static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000862list_inplace_concat(PyListObject *self, PyObject *other)
863{
864 PyObject *result;
865
866 result = listextend(self, other);
867 if (result == NULL)
868 return result;
869 Py_DECREF(result);
870 Py_INCREF(self);
871 return (PyObject *)self;
872}
873
874static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000875listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000876{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000877 Py_ssize_t i = -1;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000878 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000879 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000880
Armin Rigo7ccbca92006-10-04 12:17:45 +0000881 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000882 return NULL;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000883
Martin v. Löwis68192102007-07-21 06:55:02 +0000884 if (Py_Size(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000885 /* Special-case most common failure cause */
886 PyErr_SetString(PyExc_IndexError, "pop from empty list");
887 return NULL;
888 }
889 if (i < 0)
Martin v. Löwis68192102007-07-21 06:55:02 +0000890 i += Py_Size(self);
891 if (i < 0 || i >= Py_Size(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000892 PyErr_SetString(PyExc_IndexError, "pop index out of range");
893 return NULL;
894 }
895 v = self->ob_item[i];
Martin v. Löwis68192102007-07-21 06:55:02 +0000896 if (i == Py_Size(self) - 1) {
897 status = list_resize(self, Py_Size(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000898 assert(status >= 0);
899 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000900 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000901 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000902 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
903 assert(status >= 0);
904 /* Use status, so that in a release build compilers don't
905 * complain about the unused name.
906 */
Brett Cannon651dd522004-08-08 21:21:18 +0000907 (void) status;
908
909 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000910}
911
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000912/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
913static void
914reverse_slice(PyObject **lo, PyObject **hi)
915{
916 assert(lo && hi);
917
918 --hi;
919 while (lo < hi) {
920 PyObject *t = *lo;
921 *lo = *hi;
922 *hi = t;
923 ++lo;
924 --hi;
925 }
926}
927
Tim Petersa64dc242002-08-01 02:13:36 +0000928/* Lots of code for an adaptive, stable, natural mergesort. There are many
929 * pieces to this algorithm; read listsort.txt for overviews and details.
930 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000931
Guido van Rossum3f236de1996-12-10 23:55:39 +0000932/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000933 * comparison function (any callable Python object), which must not be
934 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
935 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000936 * Returns -1 on error, 1 if x < y, 0 if x >= y.
937 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000938static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000939islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000940{
Tim Petersf2a04732002-07-11 21:46:16 +0000941 PyObject *res;
942 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000943 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000944
Tim Peters66860f62002-08-04 17:47:26 +0000945 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000946 /* Call the user's comparison function and translate the 3-way
947 * result into true or false (or error).
948 */
Tim Petersf2a04732002-07-11 21:46:16 +0000949 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000950 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000951 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000952 Py_INCREF(x);
953 Py_INCREF(y);
954 PyTuple_SET_ITEM(args, 0, x);
955 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000956 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000958 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000959 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 if (!PyInt_Check(res)) {
Georg Brandl283a1352006-11-19 08:48:30 +0000961 PyErr_Format(PyExc_TypeError,
962 "comparison function must return int, not %.200s",
963 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000965 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000966 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 i = PyInt_AsLong(res);
968 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000969 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000970}
971
Tim Peters66860f62002-08-04 17:47:26 +0000972/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
973 * islt. This avoids a layer of function call in the usual case, and
974 * sorting does many comparisons.
975 * Returns -1 on error, 1 if x < y, 0 if x >= y.
976 */
977#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
978 PyObject_RichCompareBool(X, Y, Py_LT) : \
979 islt(X, Y, COMPARE))
980
981/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000982 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
983 started. It makes more sense in context <wink>. X and Y are PyObject*s.
984*/
Tim Peters66860f62002-08-04 17:47:26 +0000985#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000986 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000987
988/* binarysort is the best method for sorting small arrays: it does
989 few compares, but can do data movement quadratic in the number of
990 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000991 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000992 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000993 On entry, must have lo <= start <= hi, and that [lo, start) is already
994 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000995 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000996 Even in case of error, the output slice will be some permutation of
997 the input (nothing is lost or duplicated).
998*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000999static int
Fred Drakea2f55112000-07-09 15:16:51 +00001000binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
1001 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +00001002{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001003 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001004 register PyObject **l, **p, **r;
1005 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001006
Tim Petersa8c974c2002-07-19 03:30:57 +00001007 assert(lo <= start && start <= hi);
1008 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001009 if (lo == start)
1010 ++start;
1011 for (; start < hi; ++start) {
1012 /* set l to where *start belongs */
1013 l = lo;
1014 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001015 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +00001016 /* Invariants:
1017 * pivot >= all in [lo, l).
1018 * pivot < all in [r, start).
1019 * The second is vacuously true at the start.
1020 */
1021 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001022 do {
1023 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +00001024 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001025 r = p;
1026 else
Tim Peters0fe977c2002-07-19 06:12:32 +00001027 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001028 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001029 assert(l == r);
1030 /* The invariants still hold, so pivot >= all in [lo, l) and
1031 pivot < all in [l, start), so pivot belongs at l. Note
1032 that if there are elements equal to pivot, l points to the
1033 first slot after them -- that's why this sort is stable.
1034 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001035 Caution: using memmove is much slower under MSVC 5;
1036 we're not usually moving many slots. */
1037 for (p = start; p > l; --p)
1038 *p = *(p-1);
1039 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001040 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001041 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001042
1043 fail:
1044 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001045}
1046
Tim Petersa64dc242002-08-01 02:13:36 +00001047/*
1048Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1049is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001050
Tim Petersa64dc242002-08-01 02:13:36 +00001051 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001052
Tim Petersa64dc242002-08-01 02:13:36 +00001053or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001054
Tim Petersa64dc242002-08-01 02:13:36 +00001055 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001056
Tim Petersa64dc242002-08-01 02:13:36 +00001057Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1058For its intended use in a stable mergesort, the strictness of the defn of
1059"descending" is needed so that the caller can safely reverse a descending
1060sequence without violating stability (strict > ensures there are no equal
1061elements to get out of order).
1062
1063Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001064*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001065static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001066count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001067{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001068 Py_ssize_t k;
1069 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001070
Tim Petersa64dc242002-08-01 02:13:36 +00001071 assert(lo < hi);
1072 *descending = 0;
1073 ++lo;
1074 if (lo == hi)
1075 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001076
Tim Petersa64dc242002-08-01 02:13:36 +00001077 n = 2;
1078 IFLT(*lo, *(lo-1)) {
1079 *descending = 1;
1080 for (lo = lo+1; lo < hi; ++lo, ++n) {
1081 IFLT(*lo, *(lo-1))
1082 ;
1083 else
1084 break;
1085 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001086 }
Tim Petersa64dc242002-08-01 02:13:36 +00001087 else {
1088 for (lo = lo+1; lo < hi; ++lo, ++n) {
1089 IFLT(*lo, *(lo-1))
1090 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001091 }
1092 }
1093
Tim Petersa64dc242002-08-01 02:13:36 +00001094 return n;
1095fail:
1096 return -1;
1097}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001098
Tim Petersa64dc242002-08-01 02:13:36 +00001099/*
1100Locate the proper position of key in a sorted vector; if the vector contains
1101an element equal to key, return the position immediately to the left of
1102the leftmost equal element. [gallop_right() does the same except returns
1103the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001104
Tim Petersa64dc242002-08-01 02:13:36 +00001105"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001106
Tim Petersa64dc242002-08-01 02:13:36 +00001107"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1108hint is to the final result, the faster this runs.
1109
1110The return value is the int k in 0..n such that
1111
1112 a[k-1] < key <= a[k]
1113
1114pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1115key belongs at index k; or, IOW, the first k elements of a should precede
1116key, and the last n-k should follow key.
1117
1118Returns -1 on error. See listsort.txt for info on the method.
1119*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001120static Py_ssize_t
1121gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001122{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001123 Py_ssize_t ofs;
1124 Py_ssize_t lastofs;
1125 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001126
1127 assert(key && a && n > 0 && hint >= 0 && hint < n);
1128
1129 a += hint;
1130 lastofs = 0;
1131 ofs = 1;
1132 IFLT(*a, key) {
1133 /* a[hint] < key -- gallop right, until
1134 * a[hint + lastofs] < key <= a[hint + ofs]
1135 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001136 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001137 while (ofs < maxofs) {
1138 IFLT(a[ofs], key) {
1139 lastofs = ofs;
1140 ofs = (ofs << 1) + 1;
1141 if (ofs <= 0) /* int overflow */
1142 ofs = maxofs;
1143 }
1144 else /* key <= a[hint + ofs] */
1145 break;
1146 }
1147 if (ofs > maxofs)
1148 ofs = maxofs;
1149 /* Translate back to offsets relative to &a[0]. */
1150 lastofs += hint;
1151 ofs += hint;
1152 }
1153 else {
1154 /* key <= a[hint] -- gallop left, until
1155 * a[hint - ofs] < key <= a[hint - lastofs]
1156 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001157 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001158 while (ofs < maxofs) {
1159 IFLT(*(a-ofs), key)
1160 break;
1161 /* key <= a[hint - ofs] */
1162 lastofs = ofs;
1163 ofs = (ofs << 1) + 1;
1164 if (ofs <= 0) /* int overflow */
1165 ofs = maxofs;
1166 }
1167 if (ofs > maxofs)
1168 ofs = maxofs;
1169 /* Translate back to positive offsets relative to &a[0]. */
1170 k = lastofs;
1171 lastofs = hint - ofs;
1172 ofs = hint - k;
1173 }
1174 a -= hint;
1175
1176 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1177 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1178 * right of lastofs but no farther right than ofs. Do a binary
1179 * search, with invariant a[lastofs-1] < key <= a[ofs].
1180 */
1181 ++lastofs;
1182 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001183 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001184
1185 IFLT(a[m], key)
1186 lastofs = m+1; /* a[m] < key */
1187 else
1188 ofs = m; /* key <= a[m] */
1189 }
1190 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1191 return ofs;
1192
1193fail:
1194 return -1;
1195}
1196
1197/*
1198Exactly like gallop_left(), except that if key already exists in a[0:n],
1199finds the position immediately to the right of the rightmost equal value.
1200
1201The return value is the int k in 0..n such that
1202
1203 a[k-1] <= key < a[k]
1204
1205or -1 if error.
1206
1207The code duplication is massive, but this is enough different given that
1208we're sticking to "<" comparisons that it's much harder to follow if
1209written as one routine with yet another "left or right?" flag.
1210*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001211static Py_ssize_t
1212gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001213{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001214 Py_ssize_t ofs;
1215 Py_ssize_t lastofs;
1216 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001217
1218 assert(key && a && n > 0 && hint >= 0 && hint < n);
1219
1220 a += hint;
1221 lastofs = 0;
1222 ofs = 1;
1223 IFLT(key, *a) {
1224 /* key < a[hint] -- gallop left, until
1225 * a[hint - ofs] <= key < a[hint - lastofs]
1226 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001227 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001228 while (ofs < maxofs) {
1229 IFLT(key, *(a-ofs)) {
1230 lastofs = ofs;
1231 ofs = (ofs << 1) + 1;
1232 if (ofs <= 0) /* int overflow */
1233 ofs = maxofs;
1234 }
1235 else /* a[hint - ofs] <= key */
1236 break;
1237 }
1238 if (ofs > maxofs)
1239 ofs = maxofs;
1240 /* Translate back to positive offsets relative to &a[0]. */
1241 k = lastofs;
1242 lastofs = hint - ofs;
1243 ofs = hint - k;
1244 }
1245 else {
1246 /* a[hint] <= key -- gallop right, until
1247 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001248 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001249 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001250 while (ofs < maxofs) {
1251 IFLT(key, a[ofs])
1252 break;
1253 /* a[hint + ofs] <= key */
1254 lastofs = ofs;
1255 ofs = (ofs << 1) + 1;
1256 if (ofs <= 0) /* int overflow */
1257 ofs = maxofs;
1258 }
1259 if (ofs > maxofs)
1260 ofs = maxofs;
1261 /* Translate back to offsets relative to &a[0]. */
1262 lastofs += hint;
1263 ofs += hint;
1264 }
1265 a -= hint;
1266
1267 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1268 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1269 * right of lastofs but no farther right than ofs. Do a binary
1270 * search, with invariant a[lastofs-1] <= key < a[ofs].
1271 */
1272 ++lastofs;
1273 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001274 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001275
1276 IFLT(key, a[m])
1277 ofs = m; /* key < a[m] */
1278 else
1279 lastofs = m+1; /* a[m] <= key */
1280 }
1281 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1282 return ofs;
1283
1284fail:
1285 return -1;
1286}
1287
1288/* The maximum number of entries in a MergeState's pending-runs stack.
1289 * This is enough to sort arrays of size up to about
1290 * 32 * phi ** MAX_MERGE_PENDING
1291 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1292 * with 2**64 elements.
1293 */
1294#define MAX_MERGE_PENDING 85
1295
Tim Peterse05f65a2002-08-10 05:21:15 +00001296/* When we get into galloping mode, we stay there until both runs win less
1297 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001298 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001299#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001300
1301/* Avoid malloc for small temp arrays. */
1302#define MERGESTATE_TEMP_SIZE 256
1303
1304/* One MergeState exists on the stack per invocation of mergesort. It's just
1305 * a convenient way to pass state around among the helper functions.
1306 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001307struct s_slice {
1308 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001309 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001310};
1311
Tim Petersa64dc242002-08-01 02:13:36 +00001312typedef struct s_MergeState {
1313 /* The user-supplied comparison function. or NULL if none given. */
1314 PyObject *compare;
1315
Tim Peterse05f65a2002-08-10 05:21:15 +00001316 /* This controls when we get *into* galloping mode. It's initialized
1317 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1318 * random data, and lower for highly structured data.
1319 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001320 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001321
Tim Petersa64dc242002-08-01 02:13:36 +00001322 /* 'a' is temp storage to help with merges. It contains room for
1323 * alloced entries.
1324 */
1325 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001326 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001327
1328 /* A stack of n pending runs yet to be merged. Run #i starts at
1329 * address base[i] and extends for len[i] elements. It's always
1330 * true (so long as the indices are in bounds) that
1331 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001332 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001333 *
1334 * so we could cut the storage for this, but it's a minor amount,
1335 * and keeping all the info explicit simplifies the code.
1336 */
1337 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001338 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001339
1340 /* 'a' points to this when possible, rather than muck with malloc. */
1341 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1342} MergeState;
1343
1344/* Conceptually a MergeState's constructor. */
1345static void
1346merge_init(MergeState *ms, PyObject *compare)
1347{
1348 assert(ms != NULL);
1349 ms->compare = compare;
1350 ms->a = ms->temparray;
1351 ms->alloced = MERGESTATE_TEMP_SIZE;
1352 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001353 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001354}
1355
1356/* Free all the temp memory owned by the MergeState. This must be called
1357 * when you're done with a MergeState, and may be called before then if
1358 * you want to free the temp memory early.
1359 */
1360static void
1361merge_freemem(MergeState *ms)
1362{
1363 assert(ms != NULL);
1364 if (ms->a != ms->temparray)
1365 PyMem_Free(ms->a);
1366 ms->a = ms->temparray;
1367 ms->alloced = MERGESTATE_TEMP_SIZE;
1368}
1369
1370/* Ensure enough temp memory for 'need' array slots is available.
1371 * Returns 0 on success and -1 if the memory can't be gotten.
1372 */
1373static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001374merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001375{
1376 assert(ms != NULL);
1377 if (need <= ms->alloced)
1378 return 0;
1379 /* Don't realloc! That can cost cycles to copy the old data, but
1380 * we don't care what's in the block.
1381 */
1382 merge_freemem(ms);
1383 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1384 if (ms->a) {
1385 ms->alloced = need;
1386 return 0;
1387 }
1388 PyErr_NoMemory();
1389 merge_freemem(ms); /* reset to sane state */
1390 return -1;
1391}
1392#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1393 merge_getmem(MS, NEED))
1394
1395/* Merge the na elements starting at pa with the nb elements starting at pb
1396 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1397 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1398 * merge, and should have na <= nb. See listsort.txt for more info.
1399 * Return 0 if successful, -1 if error.
1400 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401static Py_ssize_t
1402merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1403 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001404{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001405 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001406 PyObject *compare;
1407 PyObject **dest;
1408 int result = -1; /* guilty until proved innocent */
Neal Norwitz7fd96072006-08-19 04:28:55 +00001409 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001410
1411 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1412 if (MERGE_GETMEM(ms, na) < 0)
1413 return -1;
1414 memcpy(ms->a, pa, na * sizeof(PyObject*));
1415 dest = pa;
1416 pa = ms->a;
1417
1418 *dest++ = *pb++;
1419 --nb;
1420 if (nb == 0)
1421 goto Succeed;
1422 if (na == 1)
1423 goto CopyB;
1424
Neal Norwitz7fd96072006-08-19 04:28:55 +00001425 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001426 compare = ms->compare;
1427 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001428 Py_ssize_t acount = 0; /* # of times A won in a row */
1429 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001430
1431 /* Do the straightforward thing until (if ever) one run
1432 * appears to win consistently.
1433 */
1434 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001435 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001436 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001437 if (k) {
1438 if (k < 0)
1439 goto Fail;
1440 *dest++ = *pb++;
1441 ++bcount;
1442 acount = 0;
1443 --nb;
1444 if (nb == 0)
1445 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001446 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001447 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001448 }
1449 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001450 *dest++ = *pa++;
1451 ++acount;
1452 bcount = 0;
1453 --na;
1454 if (na == 1)
1455 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001456 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001457 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001458 }
Tim Petersa64dc242002-08-01 02:13:36 +00001459 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001460
Tim Petersa64dc242002-08-01 02:13:36 +00001461 /* One run is winning so consistently that galloping may
1462 * be a huge win. So try that, and continue galloping until
1463 * (if ever) neither run appears to be winning consistently
1464 * anymore.
1465 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001466 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001467 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001468 assert(na > 1 && nb > 0);
1469 min_gallop -= min_gallop > 1;
1470 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001471 k = gallop_right(*pb, pa, na, 0, compare);
1472 acount = k;
1473 if (k) {
1474 if (k < 0)
1475 goto Fail;
1476 memcpy(dest, pa, k * sizeof(PyObject *));
1477 dest += k;
1478 pa += k;
1479 na -= k;
1480 if (na == 1)
1481 goto CopyB;
1482 /* na==0 is impossible now if the comparison
1483 * function is consistent, but we can't assume
1484 * that it is.
1485 */
1486 if (na == 0)
1487 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001488 }
Tim Petersa64dc242002-08-01 02:13:36 +00001489 *dest++ = *pb++;
1490 --nb;
1491 if (nb == 0)
1492 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001493
Tim Petersa64dc242002-08-01 02:13:36 +00001494 k = gallop_left(*pa, pb, nb, 0, compare);
1495 bcount = k;
1496 if (k) {
1497 if (k < 0)
1498 goto Fail;
1499 memmove(dest, pb, k * sizeof(PyObject *));
1500 dest += k;
1501 pb += k;
1502 nb -= k;
1503 if (nb == 0)
1504 goto Succeed;
1505 }
1506 *dest++ = *pa++;
1507 --na;
1508 if (na == 1)
1509 goto CopyB;
1510 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001511 ++min_gallop; /* penalize it for leaving galloping mode */
1512 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001513 }
1514Succeed:
1515 result = 0;
1516Fail:
1517 if (na)
1518 memcpy(dest, pa, na * sizeof(PyObject*));
1519 return result;
1520CopyB:
1521 assert(na == 1 && nb > 0);
1522 /* The last element of pa belongs at the end of the merge. */
1523 memmove(dest, pb, nb * sizeof(PyObject *));
1524 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001525 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001526}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001527
Tim Petersa64dc242002-08-01 02:13:36 +00001528/* Merge the na elements starting at pa with the nb elements starting at pb
1529 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1530 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1531 * merge, and should have na >= nb. See listsort.txt for more info.
1532 * Return 0 if successful, -1 if error.
1533 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001534static Py_ssize_t
1535merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001536{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001537 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001538 PyObject *compare;
1539 PyObject **dest;
1540 int result = -1; /* guilty until proved innocent */
1541 PyObject **basea;
1542 PyObject **baseb;
Neal Norwitz7fd96072006-08-19 04:28:55 +00001543 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001544
1545 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1546 if (MERGE_GETMEM(ms, nb) < 0)
1547 return -1;
1548 dest = pb + nb - 1;
1549 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1550 basea = pa;
1551 baseb = ms->a;
1552 pb = ms->a + nb - 1;
1553 pa += na - 1;
1554
1555 *dest-- = *pa--;
1556 --na;
1557 if (na == 0)
1558 goto Succeed;
1559 if (nb == 1)
1560 goto CopyA;
1561
Neal Norwitz7fd96072006-08-19 04:28:55 +00001562 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001563 compare = ms->compare;
1564 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001565 Py_ssize_t acount = 0; /* # of times A won in a row */
1566 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001567
1568 /* Do the straightforward thing until (if ever) one run
1569 * appears to win consistently.
1570 */
1571 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001572 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001573 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001574 if (k) {
1575 if (k < 0)
1576 goto Fail;
1577 *dest-- = *pa--;
1578 ++acount;
1579 bcount = 0;
1580 --na;
1581 if (na == 0)
1582 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001583 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001584 break;
1585 }
1586 else {
1587 *dest-- = *pb--;
1588 ++bcount;
1589 acount = 0;
1590 --nb;
1591 if (nb == 1)
1592 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001593 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001594 break;
1595 }
1596 }
1597
1598 /* One run is winning so consistently that galloping may
1599 * be a huge win. So try that, and continue galloping until
1600 * (if ever) neither run appears to be winning consistently
1601 * anymore.
1602 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001603 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001604 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001605 assert(na > 0 && nb > 1);
1606 min_gallop -= min_gallop > 1;
1607 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001608 k = gallop_right(*pb, basea, na, na-1, compare);
1609 if (k < 0)
1610 goto Fail;
1611 k = na - k;
1612 acount = k;
1613 if (k) {
1614 dest -= k;
1615 pa -= k;
1616 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1617 na -= k;
1618 if (na == 0)
1619 goto Succeed;
1620 }
1621 *dest-- = *pb--;
1622 --nb;
1623 if (nb == 1)
1624 goto CopyA;
1625
1626 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1627 if (k < 0)
1628 goto Fail;
1629 k = nb - k;
1630 bcount = k;
1631 if (k) {
1632 dest -= k;
1633 pb -= k;
1634 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1635 nb -= k;
1636 if (nb == 1)
1637 goto CopyA;
1638 /* nb==0 is impossible now if the comparison
1639 * function is consistent, but we can't assume
1640 * that it is.
1641 */
1642 if (nb == 0)
1643 goto Succeed;
1644 }
1645 *dest-- = *pa--;
1646 --na;
1647 if (na == 0)
1648 goto Succeed;
1649 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001650 ++min_gallop; /* penalize it for leaving galloping mode */
1651 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001652 }
1653Succeed:
1654 result = 0;
1655Fail:
1656 if (nb)
1657 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1658 return result;
1659CopyA:
1660 assert(nb == 1 && na > 0);
1661 /* The first element of pb belongs at the front of the merge. */
1662 dest -= na;
1663 pa -= na;
1664 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1665 *dest = *pb;
1666 return 0;
1667}
1668
1669/* Merge the two runs at stack indices i and i+1.
1670 * Returns 0 on success, -1 on error.
1671 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001672static Py_ssize_t
1673merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001674{
1675 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001676 Py_ssize_t na, nb;
1677 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001678 PyObject *compare;
1679
1680 assert(ms != NULL);
1681 assert(ms->n >= 2);
1682 assert(i >= 0);
1683 assert(i == ms->n - 2 || i == ms->n - 3);
1684
Tim Peterse05f65a2002-08-10 05:21:15 +00001685 pa = ms->pending[i].base;
1686 na = ms->pending[i].len;
1687 pb = ms->pending[i+1].base;
1688 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001689 assert(na > 0 && nb > 0);
1690 assert(pa + na == pb);
1691
1692 /* Record the length of the combined runs; if i is the 3rd-last
1693 * run now, also slide over the last run (which isn't involved
1694 * in this merge). The current run i+1 goes away in any case.
1695 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001696 ms->pending[i].len = na + nb;
1697 if (i == ms->n - 3)
1698 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001699 --ms->n;
1700
1701 /* Where does b start in a? Elements in a before that can be
1702 * ignored (already in place).
1703 */
1704 compare = ms->compare;
1705 k = gallop_right(*pb, pa, na, 0, compare);
1706 if (k < 0)
1707 return -1;
1708 pa += k;
1709 na -= k;
1710 if (na == 0)
1711 return 0;
1712
1713 /* Where does a end in b? Elements in b after that can be
1714 * ignored (already in place).
1715 */
1716 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1717 if (nb <= 0)
1718 return nb;
1719
1720 /* Merge what remains of the runs, using a temp array with
1721 * min(na, nb) elements.
1722 */
1723 if (na <= nb)
1724 return merge_lo(ms, pa, na, pb, nb);
1725 else
1726 return merge_hi(ms, pa, na, pb, nb);
1727}
1728
1729/* Examine the stack of runs waiting to be merged, merging adjacent runs
1730 * until the stack invariants are re-established:
1731 *
1732 * 1. len[-3] > len[-2] + len[-1]
1733 * 2. len[-2] > len[-1]
1734 *
1735 * See listsort.txt for more info.
1736 *
1737 * Returns 0 on success, -1 on error.
1738 */
1739static int
1740merge_collapse(MergeState *ms)
1741{
Tim Peterse05f65a2002-08-10 05:21:15 +00001742 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001743
1744 assert(ms);
1745 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001746 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001747 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1748 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001749 --n;
1750 if (merge_at(ms, n) < 0)
1751 return -1;
1752 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001753 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001754 if (merge_at(ms, n) < 0)
1755 return -1;
1756 }
1757 else
1758 break;
1759 }
1760 return 0;
1761}
1762
1763/* Regardless of invariants, merge all runs on the stack until only one
1764 * remains. This is used at the end of the mergesort.
1765 *
1766 * Returns 0 on success, -1 on error.
1767 */
1768static int
1769merge_force_collapse(MergeState *ms)
1770{
Tim Peterse05f65a2002-08-10 05:21:15 +00001771 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001772
1773 assert(ms);
1774 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001775 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001776 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001777 --n;
1778 if (merge_at(ms, n) < 0)
1779 return -1;
1780 }
1781 return 0;
1782}
1783
1784/* Compute a good value for the minimum run length; natural runs shorter
1785 * than this are boosted artificially via binary insertion.
1786 *
1787 * If n < 64, return n (it's too small to bother with fancy stuff).
1788 * Else if n is an exact power of 2, return 32.
1789 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1790 * strictly less than, an exact power of 2.
1791 *
1792 * See listsort.txt for more info.
1793 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001794static Py_ssize_t
1795merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001796{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001797 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001798
1799 assert(n >= 0);
1800 while (n >= 64) {
1801 r |= n & 1;
1802 n >>= 1;
1803 }
1804 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001805}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001806
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001807/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001808 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001809 which is returned during the undecorate phase. By exposing only the key
1810 during comparisons, the underlying sort stability characteristics are left
1811 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001812 the key instead of a full record. */
1813
1814typedef struct {
1815 PyObject_HEAD
1816 PyObject *key;
1817 PyObject *value;
1818} sortwrapperobject;
1819
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001820PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Anthony Baxter377be112006-04-11 06:54:30 +00001821static PyObject *
1822sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1823static void
1824sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001825
1826static PyTypeObject sortwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001827 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001828 "sortwrapper", /* tp_name */
1829 sizeof(sortwrapperobject), /* tp_basicsize */
1830 0, /* tp_itemsize */
1831 /* methods */
1832 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1833 0, /* tp_print */
1834 0, /* tp_getattr */
1835 0, /* tp_setattr */
1836 0, /* tp_compare */
1837 0, /* tp_repr */
1838 0, /* tp_as_number */
1839 0, /* tp_as_sequence */
1840 0, /* tp_as_mapping */
1841 0, /* tp_hash */
1842 0, /* tp_call */
1843 0, /* tp_str */
1844 PyObject_GenericGetAttr, /* tp_getattro */
1845 0, /* tp_setattro */
1846 0, /* tp_as_buffer */
Tim Petersb38e2b62004-07-29 02:29:26 +00001847 Py_TPFLAGS_DEFAULT |
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001848 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1849 sortwrapper_doc, /* tp_doc */
1850 0, /* tp_traverse */
1851 0, /* tp_clear */
1852 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1853};
1854
Anthony Baxter377be112006-04-11 06:54:30 +00001855
1856static PyObject *
1857sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1858{
1859 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1860 PyErr_SetString(PyExc_TypeError,
1861 "expected a sortwrapperobject");
1862 return NULL;
1863 }
1864 return PyObject_RichCompare(a->key, b->key, op);
1865}
1866
1867static void
1868sortwrapper_dealloc(sortwrapperobject *so)
1869{
1870 Py_XDECREF(so->key);
1871 Py_XDECREF(so->value);
1872 PyObject_Del(so);
1873}
1874
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001875/* Returns a new reference to a sortwrapper.
1876 Consumes the references to the two underlying objects. */
1877
1878static PyObject *
1879build_sortwrapper(PyObject *key, PyObject *value)
1880{
1881 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001882
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001883 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1884 if (so == NULL)
1885 return NULL;
1886 so->key = key;
1887 so->value = value;
1888 return (PyObject *)so;
1889}
1890
1891/* Returns a new reference to the value underlying the wrapper. */
1892static PyObject *
1893sortwrapper_getvalue(PyObject *so)
1894{
1895 PyObject *value;
1896
1897 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001898 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001899 "expected a sortwrapperobject");
1900 return NULL;
1901 }
1902 value = ((sortwrapperobject *)so)->value;
1903 Py_INCREF(value);
1904 return value;
1905}
1906
1907/* Wrapper for user specified cmp functions in combination with a
1908 specified key function. Makes sure the cmp function is presented
1909 with the actual key instead of the sortwrapper */
1910
1911typedef struct {
1912 PyObject_HEAD
1913 PyObject *func;
1914} cmpwrapperobject;
1915
1916static void
1917cmpwrapper_dealloc(cmpwrapperobject *co)
1918{
1919 Py_XDECREF(co->func);
1920 PyObject_Del(co);
1921}
1922
1923static PyObject *
1924cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1925{
1926 PyObject *x, *y, *xx, *yy;
1927
1928 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1929 return NULL;
1930 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001931 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001932 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001933 "expected a sortwrapperobject");
1934 return NULL;
1935 }
1936 xx = ((sortwrapperobject *)x)->key;
1937 yy = ((sortwrapperobject *)y)->key;
1938 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1939}
1940
1941PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1942
1943static PyTypeObject cmpwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001944 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001945 "cmpwrapper", /* tp_name */
1946 sizeof(cmpwrapperobject), /* tp_basicsize */
1947 0, /* tp_itemsize */
1948 /* methods */
1949 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1950 0, /* tp_print */
1951 0, /* tp_getattr */
1952 0, /* tp_setattr */
1953 0, /* tp_compare */
1954 0, /* tp_repr */
1955 0, /* tp_as_number */
1956 0, /* tp_as_sequence */
1957 0, /* tp_as_mapping */
1958 0, /* tp_hash */
1959 (ternaryfunc)cmpwrapper_call, /* tp_call */
1960 0, /* tp_str */
1961 PyObject_GenericGetAttr, /* tp_getattro */
1962 0, /* tp_setattro */
1963 0, /* tp_as_buffer */
1964 Py_TPFLAGS_DEFAULT, /* tp_flags */
1965 cmpwrapper_doc, /* tp_doc */
1966};
1967
1968static PyObject *
1969build_cmpwrapper(PyObject *cmpfunc)
1970{
1971 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001972
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001973 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1974 if (co == NULL)
1975 return NULL;
1976 Py_INCREF(cmpfunc);
1977 co->func = cmpfunc;
1978 return (PyObject *)co;
1979}
1980
Tim Petersa64dc242002-08-01 02:13:36 +00001981/* An adaptive, stable, natural mergesort. See listsort.txt.
1982 * Returns Py_None on success, NULL on error. Even in case of error, the
1983 * list will be some permutation of its input state (nothing is lost or
1984 * duplicated).
1985 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001987listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001988{
Tim Petersa64dc242002-08-01 02:13:36 +00001989 MergeState ms;
1990 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001991 Py_ssize_t nremaining;
1992 Py_ssize_t minrun;
1993 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001994 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001995 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001996 PyObject *compare = NULL;
1997 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001998 int reverse = 0;
1999 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002000 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002001 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002002 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002003
Tim Petersa64dc242002-08-01 02:13:36 +00002004 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002005 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002006 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002007 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2008 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002009 return NULL;
2010 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002011 if (compare == Py_None)
2012 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002013 if (keyfunc == Py_None)
2014 keyfunc = NULL;
2015 if (compare != NULL && keyfunc != NULL) {
2016 compare = build_cmpwrapper(compare);
2017 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002018 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002019 } else
2020 Py_XINCREF(compare);
2021
Tim Petersb9099c32002-11-12 22:08:10 +00002022 /* The list is temporarily made empty, so that mutations performed
2023 * by comparison functions can't affect the slice of memory we're
2024 * sorting (allowing mutations during sorting is a core-dump
2025 * factory, since ob_item may change).
2026 */
Martin v. Löwis68192102007-07-21 06:55:02 +00002027 saved_ob_size = Py_Size(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002028 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002029 saved_allocated = self->allocated;
Martin v. Löwis68192102007-07-21 06:55:02 +00002030 Py_Size(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002031 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002032 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002033
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002034 if (keyfunc != NULL) {
2035 for (i=0 ; i < saved_ob_size ; i++) {
2036 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002037 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002038 NULL);
2039 if (key == NULL) {
2040 for (i=i-1 ; i>=0 ; i--) {
2041 kvpair = saved_ob_item[i];
2042 value = sortwrapper_getvalue(kvpair);
2043 saved_ob_item[i] = value;
2044 Py_DECREF(kvpair);
2045 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002046 goto dsu_fail;
2047 }
2048 kvpair = build_sortwrapper(key, value);
2049 if (kvpair == NULL)
2050 goto dsu_fail;
2051 saved_ob_item[i] = kvpair;
2052 }
2053 }
2054
2055 /* Reverse sort stability achieved by initially reversing the list,
2056 applying a stable forward sort, then reversing the final result. */
2057 if (reverse && saved_ob_size > 1)
2058 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2059
2060 merge_init(&ms, compare);
2061
Tim Petersb9099c32002-11-12 22:08:10 +00002062 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002063 if (nremaining < 2)
2064 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002065
Tim Petersa64dc242002-08-01 02:13:36 +00002066 /* March over the array once, left to right, finding natural runs,
2067 * and extending short natural runs to minrun elements.
2068 */
Tim Petersb9099c32002-11-12 22:08:10 +00002069 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002070 hi = lo + nremaining;
2071 minrun = merge_compute_minrun(nremaining);
2072 do {
2073 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002074 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002075
Tim Petersa64dc242002-08-01 02:13:36 +00002076 /* Identify next run. */
2077 n = count_run(lo, hi, compare, &descending);
2078 if (n < 0)
2079 goto fail;
2080 if (descending)
2081 reverse_slice(lo, lo + n);
2082 /* If short, extend to min(minrun, nremaining). */
2083 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002084 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002085 nremaining : minrun;
2086 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2087 goto fail;
2088 n = force;
2089 }
2090 /* Push run onto pending-runs stack, and maybe merge. */
2091 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002092 ms.pending[ms.n].base = lo;
2093 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002094 ++ms.n;
2095 if (merge_collapse(&ms) < 0)
2096 goto fail;
2097 /* Advance to find next run. */
2098 lo += n;
2099 nremaining -= n;
2100 } while (nremaining);
2101 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002102
Tim Petersa64dc242002-08-01 02:13:36 +00002103 if (merge_force_collapse(&ms) < 0)
2104 goto fail;
2105 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002106 assert(ms.pending[0].base == saved_ob_item);
2107 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002108
2109succeed:
2110 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002111fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002112 if (keyfunc != NULL) {
2113 for (i=0 ; i < saved_ob_size ; i++) {
2114 kvpair = saved_ob_item[i];
2115 value = sortwrapper_getvalue(kvpair);
2116 saved_ob_item[i] = value;
2117 Py_DECREF(kvpair);
2118 }
2119 }
2120
Armin Rigo93677f02004-07-29 12:40:23 +00002121 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002122 /* The user mucked with the list during the sort,
2123 * and we don't already have another error to report.
2124 */
2125 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2126 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002127 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002128
2129 if (reverse && saved_ob_size > 1)
2130 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2131
2132 merge_freemem(&ms);
2133
2134dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002135 final_ob_item = self->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +00002136 i = Py_Size(self);
2137 Py_Size(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002138 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002139 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002140 if (final_ob_item != NULL) {
2141 /* we cannot use list_clear() for this because it does not
2142 guarantee that the list is really empty when it returns */
2143 while (--i >= 0) {
2144 Py_XDECREF(final_ob_item[i]);
2145 }
2146 PyMem_FREE(final_ob_item);
2147 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002148 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002149 Py_XINCREF(result);
2150 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002151}
Tim Peters330f9e92002-07-19 07:05:44 +00002152#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002153#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002154
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002155int
Fred Drakea2f55112000-07-09 15:16:51 +00002156PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002157{
2158 if (v == NULL || !PyList_Check(v)) {
2159 PyErr_BadInternalCall();
2160 return -1;
2161 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002162 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002163 if (v == NULL)
2164 return -1;
2165 Py_DECREF(v);
2166 return 0;
2167}
2168
Guido van Rossumb86c5492001-02-12 22:06:02 +00002169static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002170listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002171{
Martin v. Löwis68192102007-07-21 06:55:02 +00002172 if (Py_Size(self) > 1)
2173 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002174 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002175}
2176
Guido van Rossum84c76f51990-10-30 13:32:20 +00002177int
Fred Drakea2f55112000-07-09 15:16:51 +00002178PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002179{
Tim Peters6063e262002-08-08 01:06:39 +00002180 PyListObject *self = (PyListObject *)v;
2181
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002182 if (v == NULL || !PyList_Check(v)) {
2183 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002184 return -1;
2185 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002186 if (Py_Size(self) > 1)
2187 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002188 return 0;
2189}
2190
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002191PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002192PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002193{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002194 PyObject *w;
2195 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002196 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002197 if (v == NULL || !PyList_Check(v)) {
2198 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002199 return NULL;
2200 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002201 n = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002202 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002203 if (w == NULL)
2204 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002205 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002206 memcpy((void *)p,
2207 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002208 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002209 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002210 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002211 p++;
2212 }
2213 return w;
2214}
2215
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002216static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002217listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002218{
Martin v. Löwis68192102007-07-21 06:55:02 +00002219 Py_ssize_t i, start=0, stop=Py_Size(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002220 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002221
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002222 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2223 _PyEval_SliceIndex, &start,
2224 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002225 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002226 if (start < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002227 start += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002228 if (start < 0)
2229 start = 0;
2230 }
2231 if (stop < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002232 stop += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002233 if (stop < 0)
2234 stop = 0;
2235 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002236 for (i = start; i < stop && i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002237 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2238 if (cmp > 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002239 return PyInt_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002240 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002241 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002242 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002243 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002244 return NULL;
2245}
2246
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002247static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002248listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002249{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002250 Py_ssize_t count = 0;
2251 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002252
Martin v. Löwis68192102007-07-21 06:55:02 +00002253 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002254 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2255 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002256 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002257 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002258 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002259 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002260 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002261}
2262
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002263static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002264listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002265{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002266 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002267
Martin v. Löwis68192102007-07-21 06:55:02 +00002268 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002269 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2270 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002271 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002272 (PyObject *)NULL) == 0)
2273 Py_RETURN_NONE;
2274 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002275 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002276 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002277 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002278 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002279 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002280 return NULL;
2281}
2282
Jeremy Hylton8caad492000-06-23 14:18:11 +00002283static int
2284list_traverse(PyListObject *o, visitproc visit, void *arg)
2285{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002286 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002287
Martin v. Löwis68192102007-07-21 06:55:02 +00002288 for (i = Py_Size(o); --i >= 0; )
Thomas Woutersc6e55062006-04-15 21:47:09 +00002289 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002290 return 0;
2291}
2292
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002293static PyObject *
2294list_richcompare(PyObject *v, PyObject *w, int op)
2295{
2296 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002297 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002298
2299 if (!PyList_Check(v) || !PyList_Check(w)) {
2300 Py_INCREF(Py_NotImplemented);
2301 return Py_NotImplemented;
2302 }
2303
2304 vl = (PyListObject *)v;
2305 wl = (PyListObject *)w;
2306
Martin v. Löwis68192102007-07-21 06:55:02 +00002307 if (Py_Size(vl) != Py_Size(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002308 /* Shortcut: if the lengths differ, the lists differ */
2309 PyObject *res;
2310 if (op == Py_EQ)
2311 res = Py_False;
2312 else
2313 res = Py_True;
2314 Py_INCREF(res);
2315 return res;
2316 }
2317
2318 /* Search for the first index where items are different */
Martin v. Löwis68192102007-07-21 06:55:02 +00002319 for (i = 0; i < Py_Size(vl) && i < Py_Size(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002320 int k = PyObject_RichCompareBool(vl->ob_item[i],
2321 wl->ob_item[i], Py_EQ);
2322 if (k < 0)
2323 return NULL;
2324 if (!k)
2325 break;
2326 }
2327
Martin v. Löwis68192102007-07-21 06:55:02 +00002328 if (i >= Py_Size(vl) || i >= Py_Size(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002329 /* No more items to compare -- compare sizes */
Martin v. Löwis68192102007-07-21 06:55:02 +00002330 Py_ssize_t vs = Py_Size(vl);
2331 Py_ssize_t ws = Py_Size(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002332 int cmp;
2333 PyObject *res;
2334 switch (op) {
2335 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002336 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002337 case Py_EQ: cmp = vs == ws; break;
2338 case Py_NE: cmp = vs != ws; break;
2339 case Py_GT: cmp = vs > ws; break;
2340 case Py_GE: cmp = vs >= ws; break;
2341 default: return NULL; /* cannot happen */
2342 }
2343 if (cmp)
2344 res = Py_True;
2345 else
2346 res = Py_False;
2347 Py_INCREF(res);
2348 return res;
2349 }
2350
2351 /* We have an item that differs -- shortcuts for EQ/NE */
2352 if (op == Py_EQ) {
2353 Py_INCREF(Py_False);
2354 return Py_False;
2355 }
2356 if (op == Py_NE) {
2357 Py_INCREF(Py_True);
2358 return Py_True;
2359 }
2360
2361 /* Compare the final item again using the proper operator */
2362 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2363}
2364
Tim Peters6d6c1a32001-08-02 04:15:00 +00002365static int
2366list_init(PyListObject *self, PyObject *args, PyObject *kw)
2367{
2368 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002369 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002370
2371 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2372 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002373
2374 /* Verify list invariants established by PyType_GenericAlloc() */
Martin v. Löwis68192102007-07-21 06:55:02 +00002375 assert(0 <= Py_Size(self));
2376 assert(Py_Size(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002377 assert(self->ob_item != NULL ||
2378 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002379
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002380 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002381 if (self->ob_item != NULL) {
2382 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002383 }
2384 if (arg != NULL) {
2385 PyObject *rv = listextend(self, arg);
2386 if (rv == NULL)
2387 return -1;
2388 Py_DECREF(rv);
2389 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002390 return 0;
2391}
2392
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002393static long
2394list_nohash(PyObject *self)
2395{
2396 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2397 return -1;
2398}
2399
Raymond Hettinger1021c442003-11-07 15:38:09 +00002400static PyObject *list_iter(PyObject *seq);
2401static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2402
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002403PyDoc_STRVAR(getitem_doc,
2404"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002405PyDoc_STRVAR(reversed_doc,
2406"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407PyDoc_STRVAR(append_doc,
2408"L.append(object) -- append object to end");
2409PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002410"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002411PyDoc_STRVAR(insert_doc,
2412"L.insert(index, object) -- insert object before index");
2413PyDoc_STRVAR(pop_doc,
2414"L.pop([index]) -> item -- remove and return item at index (default last)");
2415PyDoc_STRVAR(remove_doc,
2416"L.remove(value) -- remove first occurrence of value");
2417PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002418"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002419PyDoc_STRVAR(count_doc,
2420"L.count(value) -> integer -- return number of occurrences of value");
2421PyDoc_STRVAR(reverse_doc,
2422"L.reverse() -- reverse *IN PLACE*");
2423PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002424"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2425cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002426
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002427static PyObject *list_subscript(PyListObject*, PyObject*);
2428
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002429static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002430 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002431 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002432 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002433 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002434 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002435 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002436 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002437 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002438 {"count", (PyCFunction)listcount, METH_O, count_doc},
2439 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002440 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002441 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002442};
2443
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002444static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002445 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002446 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002447 (ssizeargfunc)list_repeat, /* sq_repeat */
2448 (ssizeargfunc)list_item, /* sq_item */
2449 (ssizessizeargfunc)list_slice, /* sq_slice */
2450 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2451 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002452 (objobjproc)list_contains, /* sq_contains */
2453 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002454 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002455};
2456
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002457PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002458"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002459"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002460
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002461
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002462static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002463list_subscript(PyListObject* self, PyObject* item)
2464{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002465 if (PyIndex_Check(item)) {
2466 Py_ssize_t i;
2467 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002468 if (i == -1 && PyErr_Occurred())
2469 return NULL;
2470 if (i < 0)
2471 i += PyList_GET_SIZE(self);
2472 return list_item(self, i);
2473 }
2474 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002475 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002476 PyObject* result;
2477 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002478 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002479
Martin v. Löwis68192102007-07-21 06:55:02 +00002480 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002481 &start, &stop, &step, &slicelength) < 0) {
2482 return NULL;
2483 }
2484
2485 if (slicelength <= 0) {
2486 return PyList_New(0);
2487 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002488 else if (step == 1) {
2489 return list_slice(self, start, stop);
2490 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002491 else {
2492 result = PyList_New(slicelength);
2493 if (!result) return NULL;
2494
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002495 src = self->ob_item;
2496 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002497 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002498 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002499 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002500 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002501 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002502 }
Tim Peters3b01a122002-07-19 02:35:45 +00002503
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002504 return result;
2505 }
2506 }
2507 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002508 PyErr_Format(PyExc_TypeError,
2509 "list indices must be integers, not %.200s",
2510 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002511 return NULL;
2512 }
2513}
2514
Tim Peters3b01a122002-07-19 02:35:45 +00002515static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002516list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2517{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002518 if (PyIndex_Check(item)) {
2519 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002520 if (i == -1 && PyErr_Occurred())
2521 return -1;
2522 if (i < 0)
2523 i += PyList_GET_SIZE(self);
2524 return list_ass_item(self, i, value);
2525 }
2526 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002527 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002528
Martin v. Löwis68192102007-07-21 06:55:02 +00002529 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002530 &start, &stop, &step, &slicelength) < 0) {
2531 return -1;
2532 }
2533
Thomas Wouters3ccec682007-08-28 15:28:19 +00002534 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002535 return list_ass_slice(self, start, stop, value);
2536
Thomas Wouters3ccec682007-08-28 15:28:19 +00002537 /* Make sure s[5:2] = [..] inserts at the right place:
2538 before 5, not before 2. */
2539 if ((step < 0 && start < stop) ||
2540 (step > 0 && start > stop))
2541 stop = start;
2542
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002543 if (value == NULL) {
2544 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002545 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002546 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002547
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002548 if (slicelength <= 0)
2549 return 0;
2550
2551 if (step < 0) {
2552 stop = start + 1;
2553 start = stop + step*(slicelength - 1) - 1;
2554 step = -step;
2555 }
2556
2557 garbage = (PyObject**)
2558 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002559 if (!garbage) {
2560 PyErr_NoMemory();
2561 return -1;
2562 }
Tim Peters3b01a122002-07-19 02:35:45 +00002563
Thomas Wouters3ccec682007-08-28 15:28:19 +00002564 /* drawing pictures might help understand these for
2565 loops. Basically, we memmove the parts of the
2566 list that are *not* part of the slice: step-1
2567 items for each item that is part of the slice,
2568 and then tail end of the list that was not
2569 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002570 for (cur = start, i = 0;
2571 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002572 cur += step, i++) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00002573 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002574
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002575 garbage[i] = PyList_GET_ITEM(self, cur);
2576
Martin v. Löwis68192102007-07-21 06:55:02 +00002577 if (cur + step >= Py_Size(self)) {
2578 lim = Py_Size(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002579 }
2580
Tim Petersb38e2b62004-07-29 02:29:26 +00002581 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002582 self->ob_item + cur + 1,
2583 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002584 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002585 cur = start + slicelength*step;
2586 if (cur < Py_Size(self)) {
2587 memmove(self->ob_item + cur - slicelength,
2588 self->ob_item + cur,
2589 (Py_Size(self) - cur) *
2590 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002591 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002592
Martin v. Löwis68192102007-07-21 06:55:02 +00002593 Py_Size(self) -= slicelength;
2594 list_resize(self, Py_Size(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002595
2596 for (i = 0; i < slicelength; i++) {
2597 Py_DECREF(garbage[i]);
2598 }
2599 PyMem_FREE(garbage);
2600
2601 return 0;
2602 }
2603 else {
2604 /* assign slice */
Thomas Wouters3ccec682007-08-28 15:28:19 +00002605 PyObject *ins, *seq;
2606 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002607 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002608
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002609 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002610 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002611 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002612 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002613 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002614 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002615 seq = PySequence_Fast(value,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002616 "must assign iterable "
2617 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002618 }
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002619 if (!seq)
2620 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002621
2622 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2623 PyErr_Format(PyExc_ValueError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002624 "attempt to assign sequence of "
2625 "size %zd to extended slice of "
2626 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002627 PySequence_Fast_GET_SIZE(seq),
2628 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002629 Py_DECREF(seq);
2630 return -1;
2631 }
2632
2633 if (!slicelength) {
2634 Py_DECREF(seq);
2635 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002636 }
2637
2638 garbage = (PyObject**)
2639 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitze7e4e2d2006-10-28 21:20:12 +00002640 if (!garbage) {
2641 Py_DECREF(seq);
2642 PyErr_NoMemory();
2643 return -1;
2644 }
Tim Peters3b01a122002-07-19 02:35:45 +00002645
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002646 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002647 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002648 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002649 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002650 garbage[i] = selfitems[cur];
2651 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002652 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002653 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002654 }
2655
2656 for (i = 0; i < slicelength; i++) {
2657 Py_DECREF(garbage[i]);
2658 }
Tim Peters3b01a122002-07-19 02:35:45 +00002659
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002660 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002661 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002662
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002663 return 0;
2664 }
Tim Peters3b01a122002-07-19 02:35:45 +00002665 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002666 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002667 PyErr_Format(PyExc_TypeError,
2668 "list indices must be integers, not %.200s",
2669 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002670 return -1;
2671 }
2672}
2673
2674static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002675 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002676 (binaryfunc)list_subscript,
2677 (objobjargproc)list_ass_subscript
2678};
2679
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002680PyTypeObject PyList_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002681 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002682 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002683 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002684 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002685 (destructor)list_dealloc, /* tp_dealloc */
2686 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002687 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002688 0, /* tp_setattr */
2689 0, /* tp_compare */
2690 (reprfunc)list_repr, /* tp_repr */
2691 0, /* tp_as_number */
2692 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002693 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002694 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002695 0, /* tp_call */
2696 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002697 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002698 0, /* tp_setattro */
2699 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002700 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002701 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002702 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002703 (traverseproc)list_traverse, /* tp_traverse */
2704 (inquiry)list_clear, /* tp_clear */
2705 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002706 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002707 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002708 0, /* tp_iternext */
2709 list_methods, /* tp_methods */
2710 0, /* tp_members */
2711 0, /* tp_getset */
2712 0, /* tp_base */
2713 0, /* tp_dict */
2714 0, /* tp_descr_get */
2715 0, /* tp_descr_set */
2716 0, /* tp_dictoffset */
2717 (initproc)list_init, /* tp_init */
2718 PyType_GenericAlloc, /* tp_alloc */
2719 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002720 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002721};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002722
2723
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002724/*********************** List Iterator **************************/
2725
2726typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002727 PyObject_HEAD
2728 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002729 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002730} listiterobject;
2731
Anthony Baxter377be112006-04-11 06:54:30 +00002732static PyObject *list_iter(PyObject *);
2733static void listiter_dealloc(listiterobject *);
2734static int listiter_traverse(listiterobject *, visitproc, void *);
2735static PyObject *listiter_next(listiterobject *);
2736static PyObject *listiter_len(listiterobject *);
2737
2738PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2739
2740static PyMethodDef listiter_methods[] = {
2741 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2742 {NULL, NULL} /* sentinel */
2743};
2744
2745PyTypeObject PyListIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002746 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002747 "listiterator", /* tp_name */
2748 sizeof(listiterobject), /* tp_basicsize */
2749 0, /* tp_itemsize */
2750 /* methods */
2751 (destructor)listiter_dealloc, /* tp_dealloc */
2752 0, /* tp_print */
2753 0, /* tp_getattr */
2754 0, /* tp_setattr */
2755 0, /* tp_compare */
2756 0, /* tp_repr */
2757 0, /* tp_as_number */
2758 0, /* tp_as_sequence */
2759 0, /* tp_as_mapping */
2760 0, /* tp_hash */
2761 0, /* tp_call */
2762 0, /* tp_str */
2763 PyObject_GenericGetAttr, /* tp_getattro */
2764 0, /* tp_setattro */
2765 0, /* tp_as_buffer */
2766 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2767 0, /* tp_doc */
2768 (traverseproc)listiter_traverse, /* tp_traverse */
2769 0, /* tp_clear */
2770 0, /* tp_richcompare */
2771 0, /* tp_weaklistoffset */
2772 PyObject_SelfIter, /* tp_iter */
2773 (iternextfunc)listiter_next, /* tp_iternext */
2774 listiter_methods, /* tp_methods */
2775 0, /* tp_members */
2776};
2777
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002778
Guido van Rossum5086e492002-07-16 15:56:52 +00002779static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002780list_iter(PyObject *seq)
2781{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002782 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002783
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002784 if (!PyList_Check(seq)) {
2785 PyErr_BadInternalCall();
2786 return NULL;
2787 }
2788 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2789 if (it == NULL)
2790 return NULL;
2791 it->it_index = 0;
2792 Py_INCREF(seq);
2793 it->it_seq = (PyListObject *)seq;
2794 _PyObject_GC_TRACK(it);
2795 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002796}
2797
2798static void
2799listiter_dealloc(listiterobject *it)
2800{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002801 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002802 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002803 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002804}
2805
2806static int
2807listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2808{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002809 Py_VISIT(it->it_seq);
2810 return 0;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002811}
2812
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002813static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002814listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002815{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002816 PyListObject *seq;
2817 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002818
Tim Peters93b2cc42002-06-01 05:22:55 +00002819 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002820 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002821 if (seq == NULL)
2822 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002823 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002824
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002825 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002826 item = PyList_GET_ITEM(seq, it->it_index);
2827 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002828 Py_INCREF(item);
2829 return item;
2830 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002831
2832 Py_DECREF(seq);
2833 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002834 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002835}
2836
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002837static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +00002838listiter_len(listiterobject *it)
2839{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002840 Py_ssize_t len;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002841 if (it->it_seq) {
2842 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2843 if (len >= 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002844 return PyInt_FromSsize_t(len);
Raymond Hettinger40a03822004-04-12 13:05:09 +00002845 }
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002846 return PyInt_FromLong(0);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002847}
Anthony Baxter377be112006-04-11 06:54:30 +00002848/*********************** List Reverse Iterator **************************/
Raymond Hettinger435bf582004-03-18 22:43:10 +00002849
Anthony Baxter377be112006-04-11 06:54:30 +00002850typedef struct {
2851 PyObject_HEAD
2852 Py_ssize_t it_index;
2853 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2854} listreviterobject;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002855
Anthony Baxter377be112006-04-11 06:54:30 +00002856static PyObject *list_reversed(PyListObject *, PyObject *);
2857static void listreviter_dealloc(listreviterobject *);
2858static int listreviter_traverse(listreviterobject *, visitproc, void *);
2859static PyObject *listreviter_next(listreviterobject *);
2860static Py_ssize_t listreviter_len(listreviterobject *);
2861
2862static PySequenceMethods listreviter_as_sequence = {
2863 (lenfunc)listreviter_len, /* sq_length */
2864 0, /* sq_concat */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002865};
2866
Anthony Baxter377be112006-04-11 06:54:30 +00002867PyTypeObject PyListRevIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002868 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002869 "listreverseiterator", /* tp_name */
2870 sizeof(listreviterobject), /* tp_basicsize */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002871 0, /* tp_itemsize */
2872 /* methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002873 (destructor)listreviter_dealloc, /* tp_dealloc */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002874 0, /* tp_print */
2875 0, /* tp_getattr */
2876 0, /* tp_setattr */
2877 0, /* tp_compare */
2878 0, /* tp_repr */
2879 0, /* tp_as_number */
Anthony Baxter377be112006-04-11 06:54:30 +00002880 &listreviter_as_sequence, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002881 0, /* tp_as_mapping */
2882 0, /* tp_hash */
2883 0, /* tp_call */
2884 0, /* tp_str */
2885 PyObject_GenericGetAttr, /* tp_getattro */
2886 0, /* tp_setattro */
2887 0, /* tp_as_buffer */
2888 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2889 0, /* tp_doc */
Anthony Baxter377be112006-04-11 06:54:30 +00002890 (traverseproc)listreviter_traverse, /* tp_traverse */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002891 0, /* tp_clear */
2892 0, /* tp_richcompare */
2893 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002894 PyObject_SelfIter, /* tp_iter */
Anthony Baxter377be112006-04-11 06:54:30 +00002895 (iternextfunc)listreviter_next, /* tp_iternext */
2896 0,
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002897};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002898
Raymond Hettinger1021c442003-11-07 15:38:09 +00002899static PyObject *
2900list_reversed(PyListObject *seq, PyObject *unused)
2901{
2902 listreviterobject *it;
2903
2904 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2905 if (it == NULL)
2906 return NULL;
2907 assert(PyList_Check(seq));
2908 it->it_index = PyList_GET_SIZE(seq) - 1;
2909 Py_INCREF(seq);
2910 it->it_seq = seq;
2911 PyObject_GC_Track(it);
2912 return (PyObject *)it;
2913}
2914
2915static void
2916listreviter_dealloc(listreviterobject *it)
2917{
2918 PyObject_GC_UnTrack(it);
2919 Py_XDECREF(it->it_seq);
2920 PyObject_GC_Del(it);
2921}
2922
2923static int
2924listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2925{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002926 Py_VISIT(it->it_seq);
2927 return 0;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002928}
2929
2930static PyObject *
2931listreviter_next(listreviterobject *it)
2932{
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002933 PyObject *item;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002934 Py_ssize_t index = it->it_index;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002935 PyListObject *seq = it->it_seq;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002936
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002937 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2938 item = PyList_GET_ITEM(seq, index);
Raymond Hettinger1021c442003-11-07 15:38:09 +00002939 it->it_index--;
2940 Py_INCREF(item);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002941 return item;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002942 }
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002943 it->it_index = -1;
2944 if (seq != NULL) {
2945 it->it_seq = NULL;
2946 Py_DECREF(seq);
2947 }
2948 return NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002949}
2950
Martin v. Löwis18e16552006-02-15 17:27:45 +00002951static Py_ssize_t
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002952listreviter_len(listreviterobject *it)
2953{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002954 Py_ssize_t len = it->it_index + 1;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002955 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2956 return 0;
2957 return len;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002958}
2959