blob: 92bad8c7c84afb80967c6abf61e7a37efa61f1e6 [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;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000285 fprintf(fp, "[...]");
286 return 0;
287 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 fprintf(fp, "[");
Martin v. Löwis68192102007-07-21 06:55:02 +0000289 for (i = 0; i < Py_Size(op); i++) {
Guido van Rossum90933611991-06-07 16:10:43 +0000290 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000292 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
293 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000294 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000295 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 }
297 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000298 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000299 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300}
301
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000303list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000306 PyObject *s, *temp;
307 PyObject *pieces = NULL, *result = NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000308
309 i = Py_ReprEnter((PyObject*)v);
310 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000311 return i > 0 ? PyString_FromString("[...]") : NULL;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000312 }
Tim Petersa7259592001-06-16 05:11:17 +0000313
Martin v. Löwis68192102007-07-21 06:55:02 +0000314 if (Py_Size(v) == 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000315 result = PyString_FromString("[]");
316 goto Done;
317 }
318
319 pieces = PyList_New(0);
320 if (pieces == NULL)
321 goto Done;
322
323 /* Do repr() on each element. Note that this may mutate the list,
324 so must refetch the list size on each iteration. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000325 for (i = 0; i < Py_Size(v); ++i) {
Tim Petersa7259592001-06-16 05:11:17 +0000326 int status;
Brett Cannona0c05512007-09-10 21:38:27 +0000327 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
328 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000329 s = PyObject_Repr(v->ob_item[i]);
Brett Cannona0c05512007-09-10 21:38:27 +0000330 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000331 if (s == NULL)
332 goto Done;
333 status = PyList_Append(pieces, s);
334 Py_DECREF(s); /* append created a new ref */
335 if (status < 0)
336 goto Done;
337 }
338
339 /* Add "[]" decorations to the first and last items. */
340 assert(PyList_GET_SIZE(pieces) > 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 s = PyString_FromString("[");
Tim Petersa7259592001-06-16 05:11:17 +0000342 if (s == NULL)
343 goto Done;
344 temp = PyList_GET_ITEM(pieces, 0);
345 PyString_ConcatAndDel(&s, temp);
346 PyList_SET_ITEM(pieces, 0, s);
347 if (s == NULL)
348 goto Done;
349
350 s = PyString_FromString("]");
351 if (s == NULL)
352 goto Done;
353 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
354 PyString_ConcatAndDel(&temp, s);
355 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
356 if (temp == NULL)
357 goto Done;
358
359 /* Paste them all together with ", " between. */
360 s = PyString_FromString(", ");
361 if (s == NULL)
362 goto Done;
363 result = _PyString_Join(s, pieces);
Tim Peters3b01a122002-07-19 02:35:45 +0000364 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000365
366Done:
367 Py_XDECREF(pieces);
Guido van Rossumfb376de1998-04-10 22:47:27 +0000368 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000369 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370}
371
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372static Py_ssize_t
Fred Drakea2f55112000-07-09 15:16:51 +0000373list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374{
Martin v. Löwis68192102007-07-21 06:55:02 +0000375 return Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376}
377
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000378static int
Fred Drakea2f55112000-07-09 15:16:51 +0000379list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000380{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000381 Py_ssize_t i;
382 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000383
Martin v. Löwis68192102007-07-21 06:55:02 +0000384 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_Size(a); ++i)
Raymond Hettingeraae59992002-09-05 14:23:49 +0000385 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Guido van Rossum65e1cea2001-01-17 22:11:59 +0000386 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000387 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000388}
389
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000391list_item(PyListObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392{
Martin v. Löwis68192102007-07-21 06:55:02 +0000393 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000394 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395 indexerr = PyString_FromString(
396 "list index out of range");
397 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 return NULL;
399 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 return a->ob_item[i];
402}
403
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000405list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 PyListObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000408 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000409 Py_ssize_t i, len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410 if (ilow < 0)
411 ilow = 0;
Martin v. Löwis68192102007-07-21 06:55:02 +0000412 else if (ilow > Py_Size(a))
413 ilow = Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414 if (ihigh < ilow)
415 ihigh = ilow;
Martin v. Löwis68192102007-07-21 06:55:02 +0000416 else if (ihigh > Py_Size(a))
417 ihigh = Py_Size(a);
Raymond Hettinger99842b62004-03-08 05:56:15 +0000418 len = ihigh - ilow;
419 np = (PyListObject *) PyList_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 if (np == NULL)
421 return NULL;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000422
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000423 src = a->ob_item + ilow;
424 dest = np->ob_item;
Raymond Hettinger99842b62004-03-08 05:56:15 +0000425 for (i = 0; i < len; i++) {
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000426 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000428 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431}
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000434PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000435{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 if (!PyList_Check(a)) {
437 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000438 return NULL;
439 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000441}
442
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000444list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446 Py_ssize_t size;
447 Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000448 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 PyListObject *np;
450 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000451 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000452 "can only concatenate list (not \"%.200s\") to list",
453 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 return NULL;
455 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456#define b ((PyListObject *)bb)
Martin v. Löwis68192102007-07-21 06:55:02 +0000457 size = Py_Size(a) + Py_Size(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000458 if (size < 0)
459 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000462 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000464 src = a->ob_item;
465 dest = np->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +0000466 for (i = 0; i < Py_Size(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000467 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000469 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000471 src = b->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +0000472 dest = np->ob_item + Py_Size(a);
473 for (i = 0; i < Py_Size(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000474 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000476 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479#undef b
480}
481
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000483list_repeat(PyListObject *a, Py_ssize_t n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000484{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000485 Py_ssize_t i, j;
486 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 PyListObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000488 PyObject **p, **items;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000489 PyObject *elem;
Guido van Rossumed98d481991-03-06 13:07:53 +0000490 if (n < 0)
491 n = 0;
Martin v. Löwis68192102007-07-21 06:55:02 +0000492 size = Py_Size(a) * n;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000493 if (size == 0)
494 return PyList_New(0);
Martin v. Löwis68192102007-07-21 06:55:02 +0000495 if (n && size/n != Py_Size(a))
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000496 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000498 if (np == NULL)
499 return NULL;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000500
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000501 items = np->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +0000502 if (Py_Size(a) == 1) {
Raymond Hettinger6624e682003-05-21 05:58:46 +0000503 elem = a->ob_item[0];
504 for (i = 0; i < n; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000505 items[i] = elem;
Raymond Hettinger6624e682003-05-21 05:58:46 +0000506 Py_INCREF(elem);
507 }
508 return (PyObject *) np;
509 }
Guido van Rossumed98d481991-03-06 13:07:53 +0000510 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000511 items = a->ob_item;
Guido van Rossumed98d481991-03-06 13:07:53 +0000512 for (i = 0; i < n; i++) {
Martin v. Löwis68192102007-07-21 06:55:02 +0000513 for (j = 0; j < Py_Size(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000514 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000516 p++;
517 }
518 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000520}
521
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522static int
Armin Rigo93677f02004-07-29 12:40:23 +0000523list_clear(PyListObject *a)
524{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000525 Py_ssize_t i;
Armin Rigo93677f02004-07-29 12:40:23 +0000526 PyObject **item = a->ob_item;
527 if (item != NULL) {
528 /* Because XDECREF can recursively invoke operations on
529 this list, we make it empty first. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000530 i = Py_Size(a);
531 Py_Size(a) = 0;
Armin Rigo93677f02004-07-29 12:40:23 +0000532 a->ob_item = NULL;
533 a->allocated = 0;
534 while (--i >= 0) {
535 Py_XDECREF(item[i]);
536 }
537 PyMem_FREE(item);
538 }
539 /* Never fails; the return value can be ignored.
540 Note that there is no guarantee that the list is actually empty
541 at this point, because XDECREF may have populated it again! */
542 return 0;
543}
544
Tim Peters8fc4a912004-07-31 21:53:19 +0000545/* a[ilow:ihigh] = v if v != NULL.
546 * del a[ilow:ihigh] if v == NULL.
547 *
548 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
549 * guaranteed the call cannot fail.
550 */
Armin Rigo93677f02004-07-29 12:40:23 +0000551static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000554 /* Because [X]DECREF can recursively invoke list operations on
555 this list, we must postpone all [X]DECREF activity until
556 after the list is back in its canonical shape. Therefore
557 we must allocate an additional array, 'recycle', into which
558 we temporarily copy the items that are deleted from the
559 list. :-( */
Tim Peters73572222004-07-31 02:54:42 +0000560 PyObject *recycle_on_stack[8];
561 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyObject **item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000563 PyObject **vitem = NULL;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000564 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000565 Py_ssize_t n; /* # of elements in replacement list */
566 Py_ssize_t norig; /* # of elements in list getting replaced */
567 Py_ssize_t d; /* Change in size */
568 Py_ssize_t k;
Tim Peters8d9eb102004-07-31 02:24:20 +0000569 size_t s;
570 int result = -1; /* guilty until proved innocent */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572 if (v == NULL)
573 n = 0;
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000574 else {
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000575 if (a == b) {
576 /* Special case "a[i:j] = a" -- copy b first */
Martin v. Löwis68192102007-07-21 06:55:02 +0000577 v = list_slice(b, 0, Py_Size(b));
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000578 if (v == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000579 return result;
580 result = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 Py_DECREF(v);
Tim Peters8d9eb102004-07-31 02:24:20 +0000582 return result;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000583 }
Raymond Hettingerf889e102004-03-09 08:04:33 +0000584 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000585 if(v_as_SF == NULL)
Tim Peters8d9eb102004-07-31 02:24:20 +0000586 goto Error;
Michael W. Hudsonb4f49382003-08-14 17:04:28 +0000587 n = PySequence_Fast_GET_SIZE(v_as_SF);
Raymond Hettinger42bec932004-03-12 16:38:17 +0000588 vitem = PySequence_Fast_ITEMS(v_as_SF);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000589 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000590 if (ilow < 0)
591 ilow = 0;
Martin v. Löwis68192102007-07-21 06:55:02 +0000592 else if (ilow > Py_Size(a))
593 ilow = Py_Size(a);
Tim Peters8d9eb102004-07-31 02:24:20 +0000594
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595 if (ihigh < ilow)
596 ihigh = ilow;
Martin v. Löwis68192102007-07-21 06:55:02 +0000597 else if (ihigh > Py_Size(a))
598 ihigh = Py_Size(a);
Armin Rigo93677f02004-07-29 12:40:23 +0000599
Tim Peters8d9eb102004-07-31 02:24:20 +0000600 norig = ihigh - ilow;
601 assert(norig >= 0);
602 d = n - norig;
Martin v. Löwis68192102007-07-21 06:55:02 +0000603 if (Py_Size(a) + d == 0) {
Armin Rigo93677f02004-07-29 12:40:23 +0000604 Py_XDECREF(v_as_SF);
605 return list_clear(a);
606 }
607 item = a->ob_item;
Tim Peters8d9eb102004-07-31 02:24:20 +0000608 /* recycle the items that we are about to remove */
609 s = norig * sizeof(PyObject *);
Tim Peters73572222004-07-31 02:54:42 +0000610 if (s > sizeof(recycle_on_stack)) {
Armin Rigo1dd04a02004-07-30 11:38:22 +0000611 recycle = (PyObject **)PyMem_MALLOC(s);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000612 if (recycle == NULL) {
613 PyErr_NoMemory();
Tim Peters8d9eb102004-07-31 02:24:20 +0000614 goto Error;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +0000615 }
616 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000617 memcpy(recycle, &item[ilow], s);
Tim Peters8d9eb102004-07-31 02:24:20 +0000618
Armin Rigo1dd04a02004-07-30 11:38:22 +0000619 if (d < 0) { /* Delete -d items */
620 memmove(&item[ihigh+d], &item[ihigh],
Martin v. Löwis68192102007-07-21 06:55:02 +0000621 (Py_Size(a) - ihigh)*sizeof(PyObject *));
622 list_resize(a, Py_Size(a) + d);
Armin Rigo1dd04a02004-07-30 11:38:22 +0000623 item = a->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624 }
Armin Rigo1dd04a02004-07-30 11:38:22 +0000625 else if (d > 0) { /* Insert d items */
Martin v. Löwis68192102007-07-21 06:55:02 +0000626 k = Py_Size(a);
Tim Peters73572222004-07-31 02:54:42 +0000627 if (list_resize(a, k+d) < 0)
Tim Peters8d9eb102004-07-31 02:24:20 +0000628 goto Error;
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000629 item = a->ob_item;
Raymond Hettingerf889e102004-03-09 08:04:33 +0000630 memmove(&item[ihigh+d], &item[ihigh],
Tim Peters73572222004-07-31 02:54:42 +0000631 (k - ihigh)*sizeof(PyObject *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000632 }
633 for (k = 0; k < n; k++, ilow++) {
Raymond Hettingerf889e102004-03-09 08:04:33 +0000634 PyObject *w = vitem[k];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000636 item[ilow] = w;
637 }
Tim Peters73572222004-07-31 02:54:42 +0000638 for (k = norig - 1; k >= 0; --k)
639 Py_XDECREF(recycle[k]);
Tim Peters8d9eb102004-07-31 02:24:20 +0000640 result = 0;
641 Error:
Tim Peters73572222004-07-31 02:54:42 +0000642 if (recycle != recycle_on_stack)
Armin Rigo1dd04a02004-07-30 11:38:22 +0000643 PyMem_FREE(recycle);
Michael W. Hudson5da854f2002-11-05 17:38:05 +0000644 Py_XDECREF(v_as_SF);
Tim Peters8d9eb102004-07-31 02:24:20 +0000645 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000646#undef b
647}
648
Guido van Rossum234f9421993-06-17 12:35:49 +0000649int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000650PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000651{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 if (!PyList_Check(a)) {
653 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000654 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000655 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000657}
658
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000659static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000660list_inplace_repeat(PyListObject *self, Py_ssize_t n)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000661{
662 PyObject **items;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t size, i, j, p;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000664
665
666 size = PyList_GET_SIZE(self);
667 if (size == 0) {
668 Py_INCREF(self);
669 return (PyObject *)self;
670 }
671
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000672 if (n < 1) {
Armin Rigo93677f02004-07-29 12:40:23 +0000673 (void)list_clear(self);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000674 Py_INCREF(self);
675 return (PyObject *)self;
676 }
677
Tim Petersb38e2b62004-07-29 02:29:26 +0000678 if (list_resize(self, size*n) == -1)
Raymond Hettinger4bb95402004-02-13 11:36:39 +0000679 return NULL;
680
681 p = size;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000682 items = self->ob_item;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000683 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
684 for (j = 0; j < size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000685 PyObject *o = items[j];
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000686 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000687 items[p++] = o;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000688 }
689 }
690 Py_INCREF(self);
691 return (PyObject *)self;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000692}
693
Guido van Rossum4a450d01991-04-03 19:05:18 +0000694static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000695list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000696{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 PyObject *old_value;
Martin v. Löwis68192102007-07-21 06:55:02 +0000698 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 PyErr_SetString(PyExc_IndexError,
700 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000701 return -1;
702 }
703 if (v == NULL)
704 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000706 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000707 a->ob_item[i] = v;
Tim Peters3b01a122002-07-19 02:35:45 +0000708 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000709 return 0;
710}
711
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000713listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000714{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000715 Py_ssize_t i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 PyObject *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000717 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000718 return NULL;
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000719 if (ins1(self, i, v) == 0)
720 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000721 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000722}
723
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000725listappend(PyListObject *self, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726{
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +0000727 if (app1(self, v) == 0)
728 Py_RETURN_NONE;
Raymond Hettinger501f02c2004-04-12 14:01:16 +0000729 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730}
731
Barry Warsawdedf6d61998-10-09 16:37:25 +0000732static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000733listextend(PyListObject *self, PyObject *b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000734{
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000735 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000736 Py_ssize_t m; /* size of self */
737 Py_ssize_t n; /* guess for size of b */
738 Py_ssize_t mn; /* m + n */
739 Py_ssize_t i;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000740 PyObject *(*iternext)(PyObject *);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000741
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000742 /* Special cases:
Tim Petersb38e2b62004-07-29 02:29:26 +0000743 1) lists and tuples which can use PySequence_Fast ops
744 2) extending self to self requires making a copy first
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000745 */
746 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
Armin Rigo70d172d2004-03-20 22:19:23 +0000747 PyObject **src, **dest;
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000748 b = PySequence_Fast(b, "argument must be iterable");
749 if (!b)
750 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000751 n = PySequence_Fast_GET_SIZE(b);
752 if (n == 0) {
753 /* short circuit when b is empty */
754 Py_DECREF(b);
755 Py_RETURN_NONE;
756 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000757 m = Py_Size(self);
Armin Rigo70d172d2004-03-20 22:19:23 +0000758 if (list_resize(self, m + n) == -1) {
759 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000760 return NULL;
Armin Rigo70d172d2004-03-20 22:19:23 +0000761 }
762 /* note that we may still have self == b here for the
763 * situation a.extend(a), but the following code works
764 * in that case too. Just make sure to resize self
765 * before calling PySequence_Fast_ITEMS.
766 */
767 /* populate the end of self with b's items */
768 src = PySequence_Fast_ITEMS(b);
769 dest = self->ob_item + m;
770 for (i = 0; i < n; i++) {
771 PyObject *o = src[i];
772 Py_INCREF(o);
773 dest[i] = o;
774 }
775 Py_DECREF(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000776 Py_RETURN_NONE;
777 }
778
779 it = PyObject_GetIter(b);
780 if (it == NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000781 return NULL;
Raymond Hettinger57c45422004-03-11 09:48:18 +0000782 iternext = *it->ob_type->tp_iternext;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000783
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000784 /* Guess a result list size. */
Armin Rigof5b3e362006-02-11 21:32:43 +0000785 n = _PyObject_LengthHint(b);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000786 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +0000787 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
788 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
789 Py_DECREF(it);
790 return NULL;
791 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000792 PyErr_Clear();
793 n = 8; /* arbitrary */
794 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000795 m = Py_Size(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000796 mn = m + n;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000797 if (mn >= m) {
798 /* Make room. */
799 if (list_resize(self, mn) == -1)
800 goto error;
801 /* Make the list sane again. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000802 Py_Size(self) = m;
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000803 }
804 /* Else m + n overflowed; on the chance that n lied, and there really
805 * is enough room, ignore it. If n was telling the truth, we'll
806 * eventually run out of memory during the loop.
807 */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000808
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000809 /* Run iterator to exhaustion. */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000810 for (;;) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000811 PyObject *item = iternext(it);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000812 if (item == NULL) {
Raymond Hettinger57c45422004-03-11 09:48:18 +0000813 if (PyErr_Occurred()) {
814 if (PyErr_ExceptionMatches(PyExc_StopIteration))
815 PyErr_Clear();
816 else
817 goto error;
818 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000819 break;
820 }
Martin v. Löwis68192102007-07-21 06:55:02 +0000821 if (Py_Size(self) < self->allocated) {
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000822 /* steals ref */
Martin v. Löwis68192102007-07-21 06:55:02 +0000823 PyList_SET_ITEM(self, Py_Size(self), item);
824 ++Py_Size(self);
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000825 }
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000826 else {
Raymond Hettinger40a03822004-04-12 13:05:09 +0000827 int status = app1(self, item);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000828 Py_DECREF(item); /* append creates a new ref */
829 if (status < 0)
830 goto error;
831 }
832 }
833
834 /* Cut back result list if initial guess was too large. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000835 if (Py_Size(self) < self->allocated)
836 list_resize(self, Py_Size(self)); /* shrinking can't fail */
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000837
Raymond Hettinger90a39bf2004-02-15 03:57:00 +0000838 Py_DECREF(it);
839 Py_RETURN_NONE;
840
841 error:
842 Py_DECREF(it);
843 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000844}
845
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +0000846PyObject *
847_PyList_Extend(PyListObject *self, PyObject *b)
848{
849 return listextend(self, b);
850}
851
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000852static PyObject *
Raymond Hettinger97bc6182004-03-11 07:34:19 +0000853list_inplace_concat(PyListObject *self, PyObject *other)
854{
855 PyObject *result;
856
857 result = listextend(self, other);
858 if (result == NULL)
859 return result;
860 Py_DECREF(result);
861 Py_INCREF(self);
862 return (PyObject *)self;
863}
864
865static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000866listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000867{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000868 Py_ssize_t i = -1;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000869 PyObject *v;
Tim Peters8fc4a912004-07-31 21:53:19 +0000870 int status;
Raymond Hettinger9eb86b32004-02-17 11:36:16 +0000871
Armin Rigo7ccbca92006-10-04 12:17:45 +0000872 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000873 return NULL;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000874
Martin v. Löwis68192102007-07-21 06:55:02 +0000875 if (Py_Size(self) == 0) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000876 /* Special-case most common failure cause */
877 PyErr_SetString(PyExc_IndexError, "pop from empty list");
878 return NULL;
879 }
880 if (i < 0)
Martin v. Löwis68192102007-07-21 06:55:02 +0000881 i += Py_Size(self);
882 if (i < 0 || i >= Py_Size(self)) {
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000883 PyErr_SetString(PyExc_IndexError, "pop index out of range");
884 return NULL;
885 }
886 v = self->ob_item[i];
Martin v. Löwis68192102007-07-21 06:55:02 +0000887 if (i == Py_Size(self) - 1) {
888 status = list_resize(self, Py_Size(self) - 1);
Tim Peters8fc4a912004-07-31 21:53:19 +0000889 assert(status >= 0);
890 return v; /* and v now owns the reference the list had */
Raymond Hettingercb3e5802004-02-13 18:36:31 +0000891 }
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000892 Py_INCREF(v);
Tim Peters8fc4a912004-07-31 21:53:19 +0000893 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
894 assert(status >= 0);
895 /* Use status, so that in a release build compilers don't
896 * complain about the unused name.
897 */
Brett Cannon651dd522004-08-08 21:21:18 +0000898 (void) status;
899
900 return v;
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000901}
902
Tim Peters8e2e7ca2002-07-19 02:33:08 +0000903/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
904static void
905reverse_slice(PyObject **lo, PyObject **hi)
906{
907 assert(lo && hi);
908
909 --hi;
910 while (lo < hi) {
911 PyObject *t = *lo;
912 *lo = *hi;
913 *hi = t;
914 ++lo;
915 --hi;
916 }
917}
918
Tim Petersa64dc242002-08-01 02:13:36 +0000919/* Lots of code for an adaptive, stable, natural mergesort. There are many
920 * pieces to this algorithm; read listsort.txt for overviews and details.
921 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000922
Guido van Rossum3f236de1996-12-10 23:55:39 +0000923/* Comparison function. Takes care of calling a user-supplied
Tim Peters66860f62002-08-04 17:47:26 +0000924 * comparison function (any callable Python object), which must not be
925 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
926 * with Py_LT if you know it's NULL).
Tim Petersa64dc242002-08-01 02:13:36 +0000927 * Returns -1 on error, 1 if x < y, 0 if x >= y.
928 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000929static int
Tim Petersa8c974c2002-07-19 03:30:57 +0000930islt(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000931{
Tim Petersf2a04732002-07-11 21:46:16 +0000932 PyObject *res;
933 PyObject *args;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000934 Py_ssize_t i;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000935
Tim Peters66860f62002-08-04 17:47:26 +0000936 assert(compare != NULL);
Tim Petersa8c974c2002-07-19 03:30:57 +0000937 /* Call the user's comparison function and translate the 3-way
938 * result into true or false (or error).
939 */
Tim Petersf2a04732002-07-11 21:46:16 +0000940 args = PyTuple_New(2);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000941 if (args == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000942 return -1;
Tim Petersf2a04732002-07-11 21:46:16 +0000943 Py_INCREF(x);
944 Py_INCREF(y);
945 PyTuple_SET_ITEM(args, 0, x);
946 PyTuple_SET_ITEM(args, 1, y);
Tim Peters58cf3612002-07-15 05:16:13 +0000947 res = PyObject_Call(compare, args, NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000949 if (res == NULL)
Tim Petersa8c974c2002-07-19 03:30:57 +0000950 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 if (!PyInt_Check(res)) {
Georg Brandl283a1352006-11-19 08:48:30 +0000952 PyErr_Format(PyExc_TypeError,
953 "comparison function must return int, not %.200s",
954 res->ob_type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000956 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000957 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 i = PyInt_AsLong(res);
959 Py_DECREF(res);
Tim Petersa8c974c2002-07-19 03:30:57 +0000960 return i < 0;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000961}
962
Tim Peters66860f62002-08-04 17:47:26 +0000963/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
964 * islt. This avoids a layer of function call in the usual case, and
965 * sorting does many comparisons.
966 * Returns -1 on error, 1 if x < y, 0 if x >= y.
967 */
968#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
969 PyObject_RichCompareBool(X, Y, Py_LT) : \
970 islt(X, Y, COMPARE))
971
972/* Compare X to Y via "<". Goto "fail" if the comparison raises an
Tim Petersa8c974c2002-07-19 03:30:57 +0000973 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
974 started. It makes more sense in context <wink>. X and Y are PyObject*s.
975*/
Tim Peters66860f62002-08-04 17:47:26 +0000976#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
Tim Petersa8c974c2002-07-19 03:30:57 +0000977 if (k)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000978
979/* binarysort is the best method for sorting small arrays: it does
980 few compares, but can do data movement quadratic in the number of
981 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000982 [lo, hi) is a contiguous slice of a list, and is sorted via
Tim Petersa8c974c2002-07-19 03:30:57 +0000983 binary insertion. This sort is stable.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000984 On entry, must have lo <= start <= hi, and that [lo, start) is already
985 sorted (pass start == lo if you don't know!).
Tim Petersa8c974c2002-07-19 03:30:57 +0000986 If islt() complains return -1, else 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000987 Even in case of error, the output slice will be some permutation of
988 the input (nothing is lost or duplicated).
989*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000990static int
Fred Drakea2f55112000-07-09 15:16:51 +0000991binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
992 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000993{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000994 register Py_ssize_t k;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000995 register PyObject **l, **p, **r;
996 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000997
Tim Petersa8c974c2002-07-19 03:30:57 +0000998 assert(lo <= start && start <= hi);
999 /* assert [lo, start) is sorted */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001000 if (lo == start)
1001 ++start;
1002 for (; start < hi; ++start) {
1003 /* set l to where *start belongs */
1004 l = lo;
1005 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001006 pivot = *r;
Tim Peters0fe977c2002-07-19 06:12:32 +00001007 /* Invariants:
1008 * pivot >= all in [lo, l).
1009 * pivot < all in [r, start).
1010 * The second is vacuously true at the start.
1011 */
1012 assert(l < r);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001013 do {
1014 p = l + ((r - l) >> 1);
Tim Petersa8c974c2002-07-19 03:30:57 +00001015 IFLT(pivot, *p)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001016 r = p;
1017 else
Tim Peters0fe977c2002-07-19 06:12:32 +00001018 l = p+1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001019 } while (l < r);
Tim Peters0fe977c2002-07-19 06:12:32 +00001020 assert(l == r);
1021 /* The invariants still hold, so pivot >= all in [lo, l) and
1022 pivot < all in [l, start), so pivot belongs at l. Note
1023 that if there are elements equal to pivot, l points to the
1024 first slot after them -- that's why this sort is stable.
1025 Slide over to make room.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001026 Caution: using memmove is much slower under MSVC 5;
1027 we're not usually moving many slots. */
1028 for (p = start; p > l; --p)
1029 *p = *(p-1);
1030 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001031 }
Guido van Rossum3f236de1996-12-10 23:55:39 +00001032 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001033
1034 fail:
1035 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001036}
1037
Tim Petersa64dc242002-08-01 02:13:36 +00001038/*
1039Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1040is required on entry. "A run" is the longest ascending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001041
Tim Petersa64dc242002-08-01 02:13:36 +00001042 lo[0] <= lo[1] <= lo[2] <= ...
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001043
Tim Petersa64dc242002-08-01 02:13:36 +00001044or the longest descending sequence, with
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001045
Tim Petersa64dc242002-08-01 02:13:36 +00001046 lo[0] > lo[1] > lo[2] > ...
Tim Peters3b01a122002-07-19 02:35:45 +00001047
Tim Petersa64dc242002-08-01 02:13:36 +00001048Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1049For its intended use in a stable mergesort, the strictness of the defn of
1050"descending" is needed so that the caller can safely reverse a descending
1051sequence without violating stability (strict > ensures there are no equal
1052elements to get out of order).
1053
1054Returns -1 in case of error.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001055*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001056static Py_ssize_t
Tim Petersa64dc242002-08-01 02:13:36 +00001057count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001058{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001059 Py_ssize_t k;
1060 Py_ssize_t n;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001061
Tim Petersa64dc242002-08-01 02:13:36 +00001062 assert(lo < hi);
1063 *descending = 0;
1064 ++lo;
1065 if (lo == hi)
1066 return 1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001067
Tim Petersa64dc242002-08-01 02:13:36 +00001068 n = 2;
1069 IFLT(*lo, *(lo-1)) {
1070 *descending = 1;
1071 for (lo = lo+1; lo < hi; ++lo, ++n) {
1072 IFLT(*lo, *(lo-1))
1073 ;
1074 else
1075 break;
1076 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001077 }
Tim Petersa64dc242002-08-01 02:13:36 +00001078 else {
1079 for (lo = lo+1; lo < hi; ++lo, ++n) {
1080 IFLT(*lo, *(lo-1))
1081 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001082 }
1083 }
1084
Tim Petersa64dc242002-08-01 02:13:36 +00001085 return n;
1086fail:
1087 return -1;
1088}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001089
Tim Petersa64dc242002-08-01 02:13:36 +00001090/*
1091Locate the proper position of key in a sorted vector; if the vector contains
1092an element equal to key, return the position immediately to the left of
1093the leftmost equal element. [gallop_right() does the same except returns
1094the position to the right of the rightmost equal element (if any).]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001095
Tim Petersa64dc242002-08-01 02:13:36 +00001096"a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001097
Tim Petersa64dc242002-08-01 02:13:36 +00001098"hint" is an index at which to begin the search, 0 <= hint < n. The closer
1099hint is to the final result, the faster this runs.
1100
1101The return value is the int k in 0..n such that
1102
1103 a[k-1] < key <= a[k]
1104
1105pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1106key belongs at index k; or, IOW, the first k elements of a should precede
1107key, and the last n-k should follow key.
1108
1109Returns -1 on error. See listsort.txt for info on the method.
1110*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001111static Py_ssize_t
1112gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001113{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001114 Py_ssize_t ofs;
1115 Py_ssize_t lastofs;
1116 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001117
1118 assert(key && a && n > 0 && hint >= 0 && hint < n);
1119
1120 a += hint;
1121 lastofs = 0;
1122 ofs = 1;
1123 IFLT(*a, key) {
1124 /* a[hint] < key -- gallop right, until
1125 * a[hint + lastofs] < key <= a[hint + ofs]
1126 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001127 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001128 while (ofs < maxofs) {
1129 IFLT(a[ofs], key) {
1130 lastofs = ofs;
1131 ofs = (ofs << 1) + 1;
1132 if (ofs <= 0) /* int overflow */
1133 ofs = maxofs;
1134 }
1135 else /* key <= a[hint + ofs] */
1136 break;
1137 }
1138 if (ofs > maxofs)
1139 ofs = maxofs;
1140 /* Translate back to offsets relative to &a[0]. */
1141 lastofs += hint;
1142 ofs += hint;
1143 }
1144 else {
1145 /* key <= a[hint] -- gallop left, until
1146 * a[hint - ofs] < key <= a[hint - lastofs]
1147 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001148 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001149 while (ofs < maxofs) {
1150 IFLT(*(a-ofs), key)
1151 break;
1152 /* key <= a[hint - ofs] */
1153 lastofs = ofs;
1154 ofs = (ofs << 1) + 1;
1155 if (ofs <= 0) /* int overflow */
1156 ofs = maxofs;
1157 }
1158 if (ofs > maxofs)
1159 ofs = maxofs;
1160 /* Translate back to positive offsets relative to &a[0]. */
1161 k = lastofs;
1162 lastofs = hint - ofs;
1163 ofs = hint - k;
1164 }
1165 a -= hint;
1166
1167 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1168 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1169 * right of lastofs but no farther right than ofs. Do a binary
1170 * search, with invariant a[lastofs-1] < key <= a[ofs].
1171 */
1172 ++lastofs;
1173 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001174 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001175
1176 IFLT(a[m], key)
1177 lastofs = m+1; /* a[m] < key */
1178 else
1179 ofs = m; /* key <= a[m] */
1180 }
1181 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1182 return ofs;
1183
1184fail:
1185 return -1;
1186}
1187
1188/*
1189Exactly like gallop_left(), except that if key already exists in a[0:n],
1190finds the position immediately to the right of the rightmost equal value.
1191
1192The return value is the int k in 0..n such that
1193
1194 a[k-1] <= key < a[k]
1195
1196or -1 if error.
1197
1198The code duplication is massive, but this is enough different given that
1199we're sticking to "<" comparisons that it's much harder to follow if
1200written as one routine with yet another "left or right?" flag.
1201*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001202static Py_ssize_t
1203gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
Tim Petersa64dc242002-08-01 02:13:36 +00001204{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001205 Py_ssize_t ofs;
1206 Py_ssize_t lastofs;
1207 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001208
1209 assert(key && a && n > 0 && hint >= 0 && hint < n);
1210
1211 a += hint;
1212 lastofs = 0;
1213 ofs = 1;
1214 IFLT(key, *a) {
1215 /* key < a[hint] -- gallop left, until
1216 * a[hint - ofs] <= key < a[hint - lastofs]
1217 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001218 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
Tim Petersa64dc242002-08-01 02:13:36 +00001219 while (ofs < maxofs) {
1220 IFLT(key, *(a-ofs)) {
1221 lastofs = ofs;
1222 ofs = (ofs << 1) + 1;
1223 if (ofs <= 0) /* int overflow */
1224 ofs = maxofs;
1225 }
1226 else /* a[hint - ofs] <= key */
1227 break;
1228 }
1229 if (ofs > maxofs)
1230 ofs = maxofs;
1231 /* Translate back to positive offsets relative to &a[0]. */
1232 k = lastofs;
1233 lastofs = hint - ofs;
1234 ofs = hint - k;
1235 }
1236 else {
1237 /* a[hint] <= key -- gallop right, until
1238 * a[hint + lastofs] <= key < a[hint + ofs]
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001239 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001240 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
Tim Petersa64dc242002-08-01 02:13:36 +00001241 while (ofs < maxofs) {
1242 IFLT(key, a[ofs])
1243 break;
1244 /* a[hint + ofs] <= key */
1245 lastofs = ofs;
1246 ofs = (ofs << 1) + 1;
1247 if (ofs <= 0) /* int overflow */
1248 ofs = maxofs;
1249 }
1250 if (ofs > maxofs)
1251 ofs = maxofs;
1252 /* Translate back to offsets relative to &a[0]. */
1253 lastofs += hint;
1254 ofs += hint;
1255 }
1256 a -= hint;
1257
1258 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1259 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1260 * right of lastofs but no farther right than ofs. Do a binary
1261 * search, with invariant a[lastofs-1] <= key < a[ofs].
1262 */
1263 ++lastofs;
1264 while (lastofs < ofs) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001265 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
Tim Petersa64dc242002-08-01 02:13:36 +00001266
1267 IFLT(key, a[m])
1268 ofs = m; /* key < a[m] */
1269 else
1270 lastofs = m+1; /* a[m] <= key */
1271 }
1272 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1273 return ofs;
1274
1275fail:
1276 return -1;
1277}
1278
1279/* The maximum number of entries in a MergeState's pending-runs stack.
1280 * This is enough to sort arrays of size up to about
1281 * 32 * phi ** MAX_MERGE_PENDING
1282 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1283 * with 2**64 elements.
1284 */
1285#define MAX_MERGE_PENDING 85
1286
Tim Peterse05f65a2002-08-10 05:21:15 +00001287/* When we get into galloping mode, we stay there until both runs win less
1288 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
Tim Petersa64dc242002-08-01 02:13:36 +00001289 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001290#define MIN_GALLOP 7
Tim Petersa64dc242002-08-01 02:13:36 +00001291
1292/* Avoid malloc for small temp arrays. */
1293#define MERGESTATE_TEMP_SIZE 256
1294
1295/* One MergeState exists on the stack per invocation of mergesort. It's just
1296 * a convenient way to pass state around among the helper functions.
1297 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001298struct s_slice {
1299 PyObject **base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001300 Py_ssize_t len;
Tim Peterse05f65a2002-08-10 05:21:15 +00001301};
1302
Tim Petersa64dc242002-08-01 02:13:36 +00001303typedef struct s_MergeState {
1304 /* The user-supplied comparison function. or NULL if none given. */
1305 PyObject *compare;
1306
Tim Peterse05f65a2002-08-10 05:21:15 +00001307 /* This controls when we get *into* galloping mode. It's initialized
1308 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1309 * random data, and lower for highly structured data.
1310 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001311 Py_ssize_t min_gallop;
Tim Peterse05f65a2002-08-10 05:21:15 +00001312
Tim Petersa64dc242002-08-01 02:13:36 +00001313 /* 'a' is temp storage to help with merges. It contains room for
1314 * alloced entries.
1315 */
1316 PyObject **a; /* may point to temparray below */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001317 Py_ssize_t alloced;
Tim Petersa64dc242002-08-01 02:13:36 +00001318
1319 /* A stack of n pending runs yet to be merged. Run #i starts at
1320 * address base[i] and extends for len[i] elements. It's always
1321 * true (so long as the indices are in bounds) that
1322 *
Tim Peterse05f65a2002-08-10 05:21:15 +00001323 * pending[i].base + pending[i].len == pending[i+1].base
Tim Petersa64dc242002-08-01 02:13:36 +00001324 *
1325 * so we could cut the storage for this, but it's a minor amount,
1326 * and keeping all the info explicit simplifies the code.
1327 */
1328 int n;
Tim Peterse05f65a2002-08-10 05:21:15 +00001329 struct s_slice pending[MAX_MERGE_PENDING];
Tim Petersa64dc242002-08-01 02:13:36 +00001330
1331 /* 'a' points to this when possible, rather than muck with malloc. */
1332 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1333} MergeState;
1334
1335/* Conceptually a MergeState's constructor. */
1336static void
1337merge_init(MergeState *ms, PyObject *compare)
1338{
1339 assert(ms != NULL);
1340 ms->compare = compare;
1341 ms->a = ms->temparray;
1342 ms->alloced = MERGESTATE_TEMP_SIZE;
1343 ms->n = 0;
Tim Peterse05f65a2002-08-10 05:21:15 +00001344 ms->min_gallop = MIN_GALLOP;
Tim Petersa64dc242002-08-01 02:13:36 +00001345}
1346
1347/* Free all the temp memory owned by the MergeState. This must be called
1348 * when you're done with a MergeState, and may be called before then if
1349 * you want to free the temp memory early.
1350 */
1351static void
1352merge_freemem(MergeState *ms)
1353{
1354 assert(ms != NULL);
1355 if (ms->a != ms->temparray)
1356 PyMem_Free(ms->a);
1357 ms->a = ms->temparray;
1358 ms->alloced = MERGESTATE_TEMP_SIZE;
1359}
1360
1361/* Ensure enough temp memory for 'need' array slots is available.
1362 * Returns 0 on success and -1 if the memory can't be gotten.
1363 */
1364static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001365merge_getmem(MergeState *ms, Py_ssize_t need)
Tim Petersa64dc242002-08-01 02:13:36 +00001366{
1367 assert(ms != NULL);
1368 if (need <= ms->alloced)
1369 return 0;
1370 /* Don't realloc! That can cost cycles to copy the old data, but
1371 * we don't care what's in the block.
1372 */
1373 merge_freemem(ms);
1374 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1375 if (ms->a) {
1376 ms->alloced = need;
1377 return 0;
1378 }
1379 PyErr_NoMemory();
1380 merge_freemem(ms); /* reset to sane state */
1381 return -1;
1382}
1383#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1384 merge_getmem(MS, NEED))
1385
1386/* Merge the na elements starting at pa with the nb elements starting at pb
1387 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1388 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1389 * merge, and should have na <= nb. See listsort.txt for more info.
1390 * Return 0 if successful, -1 if error.
1391 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001392static Py_ssize_t
1393merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1394 PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001395{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001396 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001397 PyObject *compare;
1398 PyObject **dest;
1399 int result = -1; /* guilty until proved innocent */
Neal Norwitz7fd96072006-08-19 04:28:55 +00001400 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001401
1402 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1403 if (MERGE_GETMEM(ms, na) < 0)
1404 return -1;
1405 memcpy(ms->a, pa, na * sizeof(PyObject*));
1406 dest = pa;
1407 pa = ms->a;
1408
1409 *dest++ = *pb++;
1410 --nb;
1411 if (nb == 0)
1412 goto Succeed;
1413 if (na == 1)
1414 goto CopyB;
1415
Neal Norwitz7fd96072006-08-19 04:28:55 +00001416 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001417 compare = ms->compare;
1418 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001419 Py_ssize_t acount = 0; /* # of times A won in a row */
1420 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001421
1422 /* Do the straightforward thing until (if ever) one run
1423 * appears to win consistently.
1424 */
1425 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001426 assert(na > 1 && nb > 0);
Tim Peters66860f62002-08-04 17:47:26 +00001427 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001428 if (k) {
1429 if (k < 0)
1430 goto Fail;
1431 *dest++ = *pb++;
1432 ++bcount;
1433 acount = 0;
1434 --nb;
1435 if (nb == 0)
1436 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001437 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001438 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001439 }
1440 else {
Tim Petersa64dc242002-08-01 02:13:36 +00001441 *dest++ = *pa++;
1442 ++acount;
1443 bcount = 0;
1444 --na;
1445 if (na == 1)
1446 goto CopyB;
Tim Peterse05f65a2002-08-10 05:21:15 +00001447 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001448 break;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001449 }
Tim Petersa64dc242002-08-01 02:13:36 +00001450 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001451
Tim Petersa64dc242002-08-01 02:13:36 +00001452 /* One run is winning so consistently that galloping may
1453 * be a huge win. So try that, and continue galloping until
1454 * (if ever) neither run appears to be winning consistently
1455 * anymore.
1456 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001457 ++min_gallop;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001458 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001459 assert(na > 1 && nb > 0);
1460 min_gallop -= min_gallop > 1;
1461 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001462 k = gallop_right(*pb, pa, na, 0, compare);
1463 acount = k;
1464 if (k) {
1465 if (k < 0)
1466 goto Fail;
1467 memcpy(dest, pa, k * sizeof(PyObject *));
1468 dest += k;
1469 pa += k;
1470 na -= k;
1471 if (na == 1)
1472 goto CopyB;
1473 /* na==0 is impossible now if the comparison
1474 * function is consistent, but we can't assume
1475 * that it is.
1476 */
1477 if (na == 0)
1478 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001479 }
Tim Petersa64dc242002-08-01 02:13:36 +00001480 *dest++ = *pb++;
1481 --nb;
1482 if (nb == 0)
1483 goto Succeed;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001484
Tim Petersa64dc242002-08-01 02:13:36 +00001485 k = gallop_left(*pa, pb, nb, 0, compare);
1486 bcount = k;
1487 if (k) {
1488 if (k < 0)
1489 goto Fail;
1490 memmove(dest, pb, k * sizeof(PyObject *));
1491 dest += k;
1492 pb += k;
1493 nb -= k;
1494 if (nb == 0)
1495 goto Succeed;
1496 }
1497 *dest++ = *pa++;
1498 --na;
1499 if (na == 1)
1500 goto CopyB;
1501 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001502 ++min_gallop; /* penalize it for leaving galloping mode */
1503 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001504 }
1505Succeed:
1506 result = 0;
1507Fail:
1508 if (na)
1509 memcpy(dest, pa, na * sizeof(PyObject*));
1510 return result;
1511CopyB:
1512 assert(na == 1 && nb > 0);
1513 /* The last element of pa belongs at the end of the merge. */
1514 memmove(dest, pb, nb * sizeof(PyObject *));
1515 dest[nb] = *pa;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001516 return 0;
Tim Petersa64dc242002-08-01 02:13:36 +00001517}
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001518
Tim Petersa64dc242002-08-01 02:13:36 +00001519/* Merge the na elements starting at pa with the nb elements starting at pb
1520 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1521 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1522 * merge, and should have na >= nb. See listsort.txt for more info.
1523 * Return 0 if successful, -1 if error.
1524 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001525static Py_ssize_t
1526merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
Tim Petersa64dc242002-08-01 02:13:36 +00001527{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001528 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001529 PyObject *compare;
1530 PyObject **dest;
1531 int result = -1; /* guilty until proved innocent */
1532 PyObject **basea;
1533 PyObject **baseb;
Neal Norwitz7fd96072006-08-19 04:28:55 +00001534 Py_ssize_t min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001535
1536 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1537 if (MERGE_GETMEM(ms, nb) < 0)
1538 return -1;
1539 dest = pb + nb - 1;
1540 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1541 basea = pa;
1542 baseb = ms->a;
1543 pb = ms->a + nb - 1;
1544 pa += na - 1;
1545
1546 *dest-- = *pa--;
1547 --na;
1548 if (na == 0)
1549 goto Succeed;
1550 if (nb == 1)
1551 goto CopyA;
1552
Neal Norwitz7fd96072006-08-19 04:28:55 +00001553 min_gallop = ms->min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001554 compare = ms->compare;
1555 for (;;) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001556 Py_ssize_t acount = 0; /* # of times A won in a row */
1557 Py_ssize_t bcount = 0; /* # of times B won in a row */
Tim Petersa64dc242002-08-01 02:13:36 +00001558
1559 /* Do the straightforward thing until (if ever) one run
1560 * appears to win consistently.
1561 */
1562 for (;;) {
Tim Peterse05f65a2002-08-10 05:21:15 +00001563 assert(na > 0 && nb > 1);
Tim Peters66860f62002-08-04 17:47:26 +00001564 k = ISLT(*pb, *pa, compare);
Tim Petersa64dc242002-08-01 02:13:36 +00001565 if (k) {
1566 if (k < 0)
1567 goto Fail;
1568 *dest-- = *pa--;
1569 ++acount;
1570 bcount = 0;
1571 --na;
1572 if (na == 0)
1573 goto Succeed;
Tim Peterse05f65a2002-08-10 05:21:15 +00001574 if (acount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001575 break;
1576 }
1577 else {
1578 *dest-- = *pb--;
1579 ++bcount;
1580 acount = 0;
1581 --nb;
1582 if (nb == 1)
1583 goto CopyA;
Tim Peterse05f65a2002-08-10 05:21:15 +00001584 if (bcount >= min_gallop)
Tim Petersa64dc242002-08-01 02:13:36 +00001585 break;
1586 }
1587 }
1588
1589 /* One run is winning so consistently that galloping may
1590 * be a huge win. So try that, and continue galloping until
1591 * (if ever) neither run appears to be winning consistently
1592 * anymore.
1593 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001594 ++min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001595 do {
Tim Peterse05f65a2002-08-10 05:21:15 +00001596 assert(na > 0 && nb > 1);
1597 min_gallop -= min_gallop > 1;
1598 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001599 k = gallop_right(*pb, basea, na, na-1, compare);
1600 if (k < 0)
1601 goto Fail;
1602 k = na - k;
1603 acount = k;
1604 if (k) {
1605 dest -= k;
1606 pa -= k;
1607 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1608 na -= k;
1609 if (na == 0)
1610 goto Succeed;
1611 }
1612 *dest-- = *pb--;
1613 --nb;
1614 if (nb == 1)
1615 goto CopyA;
1616
1617 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1618 if (k < 0)
1619 goto Fail;
1620 k = nb - k;
1621 bcount = k;
1622 if (k) {
1623 dest -= k;
1624 pb -= k;
1625 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1626 nb -= k;
1627 if (nb == 1)
1628 goto CopyA;
1629 /* nb==0 is impossible now if the comparison
1630 * function is consistent, but we can't assume
1631 * that it is.
1632 */
1633 if (nb == 0)
1634 goto Succeed;
1635 }
1636 *dest-- = *pa--;
1637 --na;
1638 if (na == 0)
1639 goto Succeed;
1640 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
Tim Peterse05f65a2002-08-10 05:21:15 +00001641 ++min_gallop; /* penalize it for leaving galloping mode */
1642 ms->min_gallop = min_gallop;
Tim Petersa64dc242002-08-01 02:13:36 +00001643 }
1644Succeed:
1645 result = 0;
1646Fail:
1647 if (nb)
1648 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1649 return result;
1650CopyA:
1651 assert(nb == 1 && na > 0);
1652 /* The first element of pb belongs at the front of the merge. */
1653 dest -= na;
1654 pa -= na;
1655 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1656 *dest = *pb;
1657 return 0;
1658}
1659
1660/* Merge the two runs at stack indices i and i+1.
1661 * Returns 0 on success, -1 on error.
1662 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001663static Py_ssize_t
1664merge_at(MergeState *ms, Py_ssize_t i)
Tim Petersa64dc242002-08-01 02:13:36 +00001665{
1666 PyObject **pa, **pb;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001667 Py_ssize_t na, nb;
1668 Py_ssize_t k;
Tim Petersa64dc242002-08-01 02:13:36 +00001669 PyObject *compare;
1670
1671 assert(ms != NULL);
1672 assert(ms->n >= 2);
1673 assert(i >= 0);
1674 assert(i == ms->n - 2 || i == ms->n - 3);
1675
Tim Peterse05f65a2002-08-10 05:21:15 +00001676 pa = ms->pending[i].base;
1677 na = ms->pending[i].len;
1678 pb = ms->pending[i+1].base;
1679 nb = ms->pending[i+1].len;
Tim Petersa64dc242002-08-01 02:13:36 +00001680 assert(na > 0 && nb > 0);
1681 assert(pa + na == pb);
1682
1683 /* Record the length of the combined runs; if i is the 3rd-last
1684 * run now, also slide over the last run (which isn't involved
1685 * in this merge). The current run i+1 goes away in any case.
1686 */
Tim Peterse05f65a2002-08-10 05:21:15 +00001687 ms->pending[i].len = na + nb;
1688 if (i == ms->n - 3)
1689 ms->pending[i+1] = ms->pending[i+2];
Tim Petersa64dc242002-08-01 02:13:36 +00001690 --ms->n;
1691
1692 /* Where does b start in a? Elements in a before that can be
1693 * ignored (already in place).
1694 */
1695 compare = ms->compare;
1696 k = gallop_right(*pb, pa, na, 0, compare);
1697 if (k < 0)
1698 return -1;
1699 pa += k;
1700 na -= k;
1701 if (na == 0)
1702 return 0;
1703
1704 /* Where does a end in b? Elements in b after that can be
1705 * ignored (already in place).
1706 */
1707 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1708 if (nb <= 0)
1709 return nb;
1710
1711 /* Merge what remains of the runs, using a temp array with
1712 * min(na, nb) elements.
1713 */
1714 if (na <= nb)
1715 return merge_lo(ms, pa, na, pb, nb);
1716 else
1717 return merge_hi(ms, pa, na, pb, nb);
1718}
1719
1720/* Examine the stack of runs waiting to be merged, merging adjacent runs
1721 * until the stack invariants are re-established:
1722 *
1723 * 1. len[-3] > len[-2] + len[-1]
1724 * 2. len[-2] > len[-1]
1725 *
1726 * See listsort.txt for more info.
1727 *
1728 * Returns 0 on success, -1 on error.
1729 */
1730static int
1731merge_collapse(MergeState *ms)
1732{
Tim Peterse05f65a2002-08-10 05:21:15 +00001733 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001734
1735 assert(ms);
1736 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001737 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001738 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1739 if (p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001740 --n;
1741 if (merge_at(ms, n) < 0)
1742 return -1;
1743 }
Tim Peterse05f65a2002-08-10 05:21:15 +00001744 else if (p[n].len <= p[n+1].len) {
Tim Petersa64dc242002-08-01 02:13:36 +00001745 if (merge_at(ms, n) < 0)
1746 return -1;
1747 }
1748 else
1749 break;
1750 }
1751 return 0;
1752}
1753
1754/* Regardless of invariants, merge all runs on the stack until only one
1755 * remains. This is used at the end of the mergesort.
1756 *
1757 * Returns 0 on success, -1 on error.
1758 */
1759static int
1760merge_force_collapse(MergeState *ms)
1761{
Tim Peterse05f65a2002-08-10 05:21:15 +00001762 struct s_slice *p = ms->pending;
Tim Petersa64dc242002-08-01 02:13:36 +00001763
1764 assert(ms);
1765 while (ms->n > 1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001766 Py_ssize_t n = ms->n - 2;
Tim Peterse05f65a2002-08-10 05:21:15 +00001767 if (n > 0 && p[n-1].len < p[n+1].len)
Tim Petersa64dc242002-08-01 02:13:36 +00001768 --n;
1769 if (merge_at(ms, n) < 0)
1770 return -1;
1771 }
1772 return 0;
1773}
1774
1775/* Compute a good value for the minimum run length; natural runs shorter
1776 * than this are boosted artificially via binary insertion.
1777 *
1778 * If n < 64, return n (it's too small to bother with fancy stuff).
1779 * Else if n is an exact power of 2, return 32.
1780 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1781 * strictly less than, an exact power of 2.
1782 *
1783 * See listsort.txt for more info.
1784 */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001785static Py_ssize_t
1786merge_compute_minrun(Py_ssize_t n)
Tim Petersa64dc242002-08-01 02:13:36 +00001787{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001788 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
Tim Petersa64dc242002-08-01 02:13:36 +00001789
1790 assert(n >= 0);
1791 while (n >= 64) {
1792 r |= n & 1;
1793 n >>= 1;
1794 }
1795 return n + r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001796}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001797
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001798/* Special wrapper to support stable sorting using the decorate-sort-undecorate
Andrew M. Kuchling55be9ea2004-09-10 12:59:54 +00001799 pattern. Holds a key which is used for comparisons and the original record
Tim Petersb38e2b62004-07-29 02:29:26 +00001800 which is returned during the undecorate phase. By exposing only the key
1801 during comparisons, the underlying sort stability characteristics are left
1802 unchanged. Also, if a custom comparison function is used, it will only see
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001803 the key instead of a full record. */
1804
1805typedef struct {
1806 PyObject_HEAD
1807 PyObject *key;
1808 PyObject *value;
1809} sortwrapperobject;
1810
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001811PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
Anthony Baxter377be112006-04-11 06:54:30 +00001812static PyObject *
1813sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1814static void
1815sortwrapper_dealloc(sortwrapperobject *);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001816
1817static PyTypeObject sortwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001818 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001819 "sortwrapper", /* tp_name */
1820 sizeof(sortwrapperobject), /* tp_basicsize */
1821 0, /* tp_itemsize */
1822 /* methods */
1823 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1824 0, /* tp_print */
1825 0, /* tp_getattr */
1826 0, /* tp_setattr */
1827 0, /* tp_compare */
1828 0, /* tp_repr */
1829 0, /* tp_as_number */
1830 0, /* tp_as_sequence */
1831 0, /* tp_as_mapping */
1832 0, /* tp_hash */
1833 0, /* tp_call */
1834 0, /* tp_str */
1835 PyObject_GenericGetAttr, /* tp_getattro */
1836 0, /* tp_setattro */
1837 0, /* tp_as_buffer */
Tim Petersb38e2b62004-07-29 02:29:26 +00001838 Py_TPFLAGS_DEFAULT |
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001839 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1840 sortwrapper_doc, /* tp_doc */
1841 0, /* tp_traverse */
1842 0, /* tp_clear */
1843 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1844};
1845
Anthony Baxter377be112006-04-11 06:54:30 +00001846
1847static PyObject *
1848sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1849{
1850 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1851 PyErr_SetString(PyExc_TypeError,
1852 "expected a sortwrapperobject");
1853 return NULL;
1854 }
1855 return PyObject_RichCompare(a->key, b->key, op);
1856}
1857
1858static void
1859sortwrapper_dealloc(sortwrapperobject *so)
1860{
1861 Py_XDECREF(so->key);
1862 Py_XDECREF(so->value);
1863 PyObject_Del(so);
1864}
1865
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001866/* Returns a new reference to a sortwrapper.
1867 Consumes the references to the two underlying objects. */
1868
1869static PyObject *
1870build_sortwrapper(PyObject *key, PyObject *value)
1871{
1872 sortwrapperobject *so;
Tim Petersb38e2b62004-07-29 02:29:26 +00001873
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001874 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1875 if (so == NULL)
1876 return NULL;
1877 so->key = key;
1878 so->value = value;
1879 return (PyObject *)so;
1880}
1881
1882/* Returns a new reference to the value underlying the wrapper. */
1883static PyObject *
1884sortwrapper_getvalue(PyObject *so)
1885{
1886 PyObject *value;
1887
1888 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001889 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001890 "expected a sortwrapperobject");
1891 return NULL;
1892 }
1893 value = ((sortwrapperobject *)so)->value;
1894 Py_INCREF(value);
1895 return value;
1896}
1897
1898/* Wrapper for user specified cmp functions in combination with a
1899 specified key function. Makes sure the cmp function is presented
1900 with the actual key instead of the sortwrapper */
1901
1902typedef struct {
1903 PyObject_HEAD
1904 PyObject *func;
1905} cmpwrapperobject;
1906
1907static void
1908cmpwrapper_dealloc(cmpwrapperobject *co)
1909{
1910 Py_XDECREF(co->func);
1911 PyObject_Del(co);
1912}
1913
1914static PyObject *
1915cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1916{
1917 PyObject *x, *y, *xx, *yy;
1918
1919 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1920 return NULL;
1921 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
Raymond Hettingerae4a2992003-10-16 17:16:30 +00001922 !PyObject_TypeCheck(y, &sortwrapper_type)) {
Tim Petersb38e2b62004-07-29 02:29:26 +00001923 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001924 "expected a sortwrapperobject");
1925 return NULL;
1926 }
1927 xx = ((sortwrapperobject *)x)->key;
1928 yy = ((sortwrapperobject *)y)->key;
1929 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1930}
1931
1932PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1933
1934static PyTypeObject cmpwrapper_type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001935 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001936 "cmpwrapper", /* tp_name */
1937 sizeof(cmpwrapperobject), /* tp_basicsize */
1938 0, /* tp_itemsize */
1939 /* methods */
1940 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
1941 0, /* tp_print */
1942 0, /* tp_getattr */
1943 0, /* tp_setattr */
1944 0, /* tp_compare */
1945 0, /* tp_repr */
1946 0, /* tp_as_number */
1947 0, /* tp_as_sequence */
1948 0, /* tp_as_mapping */
1949 0, /* tp_hash */
1950 (ternaryfunc)cmpwrapper_call, /* tp_call */
1951 0, /* tp_str */
1952 PyObject_GenericGetAttr, /* tp_getattro */
1953 0, /* tp_setattro */
1954 0, /* tp_as_buffer */
1955 Py_TPFLAGS_DEFAULT, /* tp_flags */
1956 cmpwrapper_doc, /* tp_doc */
1957};
1958
1959static PyObject *
1960build_cmpwrapper(PyObject *cmpfunc)
1961{
1962 cmpwrapperobject *co;
Tim Petersb38e2b62004-07-29 02:29:26 +00001963
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001964 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
1965 if (co == NULL)
1966 return NULL;
1967 Py_INCREF(cmpfunc);
1968 co->func = cmpfunc;
1969 return (PyObject *)co;
1970}
1971
Tim Petersa64dc242002-08-01 02:13:36 +00001972/* An adaptive, stable, natural mergesort. See listsort.txt.
1973 * Returns Py_None on success, NULL on error. Even in case of error, the
1974 * list will be some permutation of its input state (nothing is lost or
1975 * duplicated).
1976 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001977static PyObject *
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001978listsort(PyListObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001979{
Tim Petersa64dc242002-08-01 02:13:36 +00001980 MergeState ms;
1981 PyObject **lo, **hi;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001982 Py_ssize_t nremaining;
1983 Py_ssize_t minrun;
1984 Py_ssize_t saved_ob_size, saved_allocated;
Tim Petersb9099c32002-11-12 22:08:10 +00001985 PyObject **saved_ob_item;
Armin Rigo93677f02004-07-29 12:40:23 +00001986 PyObject **final_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00001987 PyObject *compare = NULL;
1988 PyObject *result = NULL; /* guilty until proved innocent */
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001989 int reverse = 0;
1990 PyObject *keyfunc = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001991 Py_ssize_t i;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001992 PyObject *key, *value, *kvpair;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001993 static char *kwlist[] = {"cmp", "key", "reverse", 0};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001994
Tim Petersa64dc242002-08-01 02:13:36 +00001995 assert(self != NULL);
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001996 assert (PyList_Check(self));
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001997 if (args != NULL) {
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00001998 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
1999 kwlist, &compare, &keyfunc, &reverse))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002000 return NULL;
2001 }
Skip Montanaro4abd5f02003-01-02 20:51:08 +00002002 if (compare == Py_None)
2003 compare = NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002004 if (keyfunc == Py_None)
2005 keyfunc = NULL;
2006 if (compare != NULL && keyfunc != NULL) {
2007 compare = build_cmpwrapper(compare);
2008 if (compare == NULL)
Hye-Shik Chang19cb1932003-12-10 07:31:08 +00002009 return NULL;
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002010 } else
2011 Py_XINCREF(compare);
2012
Tim Petersb9099c32002-11-12 22:08:10 +00002013 /* The list is temporarily made empty, so that mutations performed
2014 * by comparison functions can't affect the slice of memory we're
2015 * sorting (allowing mutations during sorting is a core-dump
2016 * factory, since ob_item may change).
2017 */
Martin v. Löwis68192102007-07-21 06:55:02 +00002018 saved_ob_size = Py_Size(self);
Tim Petersb9099c32002-11-12 22:08:10 +00002019 saved_ob_item = self->ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002020 saved_allocated = self->allocated;
Martin v. Löwis68192102007-07-21 06:55:02 +00002021 Py_Size(self) = 0;
Tim Peters51b4ade2004-07-29 04:07:15 +00002022 self->ob_item = NULL;
Armin Rigo93677f02004-07-29 12:40:23 +00002023 self->allocated = -1; /* any operation will reset it to >= 0 */
Tim Peters330f9e92002-07-19 07:05:44 +00002024
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002025 if (keyfunc != NULL) {
2026 for (i=0 ; i < saved_ob_size ; i++) {
2027 value = saved_ob_item[i];
Tim Petersb38e2b62004-07-29 02:29:26 +00002028 key = PyObject_CallFunctionObjArgs(keyfunc, value,
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002029 NULL);
2030 if (key == NULL) {
2031 for (i=i-1 ; i>=0 ; i--) {
2032 kvpair = saved_ob_item[i];
2033 value = sortwrapper_getvalue(kvpair);
2034 saved_ob_item[i] = value;
2035 Py_DECREF(kvpair);
2036 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002037 goto dsu_fail;
2038 }
2039 kvpair = build_sortwrapper(key, value);
2040 if (kvpair == NULL)
2041 goto dsu_fail;
2042 saved_ob_item[i] = kvpair;
2043 }
2044 }
2045
2046 /* Reverse sort stability achieved by initially reversing the list,
2047 applying a stable forward sort, then reversing the final result. */
2048 if (reverse && saved_ob_size > 1)
2049 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2050
2051 merge_init(&ms, compare);
2052
Tim Petersb9099c32002-11-12 22:08:10 +00002053 nremaining = saved_ob_size;
Tim Petersa64dc242002-08-01 02:13:36 +00002054 if (nremaining < 2)
2055 goto succeed;
Tim Peters330f9e92002-07-19 07:05:44 +00002056
Tim Petersa64dc242002-08-01 02:13:36 +00002057 /* March over the array once, left to right, finding natural runs,
2058 * and extending short natural runs to minrun elements.
2059 */
Tim Petersb9099c32002-11-12 22:08:10 +00002060 lo = saved_ob_item;
Tim Petersa64dc242002-08-01 02:13:36 +00002061 hi = lo + nremaining;
2062 minrun = merge_compute_minrun(nremaining);
2063 do {
2064 int descending;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002065 Py_ssize_t n;
Tim Peters330f9e92002-07-19 07:05:44 +00002066
Tim Petersa64dc242002-08-01 02:13:36 +00002067 /* Identify next run. */
2068 n = count_run(lo, hi, compare, &descending);
2069 if (n < 0)
2070 goto fail;
2071 if (descending)
2072 reverse_slice(lo, lo + n);
2073 /* If short, extend to min(minrun, nremaining). */
2074 if (n < minrun) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002075 const Py_ssize_t force = nremaining <= minrun ?
Tim Petersa64dc242002-08-01 02:13:36 +00002076 nremaining : minrun;
2077 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2078 goto fail;
2079 n = force;
2080 }
2081 /* Push run onto pending-runs stack, and maybe merge. */
2082 assert(ms.n < MAX_MERGE_PENDING);
Tim Peterse05f65a2002-08-10 05:21:15 +00002083 ms.pending[ms.n].base = lo;
2084 ms.pending[ms.n].len = n;
Tim Petersa64dc242002-08-01 02:13:36 +00002085 ++ms.n;
2086 if (merge_collapse(&ms) < 0)
2087 goto fail;
2088 /* Advance to find next run. */
2089 lo += n;
2090 nremaining -= n;
2091 } while (nremaining);
2092 assert(lo == hi);
Tim Peters330f9e92002-07-19 07:05:44 +00002093
Tim Petersa64dc242002-08-01 02:13:36 +00002094 if (merge_force_collapse(&ms) < 0)
2095 goto fail;
2096 assert(ms.n == 1);
Tim Petersb9099c32002-11-12 22:08:10 +00002097 assert(ms.pending[0].base == saved_ob_item);
2098 assert(ms.pending[0].len == saved_ob_size);
Tim Petersa64dc242002-08-01 02:13:36 +00002099
2100succeed:
2101 result = Py_None;
Tim Peters330f9e92002-07-19 07:05:44 +00002102fail:
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002103 if (keyfunc != NULL) {
2104 for (i=0 ; i < saved_ob_size ; i++) {
2105 kvpair = saved_ob_item[i];
2106 value = sortwrapper_getvalue(kvpair);
2107 saved_ob_item[i] = value;
2108 Py_DECREF(kvpair);
2109 }
2110 }
2111
Armin Rigo93677f02004-07-29 12:40:23 +00002112 if (self->allocated != -1 && result != NULL) {
Tim Peters51b4ade2004-07-29 04:07:15 +00002113 /* The user mucked with the list during the sort,
2114 * and we don't already have another error to report.
2115 */
2116 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2117 result = NULL;
Tim Petersb9099c32002-11-12 22:08:10 +00002118 }
Michael W. Hudson1df0f652003-12-04 11:25:46 +00002119
2120 if (reverse && saved_ob_size > 1)
2121 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2122
2123 merge_freemem(&ms);
2124
2125dsu_fail:
Armin Rigo93677f02004-07-29 12:40:23 +00002126 final_ob_item = self->ob_item;
Martin v. Löwis68192102007-07-21 06:55:02 +00002127 i = Py_Size(self);
2128 Py_Size(self) = saved_ob_size;
Tim Petersb9099c32002-11-12 22:08:10 +00002129 self->ob_item = saved_ob_item;
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002130 self->allocated = saved_allocated;
Armin Rigo93677f02004-07-29 12:40:23 +00002131 if (final_ob_item != NULL) {
2132 /* we cannot use list_clear() for this because it does not
2133 guarantee that the list is really empty when it returns */
2134 while (--i >= 0) {
2135 Py_XDECREF(final_ob_item[i]);
2136 }
2137 PyMem_FREE(final_ob_item);
2138 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002139 Py_XDECREF(compare);
Tim Petersa64dc242002-08-01 02:13:36 +00002140 Py_XINCREF(result);
2141 return result;
Guido van Rossum3f236de1996-12-10 23:55:39 +00002142}
Tim Peters330f9e92002-07-19 07:05:44 +00002143#undef IFLT
Tim Peters66860f62002-08-04 17:47:26 +00002144#undef ISLT
Tim Peters330f9e92002-07-19 07:05:44 +00002145
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002146int
Fred Drakea2f55112000-07-09 15:16:51 +00002147PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002148{
2149 if (v == NULL || !PyList_Check(v)) {
2150 PyErr_BadInternalCall();
2151 return -1;
2152 }
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002153 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002154 if (v == NULL)
2155 return -1;
2156 Py_DECREF(v);
2157 return 0;
2158}
2159
Guido van Rossumb86c5492001-02-12 22:06:02 +00002160static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002161listreverse(PyListObject *self)
Guido van Rossumb86c5492001-02-12 22:06:02 +00002162{
Martin v. Löwis68192102007-07-21 06:55:02 +00002163 if (Py_Size(self) > 1)
2164 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002165 Py_RETURN_NONE;
Guido van Rossumed98d481991-03-06 13:07:53 +00002166}
2167
Guido van Rossum84c76f51990-10-30 13:32:20 +00002168int
Fred Drakea2f55112000-07-09 15:16:51 +00002169PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002170{
Tim Peters6063e262002-08-08 01:06:39 +00002171 PyListObject *self = (PyListObject *)v;
2172
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002173 if (v == NULL || !PyList_Check(v)) {
2174 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002175 return -1;
2176 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002177 if (Py_Size(self) > 1)
2178 reverse_slice(self->ob_item, self->ob_item + Py_Size(self));
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00002179 return 0;
2180}
2181
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002182PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00002183PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002184{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002185 PyObject *w;
2186 PyObject **p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002187 Py_ssize_t n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002188 if (v == NULL || !PyList_Check(v)) {
2189 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002190 return NULL;
2191 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002192 n = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002193 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002194 if (w == NULL)
2195 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002196 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00002197 memcpy((void *)p,
2198 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002199 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002200 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002201 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00002202 p++;
2203 }
2204 return w;
2205}
2206
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002207static PyObject *
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002208listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00002209{
Martin v. Löwis68192102007-07-21 06:55:02 +00002210 Py_ssize_t i, start=0, stop=Py_Size(self);
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002211 PyObject *v;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002212
Walter Dörwalde8049bef2003-06-17 19:27:39 +00002213 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2214 _PyEval_SliceIndex, &start,
2215 _PyEval_SliceIndex, &stop))
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002216 return NULL;
Guido van Rossum2743d872003-06-17 14:25:14 +00002217 if (start < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002218 start += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002219 if (start < 0)
2220 start = 0;
2221 }
2222 if (stop < 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00002223 stop += Py_Size(self);
Guido van Rossum2743d872003-06-17 14:25:14 +00002224 if (stop < 0)
2225 stop = 0;
2226 }
Martin v. Löwis68192102007-07-21 06:55:02 +00002227 for (i = start; i < stop && i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002228 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2229 if (cmp > 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002230 return PyInt_FromSsize_t(i);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002231 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002232 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002234 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002235 return NULL;
2236}
2237
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002239listcount(PyListObject *self, PyObject *v)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002240{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002241 Py_ssize_t count = 0;
2242 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002243
Martin v. Löwis68192102007-07-21 06:55:02 +00002244 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002245 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2246 if (cmp > 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00002247 count++;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002248 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002249 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00002250 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002251 return PyInt_FromSsize_t(count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00002252}
2253
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002254static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002255listremove(PyListObject *self, PyObject *v)
Guido van Rossumed98d481991-03-06 13:07:53 +00002256{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002257 Py_ssize_t i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00002258
Martin v. Löwis68192102007-07-21 06:55:02 +00002259 for (i = 0; i < Py_Size(self); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002260 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2261 if (cmp > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002262 if (list_ass_slice(self, i, i+1,
Raymond Hettinger45d0b5c2004-04-12 17:21:03 +00002263 (PyObject *)NULL) == 0)
2264 Py_RETURN_NONE;
2265 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002266 }
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002267 else if (cmp < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002268 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00002269 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002270 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00002271 return NULL;
2272}
2273
Jeremy Hylton8caad492000-06-23 14:18:11 +00002274static int
2275list_traverse(PyListObject *o, visitproc visit, void *arg)
2276{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002277 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002278
Martin v. Löwis68192102007-07-21 06:55:02 +00002279 for (i = Py_Size(o); --i >= 0; )
Thomas Woutersc6e55062006-04-15 21:47:09 +00002280 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002281 return 0;
2282}
2283
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002284static PyObject *
2285list_richcompare(PyObject *v, PyObject *w, int op)
2286{
2287 PyListObject *vl, *wl;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002288 Py_ssize_t i;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002289
2290 if (!PyList_Check(v) || !PyList_Check(w)) {
2291 Py_INCREF(Py_NotImplemented);
2292 return Py_NotImplemented;
2293 }
2294
2295 vl = (PyListObject *)v;
2296 wl = (PyListObject *)w;
2297
Martin v. Löwis68192102007-07-21 06:55:02 +00002298 if (Py_Size(vl) != Py_Size(wl) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002299 /* Shortcut: if the lengths differ, the lists differ */
2300 PyObject *res;
2301 if (op == Py_EQ)
2302 res = Py_False;
2303 else
2304 res = Py_True;
2305 Py_INCREF(res);
2306 return res;
2307 }
2308
2309 /* Search for the first index where items are different */
Martin v. Löwis68192102007-07-21 06:55:02 +00002310 for (i = 0; i < Py_Size(vl) && i < Py_Size(wl); i++) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002311 int k = PyObject_RichCompareBool(vl->ob_item[i],
2312 wl->ob_item[i], Py_EQ);
2313 if (k < 0)
2314 return NULL;
2315 if (!k)
2316 break;
2317 }
2318
Martin v. Löwis68192102007-07-21 06:55:02 +00002319 if (i >= Py_Size(vl) || i >= Py_Size(wl)) {
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002320 /* No more items to compare -- compare sizes */
Martin v. Löwis68192102007-07-21 06:55:02 +00002321 Py_ssize_t vs = Py_Size(vl);
2322 Py_ssize_t ws = Py_Size(wl);
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002323 int cmp;
2324 PyObject *res;
2325 switch (op) {
2326 case Py_LT: cmp = vs < ws; break;
Tim Peters6ee42342001-07-06 17:45:43 +00002327 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002328 case Py_EQ: cmp = vs == ws; break;
2329 case Py_NE: cmp = vs != ws; break;
2330 case Py_GT: cmp = vs > ws; break;
2331 case Py_GE: cmp = vs >= ws; break;
2332 default: return NULL; /* cannot happen */
2333 }
2334 if (cmp)
2335 res = Py_True;
2336 else
2337 res = Py_False;
2338 Py_INCREF(res);
2339 return res;
2340 }
2341
2342 /* We have an item that differs -- shortcuts for EQ/NE */
2343 if (op == Py_EQ) {
2344 Py_INCREF(Py_False);
2345 return Py_False;
2346 }
2347 if (op == Py_NE) {
2348 Py_INCREF(Py_True);
2349 return Py_True;
2350 }
2351
2352 /* Compare the final item again using the proper operator */
2353 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2354}
2355
Tim Peters6d6c1a32001-08-02 04:15:00 +00002356static int
2357list_init(PyListObject *self, PyObject *args, PyObject *kw)
2358{
2359 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +00002360 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002361
2362 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2363 return -1;
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002364
2365 /* Verify list invariants established by PyType_GenericAlloc() */
Martin v. Löwis68192102007-07-21 06:55:02 +00002366 assert(0 <= Py_Size(self));
2367 assert(Py_Size(self) <= self->allocated || self->allocated == -1);
Armin Rigoa37bbf22004-07-30 11:20:18 +00002368 assert(self->ob_item != NULL ||
2369 self->allocated == 0 || self->allocated == -1);
Raymond Hettingerc0aaa2d2004-07-29 23:31:29 +00002370
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002371 /* Empty previous contents */
Armin Rigo93677f02004-07-29 12:40:23 +00002372 if (self->ob_item != NULL) {
2373 (void)list_clear(self);
Raymond Hettinger90a39bf2004-02-15 03:57:00 +00002374 }
2375 if (arg != NULL) {
2376 PyObject *rv = listextend(self, arg);
2377 if (rv == NULL)
2378 return -1;
2379 Py_DECREF(rv);
2380 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002381 return 0;
2382}
2383
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002384static long
2385list_nohash(PyObject *self)
2386{
2387 PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
2388 return -1;
2389}
2390
Raymond Hettinger1021c442003-11-07 15:38:09 +00002391static PyObject *list_iter(PyObject *seq);
2392static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2393
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002394PyDoc_STRVAR(getitem_doc,
2395"x.__getitem__(y) <==> x[y]");
Raymond Hettinger1021c442003-11-07 15:38:09 +00002396PyDoc_STRVAR(reversed_doc,
2397"L.__reversed__() -- return a reverse iterator over the list");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002398PyDoc_STRVAR(append_doc,
2399"L.append(object) -- append object to end");
2400PyDoc_STRVAR(extend_doc,
Raymond Hettingerf8bcfb12002-12-29 05:49:09 +00002401"L.extend(iterable) -- extend list by appending elements from the iterable");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002402PyDoc_STRVAR(insert_doc,
2403"L.insert(index, object) -- insert object before index");
2404PyDoc_STRVAR(pop_doc,
2405"L.pop([index]) -> item -- remove and return item at index (default last)");
2406PyDoc_STRVAR(remove_doc,
2407"L.remove(value) -- remove first occurrence of value");
2408PyDoc_STRVAR(index_doc,
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002409"L.index(value, [start, [stop]]) -> integer -- return first index of value");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002410PyDoc_STRVAR(count_doc,
2411"L.count(value) -> integer -- return number of occurrences of value");
2412PyDoc_STRVAR(reverse_doc,
2413"L.reverse() -- reverse *IN PLACE*");
2414PyDoc_STRVAR(sort_doc,
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002415"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2416cmp(x, y) -> -1, 0, 1");
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00002417
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002418static PyObject *list_subscript(PyListObject*, PyObject*);
2419
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002420static PyMethodDef list_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002421 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
Raymond Hettinger1021c442003-11-07 15:38:09 +00002422 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002423 {"append", (PyCFunction)listappend, METH_O, append_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002424 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002425 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002426 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002427 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
Raymond Hettingerd05abde2003-06-17 05:05:49 +00002428 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002429 {"count", (PyCFunction)listcount, METH_O, count_doc},
2430 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
Raymond Hettinger42b1ba32003-10-16 03:41:09 +00002431 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
Tim Petersa64dc242002-08-01 02:13:36 +00002432 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002433};
2434
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002435static PySequenceMethods list_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002436 (lenfunc)list_length, /* sq_length */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002437 (binaryfunc)list_concat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002438 (ssizeargfunc)list_repeat, /* sq_repeat */
2439 (ssizeargfunc)list_item, /* sq_item */
2440 (ssizessizeargfunc)list_slice, /* sq_slice */
2441 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2442 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002443 (objobjproc)list_contains, /* sq_contains */
2444 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002445 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002446};
2447
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002448PyDoc_STRVAR(list_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002449"list() -> new list\n"
Neal Norwitz2c2e8272002-06-14 02:04:18 +00002450"list(sequence) -> new list initialized from sequence's items");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002451
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002452
Jeremy Hyltona4b4c3b2002-07-13 03:51:17 +00002453static PyObject *
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002454list_subscript(PyListObject* self, PyObject* item)
2455{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002456 if (PyIndex_Check(item)) {
2457 Py_ssize_t i;
2458 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002459 if (i == -1 && PyErr_Occurred())
2460 return NULL;
2461 if (i < 0)
2462 i += PyList_GET_SIZE(self);
2463 return list_item(self, i);
2464 }
2465 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002466 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002467 PyObject* result;
2468 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002469 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002470
Martin v. Löwis68192102007-07-21 06:55:02 +00002471 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002472 &start, &stop, &step, &slicelength) < 0) {
2473 return NULL;
2474 }
2475
2476 if (slicelength <= 0) {
2477 return PyList_New(0);
2478 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002479 else if (step == 1) {
2480 return list_slice(self, start, stop);
2481 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002482 else {
2483 result = PyList_New(slicelength);
2484 if (!result) return NULL;
2485
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002486 src = self->ob_item;
2487 dest = ((PyListObject *)result)->ob_item;
Tim Peters3b01a122002-07-19 02:35:45 +00002488 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002489 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002490 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002491 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002492 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002493 }
Tim Peters3b01a122002-07-19 02:35:45 +00002494
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002495 return result;
2496 }
2497 }
2498 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002499 PyErr_Format(PyExc_TypeError,
2500 "list indices must be integers, not %.200s",
2501 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002502 return NULL;
2503 }
2504}
2505
Tim Peters3b01a122002-07-19 02:35:45 +00002506static int
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002507list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2508{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002509 if (PyIndex_Check(item)) {
2510 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002511 if (i == -1 && PyErr_Occurred())
2512 return -1;
2513 if (i < 0)
2514 i += PyList_GET_SIZE(self);
2515 return list_ass_item(self, i, value);
2516 }
2517 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002518 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002519
Martin v. Löwis68192102007-07-21 06:55:02 +00002520 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_Size(self),
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002521 &start, &stop, &step, &slicelength) < 0) {
2522 return -1;
2523 }
2524
Thomas Wouters3ccec682007-08-28 15:28:19 +00002525 if (step == 1)
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002526 return list_ass_slice(self, start, stop, value);
2527
Thomas Wouters3ccec682007-08-28 15:28:19 +00002528 /* Make sure s[5:2] = [..] inserts at the right place:
2529 before 5, not before 2. */
2530 if ((step < 0 && start < stop) ||
2531 (step > 0 && start > stop))
2532 stop = start;
2533
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002534 if (value == NULL) {
2535 /* delete slice */
Raymond Hettinger4bb95402004-02-13 11:36:39 +00002536 PyObject **garbage;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002537 Py_ssize_t cur, i;
Tim Peters3b01a122002-07-19 02:35:45 +00002538
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002539 if (slicelength <= 0)
2540 return 0;
2541
2542 if (step < 0) {
2543 stop = start + 1;
2544 start = stop + step*(slicelength - 1) - 1;
2545 step = -step;
2546 }
2547
2548 garbage = (PyObject**)
2549 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002550 if (!garbage) {
2551 PyErr_NoMemory();
2552 return -1;
2553 }
Tim Peters3b01a122002-07-19 02:35:45 +00002554
Thomas Wouters3ccec682007-08-28 15:28:19 +00002555 /* drawing pictures might help understand these for
2556 loops. Basically, we memmove the parts of the
2557 list that are *not* part of the slice: step-1
2558 items for each item that is part of the slice,
2559 and then tail end of the list that was not
2560 covered by the slice */
Guido van Rossum75a20b12002-06-11 12:22:28 +00002561 for (cur = start, i = 0;
2562 cur < stop;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002563 cur += step, i++) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00002564 Py_ssize_t lim = step - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002565
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002566 garbage[i] = PyList_GET_ITEM(self, cur);
2567
Martin v. Löwis68192102007-07-21 06:55:02 +00002568 if (cur + step >= Py_Size(self)) {
2569 lim = Py_Size(self) - cur - 1;
Michael W. Hudson56796f62002-07-29 14:35:04 +00002570 }
2571
Tim Petersb38e2b62004-07-29 02:29:26 +00002572 memmove(self->ob_item + cur - i,
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002573 self->ob_item + cur + 1,
2574 lim * sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002575 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00002576 cur = start + slicelength*step;
2577 if (cur < Py_Size(self)) {
2578 memmove(self->ob_item + cur - slicelength,
2579 self->ob_item + cur,
2580 (Py_Size(self) - cur) *
2581 sizeof(PyObject *));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002582 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002583
Martin v. Löwis68192102007-07-21 06:55:02 +00002584 Py_Size(self) -= slicelength;
2585 list_resize(self, Py_Size(self));
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002586
2587 for (i = 0; i < slicelength; i++) {
2588 Py_DECREF(garbage[i]);
2589 }
2590 PyMem_FREE(garbage);
2591
2592 return 0;
2593 }
2594 else {
2595 /* assign slice */
Thomas Wouters3ccec682007-08-28 15:28:19 +00002596 PyObject *ins, *seq;
2597 PyObject **garbage, **seqitems, **selfitems;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002598 Py_ssize_t cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002599
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002600 /* protect against a[::-1] = a */
Tim Peters3b01a122002-07-19 02:35:45 +00002601 if (self == (PyListObject*)value) {
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002602 seq = list_slice((PyListObject*)value, 0,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002603 PyList_GET_SIZE(value));
Tim Peters3b01a122002-07-19 02:35:45 +00002604 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002605 else {
Tim Petersb38e2b62004-07-29 02:29:26 +00002606 seq = PySequence_Fast(value,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002607 "must assign iterable "
2608 "to extended slice");
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002609 }
Neal Norwitzb88cfad2006-08-12 03:16:54 +00002610 if (!seq)
2611 return -1;
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002612
2613 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2614 PyErr_Format(PyExc_ValueError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00002615 "attempt to assign sequence of "
2616 "size %zd to extended slice of "
2617 "size %zd",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00002618 PySequence_Fast_GET_SIZE(seq),
2619 slicelength);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002620 Py_DECREF(seq);
2621 return -1;
2622 }
2623
2624 if (!slicelength) {
2625 Py_DECREF(seq);
2626 return 0;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002627 }
2628
2629 garbage = (PyObject**)
2630 PyMem_MALLOC(slicelength*sizeof(PyObject*));
Neal Norwitze7e4e2d2006-10-28 21:20:12 +00002631 if (!garbage) {
2632 Py_DECREF(seq);
2633 PyErr_NoMemory();
2634 return -1;
2635 }
Tim Peters3b01a122002-07-19 02:35:45 +00002636
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002637 selfitems = self->ob_item;
Raymond Hettinger42bec932004-03-12 16:38:17 +00002638 seqitems = PySequence_Fast_ITEMS(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002639 for (cur = start, i = 0; i < slicelength;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002640 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002641 garbage[i] = selfitems[cur];
2642 ins = seqitems[i];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002643 Py_INCREF(ins);
Raymond Hettingera6366fe2004-03-09 13:05:22 +00002644 selfitems[cur] = ins;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002645 }
2646
2647 for (i = 0; i < slicelength; i++) {
2648 Py_DECREF(garbage[i]);
2649 }
Tim Peters3b01a122002-07-19 02:35:45 +00002650
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002651 PyMem_FREE(garbage);
Michael W. Hudsona69c0302002-12-05 21:32:32 +00002652 Py_DECREF(seq);
Tim Peters3b01a122002-07-19 02:35:45 +00002653
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002654 return 0;
2655 }
Tim Peters3b01a122002-07-19 02:35:45 +00002656 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002657 else {
Georg Brandl283a1352006-11-19 08:48:30 +00002658 PyErr_Format(PyExc_TypeError,
2659 "list indices must be integers, not %.200s",
2660 item->ob_type->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002661 return -1;
2662 }
2663}
2664
2665static PyMappingMethods list_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002666 (lenfunc)list_length,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002667 (binaryfunc)list_subscript,
2668 (objobjargproc)list_ass_subscript
2669};
2670
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002671PyTypeObject PyList_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002672 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002673 "list",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002674 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002675 0,
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002676 (destructor)list_dealloc, /* tp_dealloc */
2677 (printfunc)list_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002678 0, /* tp_getattr */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002679 0, /* tp_setattr */
2680 0, /* tp_compare */
2681 (reprfunc)list_repr, /* tp_repr */
2682 0, /* tp_as_number */
2683 &list_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +00002684 &list_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002685 list_nohash, /* tp_hash */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002686 0, /* tp_call */
2687 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002688 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002689 0, /* tp_setattro */
2690 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002691 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002692 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002693 list_doc, /* tp_doc */
Guido van Rossum65e1cea2001-01-17 22:11:59 +00002694 (traverseproc)list_traverse, /* tp_traverse */
2695 (inquiry)list_clear, /* tp_clear */
2696 list_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002697 0, /* tp_weaklistoffset */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002698 list_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002699 0, /* tp_iternext */
2700 list_methods, /* tp_methods */
2701 0, /* tp_members */
2702 0, /* tp_getset */
2703 0, /* tp_base */
2704 0, /* tp_dict */
2705 0, /* tp_descr_get */
2706 0, /* tp_descr_set */
2707 0, /* tp_dictoffset */
2708 (initproc)list_init, /* tp_init */
2709 PyType_GenericAlloc, /* tp_alloc */
2710 PyType_GenericNew, /* tp_new */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002711 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002712};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00002713
2714
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002715/*********************** List Iterator **************************/
2716
2717typedef struct {
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002718 PyObject_HEAD
2719 long it_index;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002720 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002721} listiterobject;
2722
Anthony Baxter377be112006-04-11 06:54:30 +00002723static PyObject *list_iter(PyObject *);
2724static void listiter_dealloc(listiterobject *);
2725static int listiter_traverse(listiterobject *, visitproc, void *);
2726static PyObject *listiter_next(listiterobject *);
2727static PyObject *listiter_len(listiterobject *);
2728
2729PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2730
2731static PyMethodDef listiter_methods[] = {
2732 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2733 {NULL, NULL} /* sentinel */
2734};
2735
2736PyTypeObject PyListIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002737 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002738 "listiterator", /* tp_name */
2739 sizeof(listiterobject), /* tp_basicsize */
2740 0, /* tp_itemsize */
2741 /* methods */
2742 (destructor)listiter_dealloc, /* tp_dealloc */
2743 0, /* tp_print */
2744 0, /* tp_getattr */
2745 0, /* tp_setattr */
2746 0, /* tp_compare */
2747 0, /* tp_repr */
2748 0, /* tp_as_number */
2749 0, /* tp_as_sequence */
2750 0, /* tp_as_mapping */
2751 0, /* tp_hash */
2752 0, /* tp_call */
2753 0, /* tp_str */
2754 PyObject_GenericGetAttr, /* tp_getattro */
2755 0, /* tp_setattro */
2756 0, /* tp_as_buffer */
2757 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2758 0, /* tp_doc */
2759 (traverseproc)listiter_traverse, /* tp_traverse */
2760 0, /* tp_clear */
2761 0, /* tp_richcompare */
2762 0, /* tp_weaklistoffset */
2763 PyObject_SelfIter, /* tp_iter */
2764 (iternextfunc)listiter_next, /* tp_iternext */
2765 listiter_methods, /* tp_methods */
2766 0, /* tp_members */
2767};
2768
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002769
Guido van Rossum5086e492002-07-16 15:56:52 +00002770static PyObject *
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002771list_iter(PyObject *seq)
2772{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002773 listiterobject *it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002774
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002775 if (!PyList_Check(seq)) {
2776 PyErr_BadInternalCall();
2777 return NULL;
2778 }
2779 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2780 if (it == NULL)
2781 return NULL;
2782 it->it_index = 0;
2783 Py_INCREF(seq);
2784 it->it_seq = (PyListObject *)seq;
2785 _PyObject_GC_TRACK(it);
2786 return (PyObject *)it;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002787}
2788
2789static void
2790listiter_dealloc(listiterobject *it)
2791{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002792 _PyObject_GC_UNTRACK(it);
Guido van Rossum86103ae2002-07-16 20:07:32 +00002793 Py_XDECREF(it->it_seq);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002794 PyObject_GC_Del(it);
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002795}
2796
2797static int
2798listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2799{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002800 Py_VISIT(it->it_seq);
2801 return 0;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002802}
2803
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002804static PyObject *
Tim Peters93b2cc42002-06-01 05:22:55 +00002805listiter_next(listiterobject *it)
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002806{
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002807 PyListObject *seq;
2808 PyObject *item;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002809
Tim Peters93b2cc42002-06-01 05:22:55 +00002810 assert(it != NULL);
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002811 seq = it->it_seq;
Guido van Rossum86103ae2002-07-16 20:07:32 +00002812 if (seq == NULL)
2813 return NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002814 assert(PyList_Check(seq));
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002815
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002816 if (it->it_index < PyList_GET_SIZE(seq)) {
Tim Peters93b2cc42002-06-01 05:22:55 +00002817 item = PyList_GET_ITEM(seq, it->it_index);
2818 ++it->it_index;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002819 Py_INCREF(item);
2820 return item;
2821 }
Guido van Rossum86103ae2002-07-16 20:07:32 +00002822
2823 Py_DECREF(seq);
2824 it->it_seq = NULL;
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002825 return NULL;
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002826}
2827
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002828static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +00002829listiter_len(listiterobject *it)
2830{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002831 Py_ssize_t len;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002832 if (it->it_seq) {
2833 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2834 if (len >= 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +00002835 return PyInt_FromSsize_t(len);
Raymond Hettinger40a03822004-04-12 13:05:09 +00002836 }
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002837 return PyInt_FromLong(0);
Raymond Hettinger435bf582004-03-18 22:43:10 +00002838}
Anthony Baxter377be112006-04-11 06:54:30 +00002839/*********************** List Reverse Iterator **************************/
Raymond Hettinger435bf582004-03-18 22:43:10 +00002840
Anthony Baxter377be112006-04-11 06:54:30 +00002841typedef struct {
2842 PyObject_HEAD
2843 Py_ssize_t it_index;
2844 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2845} listreviterobject;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002846
Anthony Baxter377be112006-04-11 06:54:30 +00002847static PyObject *list_reversed(PyListObject *, PyObject *);
2848static void listreviter_dealloc(listreviterobject *);
2849static int listreviter_traverse(listreviterobject *, visitproc, void *);
2850static PyObject *listreviter_next(listreviterobject *);
2851static Py_ssize_t listreviter_len(listreviterobject *);
2852
2853static PySequenceMethods listreviter_as_sequence = {
2854 (lenfunc)listreviter_len, /* sq_length */
2855 0, /* sq_concat */
Raymond Hettinger435bf582004-03-18 22:43:10 +00002856};
2857
Anthony Baxter377be112006-04-11 06:54:30 +00002858PyTypeObject PyListRevIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002859 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Anthony Baxter377be112006-04-11 06:54:30 +00002860 "listreverseiterator", /* tp_name */
2861 sizeof(listreviterobject), /* tp_basicsize */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002862 0, /* tp_itemsize */
2863 /* methods */
Anthony Baxter377be112006-04-11 06:54:30 +00002864 (destructor)listreviter_dealloc, /* tp_dealloc */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002865 0, /* tp_print */
2866 0, /* tp_getattr */
2867 0, /* tp_setattr */
2868 0, /* tp_compare */
2869 0, /* tp_repr */
2870 0, /* tp_as_number */
Anthony Baxter377be112006-04-11 06:54:30 +00002871 &listreviter_as_sequence, /* tp_as_sequence */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002872 0, /* tp_as_mapping */
2873 0, /* tp_hash */
2874 0, /* tp_call */
2875 0, /* tp_str */
2876 PyObject_GenericGetAttr, /* tp_getattro */
2877 0, /* tp_setattro */
2878 0, /* tp_as_buffer */
2879 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2880 0, /* tp_doc */
Anthony Baxter377be112006-04-11 06:54:30 +00002881 (traverseproc)listreviter_traverse, /* tp_traverse */
Guido van Rossum6b6272c2002-07-16 20:10:23 +00002882 0, /* tp_clear */
2883 0, /* tp_richcompare */
2884 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002885 PyObject_SelfIter, /* tp_iter */
Anthony Baxter377be112006-04-11 06:54:30 +00002886 (iternextfunc)listreviter_next, /* tp_iternext */
2887 0,
Raymond Hettinger14bd6de2002-05-31 21:40:38 +00002888};
Raymond Hettinger1021c442003-11-07 15:38:09 +00002889
Raymond Hettinger1021c442003-11-07 15:38:09 +00002890static PyObject *
2891list_reversed(PyListObject *seq, PyObject *unused)
2892{
2893 listreviterobject *it;
2894
2895 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2896 if (it == NULL)
2897 return NULL;
2898 assert(PyList_Check(seq));
2899 it->it_index = PyList_GET_SIZE(seq) - 1;
2900 Py_INCREF(seq);
2901 it->it_seq = seq;
2902 PyObject_GC_Track(it);
2903 return (PyObject *)it;
2904}
2905
2906static void
2907listreviter_dealloc(listreviterobject *it)
2908{
2909 PyObject_GC_UnTrack(it);
2910 Py_XDECREF(it->it_seq);
2911 PyObject_GC_Del(it);
2912}
2913
2914static int
2915listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2916{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002917 Py_VISIT(it->it_seq);
2918 return 0;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002919}
2920
2921static PyObject *
2922listreviter_next(listreviterobject *it)
2923{
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002924 PyObject *item;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002925 Py_ssize_t index = it->it_index;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002926 PyListObject *seq = it->it_seq;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002927
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002928 if (index>=0 && index < PyList_GET_SIZE(seq)) {
2929 item = PyList_GET_ITEM(seq, index);
Raymond Hettinger1021c442003-11-07 15:38:09 +00002930 it->it_index--;
2931 Py_INCREF(item);
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002932 return item;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002933 }
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002934 it->it_index = -1;
2935 if (seq != NULL) {
2936 it->it_seq = NULL;
2937 Py_DECREF(seq);
2938 }
2939 return NULL;
Raymond Hettinger1021c442003-11-07 15:38:09 +00002940}
2941
Martin v. Löwis18e16552006-02-15 17:27:45 +00002942static Py_ssize_t
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002943listreviter_len(listreviterobject *it)
2944{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002945 Py_ssize_t len = it->it_index + 1;
Raymond Hettinger40a03822004-04-12 13:05:09 +00002946 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
2947 return 0;
2948 return len;
Raymond Hettingeref9bf402004-03-10 10:10:42 +00002949}
2950