blob: b874af9f543cfb72e96e9ebf8ec831177268e882 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* List object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
5
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00006#ifdef STDC_HEADERS
7#include <stddef.h>
8#else
9#include <sys/types.h> /* For size_t */
10#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Guido van Rossumc0b618a1997-05-02 03:12:38 +000012#define ROUNDUP(n, PyTryBlock) \
13 ((((n)+(PyTryBlock)-1)/(PyTryBlock))*(PyTryBlock))
Guido van Rossuma46d51d1995-01-26 22:59:43 +000014
15static int
Fred Drakea2f55112000-07-09 15:16:51 +000016roundupsize(int n)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000017{
18 if (n < 500)
19 return ROUNDUP(n, 10);
20 else
21 return ROUNDUP(n, 100);
22}
23
Guido van Rossuma27d1121997-08-25 18:36:23 +000024#define NRESIZE(var, type, nitems) PyMem_RESIZE(var, type, roundupsize(nitems))
Guido van Rossuma46d51d1995-01-26 22:59:43 +000025
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000027PyList_New(int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028{
29 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000030 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000031 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034 return NULL;
35 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000037 /* Check for overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038 if (nbytes / sizeof(PyObject *) != (size_t)size) {
39 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000040 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000041 /* PyObject_NewVar is inlined */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +000042 op = (PyListObject *) PyObject_MALLOC(sizeof(PyListObject)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000043 + PyGC_HEAD_SIZE);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000047 op = (PyListObject *) PyObject_FROM_GC(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 if (size <= 0) {
49 op->ob_item = NULL;
50 }
51 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +000052 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 if (op->ob_item == NULL) {
Vladimir Marangozov467a67e2000-07-15 03:31:31 +000054 PyObject_FREE(PyObject_AS_GC(op));
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 }
57 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000058 PyObject_INIT_VAR(op, &PyList_Type, size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 for (i = 0; i < size; i++)
60 op->ob_item[i] = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000061 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063}
64
65int
Fred Drakea2f55112000-07-09 15:16:51 +000066PyList_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 if (!PyList_Check(op)) {
69 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 return -1;
71 }
72 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074}
75
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +000077
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000079PyList_GetItem(PyObject *op, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 if (!PyList_Check(op)) {
82 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083 return NULL;
84 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +000086 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 indexerr = PyString_FromString(
88 "list index out of range");
89 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 return NULL;
91 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093}
94
95int
Fred Drakea2f55112000-07-09 15:16:51 +000096PyList_SetItem(register PyObject *op, register int i,
97 register PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 register PyObject *olditem;
100 register PyObject **p;
101 if (!PyList_Check(op)) {
102 Py_XDECREF(newitem);
103 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000104 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
107 Py_XDECREF(newitem);
108 PyErr_SetString(PyExc_IndexError,
109 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000110 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000113 olditem = *p;
114 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return 0;
117}
118
119static int
Fred Drakea2f55112000-07-09 15:16:51 +0000120ins1(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
122 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000124 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000126 return -1;
127 }
Trent Micka5846642000-08-13 22:47:45 +0000128 if (self->ob_size == INT_MAX) {
129 PyErr_SetString(PyExc_OverflowError,
130 "cannot add more objects to list");
131 return -1;
132 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133 items = self->ob_item;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 NRESIZE(items, PyObject *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000135 if (items == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000137 return -1;
138 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 if (where < 0)
140 where = 0;
141 if (where > self->ob_size)
142 where = self->ob_size;
143 for (i = self->ob_size; --i >= where; )
144 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 items[where] = v;
147 self->ob_item = items;
148 self->ob_size++;
149 return 0;
150}
151
152int
Fred Drakea2f55112000-07-09 15:16:51 +0000153PyList_Insert(PyObject *op, int where, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 if (!PyList_Check(op)) {
156 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000157 return -1;
158 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160}
161
162int
Fred Drakea2f55112000-07-09 15:16:51 +0000163PyList_Append(PyObject *op, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 if (!PyList_Check(op)) {
166 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000167 return -1;
168 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 return ins1((PyListObject *)op,
170 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171}
172
173/* Methods */
174
175static void
Fred Drakea2f55112000-07-09 15:16:51 +0000176list_dealloc(PyListObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177{
178 int i;
Guido van Rossumd724b232000-03-13 16:01:29 +0000179 Py_TRASHCAN_SAFE_BEGIN(op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000180 PyObject_GC_Fini(op);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000181 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000182 /* Do it backwards, for Christian Tismer.
183 There's a simple test case where somehow this reduces
184 thrashing when a *very* large list is created and
185 immediately deleted. */
186 i = op->ob_size;
187 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000189 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000190 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000191 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000192 op = (PyListObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000193 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000194 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195}
196
Guido van Rossum90933611991-06-07 16:10:43 +0000197static int
Fred Drakea2f55112000-07-09 15:16:51 +0000198list_print(PyListObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199{
200 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000201
202 i = Py_ReprEnter((PyObject*)op);
203 if (i != 0) {
204 if (i < 0)
205 return i;
206 fprintf(fp, "[...]");
207 return 0;
208 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000210 for (i = 0; i < op->ob_size; i++) {
211 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000213 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
214 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000215 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000216 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217 }
218 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000219 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000220 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221}
222
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000224list_repr(PyListObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000228
229 i = Py_ReprEnter((PyObject*)v);
230 if (i != 0) {
231 if (i > 0)
232 return PyString_FromString("[...]");
233 return NULL;
234 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 s = PyString_FromString("[");
236 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 for (i = 0; i < v->ob_size && s != NULL; i++) {
238 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 PyString_Concat(&s, comma);
240 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 Py_XDECREF(comma);
243 PyString_ConcatAndDel(&s, PyString_FromString("]"));
Guido van Rossumfb376de1998-04-10 22:47:27 +0000244 Py_ReprLeave((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 return s;
246}
247
248static int
Fred Drakea2f55112000-07-09 15:16:51 +0000249list_compare(PyListObject *v, PyListObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 int i;
Jack Jansene9791602000-08-22 21:51:22 +0000252
Guido van Rossumae621ff1998-05-28 20:18:46 +0000253 for (i = 0; i < v->ob_size && i < w->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255 if (cmp != 0)
256 return cmp;
257 }
258 return v->ob_size - w->ob_size;
259}
260
261static int
Fred Drakea2f55112000-07-09 15:16:51 +0000262list_length(PyListObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263{
264 return a->ob_size;
265}
266
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000267
268
269static int
Fred Drakea2f55112000-07-09 15:16:51 +0000270list_contains(PyListObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000271{
272 int i, cmp;
273
274 for (i = 0; i < a->ob_size; ++i) {
275 cmp = PyObject_Compare(el, PyList_GET_ITEM(a, i));
276 if (cmp == 0)
277 return 1;
278 if (PyErr_Occurred())
279 return -1;
280 }
281 return 0;
282}
283
284
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000286list_item(PyListObject *a, int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287{
288 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000289 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290 indexerr = PyString_FromString(
291 "list index out of range");
292 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 return NULL;
294 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 return a->ob_item[i];
297}
298
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000300list_slice(PyListObject *a, int ilow, int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 int i;
304 if (ilow < 0)
305 ilow = 0;
306 else if (ilow > a->ob_size)
307 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 if (ihigh < ilow)
309 ihigh = ilow;
310 else if (ihigh > a->ob_size)
311 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 if (np == NULL)
314 return NULL;
315 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 PyObject *v = a->ob_item[i];
317 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 np->ob_item[i - ilow] = v;
319 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321}
322
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000324PyList_GetSlice(PyObject *a, int ilow, int ihigh)
Guido van Rossum234f9421993-06-17 12:35:49 +0000325{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 if (!PyList_Check(a)) {
327 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000328 return NULL;
329 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000331}
332
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000334list_concat(PyListObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335{
336 int size;
337 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338 PyListObject *np;
339 if (!PyList_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000340 PyErr_Format(PyExc_TypeError,
Fred Drake914a2ed2000-06-01 14:31:03 +0000341 "can only concatenate list (not \"%.200s\") to list",
342 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 return NULL;
344 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000349 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350 }
351 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 PyObject *v = a->ob_item[i];
353 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354 np->ob_item[i] = v;
355 }
356 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 PyObject *v = b->ob_item[i];
358 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359 np->ob_item[i + a->ob_size] = v;
360 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362#undef b
363}
364
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000366list_repeat(PyListObject *a, int n)
Guido van Rossumed98d481991-03-06 13:07:53 +0000367{
368 int i, j;
369 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 PyListObject *np;
371 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000372 if (n < 0)
373 n = 0;
374 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000376 if (np == NULL)
377 return NULL;
378 p = np->ob_item;
379 for (i = 0; i < n; i++) {
380 for (j = 0; j < a->ob_size; j++) {
381 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000383 p++;
384 }
385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000387}
388
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389static int
Fred Drakea2f55112000-07-09 15:16:51 +0000390list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000392 /* Because [X]DECREF can recursively invoke list operations on
393 this list, we must postpone all [X]DECREF activity until
394 after the list is back in its canonical shape. Therefore
395 we must allocate an additional array, 'recycle', into which
396 we temporarily copy the items that are deleted from the
397 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 PyObject **recycle, **p;
399 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400 int n; /* Size of replacement list */
401 int d; /* Change in size */
402 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404 if (v == NULL)
405 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000408 if (a == b) {
409 /* Special case "a[i:j] = a" -- copy b first */
410 int ret;
411 v = list_slice(b, 0, n);
412 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000414 return ret;
415 }
416 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000417 else {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000418 PyErr_Format(PyExc_TypeError,
419 "must assign list (not \"%.200s\") to slice",
420 v->ob_type->tp_name);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000421 return -1;
422 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423 if (ilow < 0)
424 ilow = 0;
425 else if (ilow > a->ob_size)
426 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 if (ihigh < ilow)
428 ihigh = ilow;
429 else if (ihigh > a->ob_size)
430 ihigh = a->ob_size;
431 item = a->ob_item;
432 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000433 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000435 else
436 p = recycle = NULL;
437 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000439 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440 if (d < 0) {
441 for (/*k = ihigh*/; k < a->ob_size; k++)
442 item[k+d] = item[k];
443 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445 a->ob_item = item;
446 }
447 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000448 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000450 if (item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000451 if (recycle != NULL)
452 PyMem_DEL(recycle);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000454 return -1;
455 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456 for (k = a->ob_size; --k >= ihigh; )
457 item[k+d] = item[k];
458 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000459 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 a->ob_item = item;
461 a->ob_size += d;
462 }
463 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 PyObject *w = b->ob_item[k];
465 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466 item[ilow] = w;
467 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000468 if (recycle) {
469 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 Py_XDECREF(*p);
471 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000472 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 return 0;
474#undef b
475}
476
Guido van Rossum234f9421993-06-17 12:35:49 +0000477int
Fred Drakea2f55112000-07-09 15:16:51 +0000478PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum234f9421993-06-17 12:35:49 +0000479{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 if (!PyList_Check(a)) {
481 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000482 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000483 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000485}
486
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000487static PyObject *
488list_inplace_repeat(PyListObject *self, int n)
489{
490 PyObject **items;
491 int size, i, j;
492
493
494 size = PyList_GET_SIZE(self);
495 if (size == 0) {
496 Py_INCREF(self);
497 return (PyObject *)self;
498 }
499
500 items = self->ob_item;
501
502 if (n < 1) {
503 self->ob_item = NULL;
504 self->ob_size = 0;
505 for (i = 0; i < size; i++)
506 Py_XDECREF(items[i]);
507 PyMem_DEL(items);
508 Py_INCREF(self);
509 return (PyObject *)self;
510 }
511
512 NRESIZE(items, PyObject*, size*n);
513 if (items == NULL) {
514 PyErr_NoMemory();
515 goto finally;
516 }
517 self->ob_item = items;
518 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
519 for (j = 0; j < size; j++) {
520 PyObject *o = PyList_GET_ITEM(self, j);
521 Py_INCREF(o);
522 PyList_SET_ITEM(self, self->ob_size++, o);
523 }
524 }
525 Py_INCREF(self);
526 return (PyObject *)self;
527 finally:
528 return NULL;
529}
530
Guido van Rossum4a450d01991-04-03 19:05:18 +0000531static int
Fred Drakea2f55112000-07-09 15:16:51 +0000532list_ass_item(PyListObject *a, int i, PyObject *v)
Guido van Rossum4a450d01991-04-03 19:05:18 +0000533{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000535 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536 PyErr_SetString(PyExc_IndexError,
537 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000538 return -1;
539 }
540 if (v == NULL)
541 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000543 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000544 a->ob_item[i] = v;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000546 return 0;
547}
548
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000550ins(PyListObject *self, int where, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551{
552 if (ins1(self, where, v) != 0)
553 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 Py_INCREF(Py_None);
555 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556}
557
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000559listinsert(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560{
561 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000563 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000565 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566}
567
Guido van Rossumef93b872000-03-13 15:41:59 +0000568/* Define NO_STRICT_LIST_APPEND to enable multi-argument append() */
569
570#ifndef NO_STRICT_LIST_APPEND
571#define PyArg_ParseTuple_Compat1 PyArg_ParseTuple
572#else
573#define PyArg_ParseTuple_Compat1(args, format, ret) \
574( \
575 PyTuple_GET_SIZE(args) > 1 ? (*ret = args, 1) : \
576 PyTuple_GET_SIZE(args) == 1 ? (*ret = PyTuple_GET_ITEM(args, 0), 1) : \
577 PyArg_ParseTuple(args, format, ret) \
578)
579#endif
580
581
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000583listappend(PyListObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000584{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 PyObject *v;
Guido van Rossumef93b872000-03-13 15:41:59 +0000586 if (!PyArg_ParseTuple_Compat1(args, "O:append", &v))
Guido van Rossumbf80e541993-02-08 15:49:17 +0000587 return NULL;
588 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589}
590
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000591static int
592listextend_internal(PyListObject *self, PyObject *b)
Barry Warsawdedf6d61998-10-09 16:37:25 +0000593{
Barry Warsawdedf6d61998-10-09 16:37:25 +0000594 PyObject **items;
595 int selflen = PyList_GET_SIZE(self);
596 int blen;
597 register int i;
598
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000599 if (PyObject_Size(b) == 0)
Barry Warsawdedf6d61998-10-09 16:37:25 +0000600 /* short circuit when b is empty */
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000601 return 0;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000602
Barry Warsawdedf6d61998-10-09 16:37:25 +0000603 if (self == (PyListObject*)b) {
604 /* as in list_ass_slice() we must special case the
605 * situation: a.extend(a)
606 *
607 * XXX: I think this way ought to be faster than using
608 * list_slice() the way list_ass_slice() does.
609 */
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000610 Py_DECREF(b);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000611 b = PyList_New(selflen);
612 if (!b)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000613 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000614 for (i = 0; i < selflen; i++) {
615 PyObject *o = PyList_GET_ITEM(self, i);
616 Py_INCREF(o);
617 PyList_SET_ITEM(b, i, o);
618 }
619 }
Barry Warsawdedf6d61998-10-09 16:37:25 +0000620
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000621 blen = PyObject_Size(b);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000622
Barry Warsawdedf6d61998-10-09 16:37:25 +0000623 /* resize a using idiom */
624 items = self->ob_item;
625 NRESIZE(items, PyObject*, selflen + blen);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000626 if (items == NULL) {
Barry Warsawdedf6d61998-10-09 16:37:25 +0000627 PyErr_NoMemory();
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000628 Py_DECREF(b);
629 return -1;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000630 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000631
Barry Warsawdedf6d61998-10-09 16:37:25 +0000632 self->ob_item = items;
633
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000634 /* populate the end of self with b's items */
Barry Warsawdedf6d61998-10-09 16:37:25 +0000635 for (i = 0; i < blen; i++) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000636 PyObject *o = PySequence_Fast_GET_ITEM(b, i);
Barry Warsawdedf6d61998-10-09 16:37:25 +0000637 Py_INCREF(o);
638 PyList_SET_ITEM(self, self->ob_size++, o);
639 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +0000640 Py_DECREF(b);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000641 return 0;
Barry Warsawdedf6d61998-10-09 16:37:25 +0000642}
643
644
645static PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000646list_inplace_concat(PyListObject *self, PyObject *other)
647{
648 other = PySequence_Fast(other, "argument to += must be a sequence");
649 if (!other)
650 return NULL;
651
652 if (listextend_internal(self, other) < 0)
653 return NULL;
654
655 Py_INCREF(self);
656 return (PyObject *)self;
657}
658
659static PyObject *
660listextend(PyListObject *self, PyObject *args)
661{
662
663 PyObject *b;
664
665 if (!PyArg_ParseTuple(args, "O:extend", &b))
666 return NULL;
667
668 b = PySequence_Fast(b, "list.extend() argument must be a sequence");
669 if (!b)
670 return NULL;
671
672 if (listextend_internal(self, b) < 0)
673 return NULL;
674
675 Py_INCREF(Py_None);
676 return Py_None;
677}
678
679static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000680listpop(PyListObject *self, PyObject *args)
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000681{
682 int i = -1;
683 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000684 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000685 return NULL;
686 if (self->ob_size == 0) {
687 /* Special-case most common failure cause */
688 PyErr_SetString(PyExc_IndexError, "pop from empty list");
689 return NULL;
690 }
691 if (i < 0)
692 i += self->ob_size;
693 if (i < 0 || i >= self->ob_size) {
694 PyErr_SetString(PyExc_IndexError, "pop index out of range");
695 return NULL;
696 }
697 v = self->ob_item[i];
698 Py_INCREF(v);
699 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
700 Py_DECREF(v);
701 return NULL;
702 }
703 return v;
704}
705
Guido van Rossum3f236de1996-12-10 23:55:39 +0000706/* New quicksort implementation for arrays of object pointers.
707 Thanks to discussions with Tim Peters. */
708
709/* CMPERROR is returned by our comparison function when an error
710 occurred. This is the largest negative integer (0x80000000 on a
711 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000712#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000713
714/* Comparison function. Takes care of calling a user-supplied
715 comparison function (any callable Python object). Calls the
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000716 standard comparison function, PyObject_Compare(), if the user-
717 supplied function is NULL. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000718
719static int
Fred Drakea2f55112000-07-09 15:16:51 +0000720docompare(PyObject *x, PyObject *y, PyObject *compare)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000721{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 PyObject *args, *res;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000723 int i;
724
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000725 if (compare == NULL) {
726 i = PyObject_Compare(x, y);
727 if (i && PyErr_Occurred())
728 i = CMPERROR;
729 return i;
730 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000731
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 args = Py_BuildValue("(OO)", x, y);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000733 if (args == NULL)
734 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 res = PyEval_CallObject(compare, args);
736 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000737 if (res == NULL)
738 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 if (!PyInt_Check(res)) {
740 Py_DECREF(res);
741 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000742 "comparison function must return int");
Guido van Rossum3f236de1996-12-10 23:55:39 +0000743 return CMPERROR;
744 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 i = PyInt_AsLong(res);
746 Py_DECREF(res);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000747 if (i < 0)
748 return -1;
749 if (i > 0)
750 return 1;
751 return 0;
752}
753
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000754/* MINSIZE is the smallest array that will get a full-blown samplesort
755 treatment; smaller arrays are sorted using binary insertion. It must
756 be at least 7 for the samplesort implementation to work. Binary
757 insertion does fewer compares, but can suffer O(N**2) data movement.
758 The more expensive compares, the larger MINSIZE should be. */
759#define MINSIZE 100
760
761/* MINPARTITIONSIZE is the smallest array slice samplesort will bother to
762 partition; smaller slices are passed to binarysort. It must be at
763 least 2, and no larger than MINSIZE. Setting it higher reduces the #
764 of compares slowly, but increases the amount of data movement quickly.
765 The value here was chosen assuming a compare costs ~25x more than
766 swapping a pair of memory-resident pointers -- but under that assumption,
767 changing the value by a few dozen more or less has aggregate effect
768 under 1%. So the value is crucial, but not touchy <wink>. */
769#define MINPARTITIONSIZE 40
770
771/* MAXMERGE is the largest number of elements we'll always merge into
772 a known-to-be sorted chunk via binary insertion, regardless of the
773 size of that chunk. Given a chunk of N sorted elements, and a group
774 of K unknowns, the largest K for which it's better to do insertion
775 (than a full-blown sort) is a complicated function of N and K mostly
776 involving the expected number of compares and data moves under each
777 approach, and the relative cost of those operations on a specific
778 architecure. The fixed value here is conservative, and should be a
779 clear win regardless of architecture or N. */
780#define MAXMERGE 15
Guido van Rossum3f236de1996-12-10 23:55:39 +0000781
Guido van Rossum3f236de1996-12-10 23:55:39 +0000782/* STACKSIZE is the size of our work stack. A rough estimate is that
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000783 this allows us to sort arrays of size N where
784 N / ln(N) = MINPARTITIONSIZE * 2**STACKSIZE, so 60 is more than enough
785 for arrays of size 2**64. Because we push the biggest partition
786 first, the worst case occurs when all subarrays are always partitioned
787 exactly in two. */
788#define STACKSIZE 60
Guido van Rossum3f236de1996-12-10 23:55:39 +0000789
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000790
791#define SETK(X,Y) if ((k = docompare(X,Y,compare))==CMPERROR) goto fail
792
793/* binarysort is the best method for sorting small arrays: it does
794 few compares, but can do data movement quadratic in the number of
795 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000796 [lo, hi) is a contiguous slice of a list, and is sorted via
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000797 binary insertion.
798 On entry, must have lo <= start <= hi, and that [lo, start) is already
799 sorted (pass start == lo if you don't know!).
800 If docompare complains (returns CMPERROR) return -1, else 0.
801 Even in case of error, the output slice will be some permutation of
802 the input (nothing is lost or duplicated).
803*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000804
805static int
Fred Drakea2f55112000-07-09 15:16:51 +0000806binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
807 /* compare -- comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000808{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000809 /* assert lo <= start <= hi
810 assert [lo, start) is sorted */
811 register int k;
812 register PyObject **l, **p, **r;
813 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000814
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000815 if (lo == start)
816 ++start;
817 for (; start < hi; ++start) {
818 /* set l to where *start belongs */
819 l = lo;
820 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000821 pivot = *r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000822 do {
823 p = l + ((r - l) >> 1);
824 SETK(pivot, *p);
825 if (k < 0)
826 r = p;
827 else
828 l = p + 1;
829 } while (l < r);
830 /* Pivot should go at l -- slide over to make room.
831 Caution: using memmove is much slower under MSVC 5;
832 we're not usually moving many slots. */
833 for (p = start; p > l; --p)
834 *p = *(p-1);
835 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000836 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000837 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000838
839 fail:
840 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000841}
842
843/* samplesortslice is the sorting workhorse.
Guido van Rossum42812581998-06-17 14:15:44 +0000844 [lo, hi) is a contiguous slice of a list, to be sorted in place.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000845 On entry, must have lo <= hi,
846 If docompare complains (returns CMPERROR) return -1, else 0.
847 Even in case of error, the output slice will be some permutation of
848 the input (nothing is lost or duplicated).
849
850 samplesort is basically quicksort on steroids: a power of 2 close
851 to n/ln(n) is computed, and that many elements (less 1) are picked at
852 random from the array and sorted. These 2**k - 1 elements are then
853 used as preselected pivots for an equal number of quicksort
854 partitioning steps, partitioning the slice into 2**k chunks each of
855 size about ln(n). These small final chunks are then usually handled
856 by binarysort. Note that when k=1, this is roughly the same as an
857 ordinary quicksort using a random pivot, and when k=2 this is roughly
858 a median-of-3 quicksort. From that view, using k ~= lg(n/ln(n)) makes
859 this a "median of n/ln(n)" quicksort. You can also view it as a kind
860 of bucket sort, where 2**k-1 bucket boundaries are picked dynamically.
861
862 The large number of samples makes a quadratic-time case almost
863 impossible, and asymptotically drives the average-case number of
864 compares from quicksort's 2 N ln N (or 12/7 N ln N for the median-of-
865 3 variant) down to N lg N.
866
867 We also play lots of low-level tricks to cut the number of compares.
868
869 Very obscure: To avoid using extra memory, the PPs are stored in the
870 array and shuffled around as partitioning proceeds. At the start of a
871 partitioning step, we'll have 2**m-1 (for some m) PPs in sorted order,
872 adjacent (either on the left or the right!) to a chunk of X elements
873 that are to be partitioned: P X or X P. In either case we need to
874 shuffle things *in place* so that the 2**(m-1) smaller PPs are on the
875 left, followed by the PP to be used for this step (that's the middle
876 of the PPs), followed by X, followed by the 2**(m-1) larger PPs:
877 P X or X P -> Psmall pivot X Plarge
878 and the order of the PPs must not be altered. It can take a while
879 to realize this isn't trivial! It can take even longer <wink> to
880 understand why the simple code below works, using only 2**(m-1) swaps.
881 The key is that the order of the X elements isn't necessarily
882 preserved: X can end up as some cyclic permutation of its original
883 order. That's OK, because X is unsorted anyway. If the order of X
884 had to be preserved too, the simplest method I know of using O(1)
885 scratch storage requires len(X) + 2**(m-1) swaps, spread over 2 passes.
886 Since len(X) is typically several times larger than 2**(m-1), that
887 would slow things down.
888*/
889
890struct SamplesortStackNode {
891 /* Represents a slice of the array, from (& including) lo up
892 to (but excluding) hi. "extra" additional & adjacent elements
893 are pre-selected pivots (PPs), spanning [lo-extra, lo) if
894 extra > 0, or [hi, hi-extra) if extra < 0. The PPs are
895 already sorted, but nothing is known about the other elements
896 in [lo, hi). |extra| is always one less than a power of 2.
897 When extra is 0, we're out of PPs, and the slice must be
898 sorted by some other means. */
899 PyObject **lo;
900 PyObject **hi;
901 int extra;
902};
903
904/* The number of PPs we want is 2**k - 1, where 2**k is as close to
Guido van Rossum42812581998-06-17 14:15:44 +0000905 N / ln(N) as possible. So k ~= lg(N / ln(N)). Calling libm routines
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000906 is undesirable, so cutoff values are canned in the "cutoff" table
907 below: cutoff[i] is the smallest N such that k == CUTOFFBASE + i. */
908#define CUTOFFBASE 4
Guido van Rossum3aa23fd1999-01-14 19:01:53 +0000909static long cutoff[] = {
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000910 43, /* smallest N such that k == 4 */
911 106, /* etc */
912 250,
913 576,
914 1298,
915 2885,
916 6339,
917 13805,
918 29843,
919 64116,
920 137030,
921 291554,
922 617916,
923 1305130,
924 2748295,
925 5771662,
926 12091672,
927 25276798,
928 52734615,
929 109820537,
930 228324027,
931 473977813,
932 982548444, /* smallest N such that k == 26 */
933 2034159050 /* largest N that fits in signed 32-bit; k == 27 */
934};
935
936static int
Fred Drakea2f55112000-07-09 15:16:51 +0000937samplesortslice(PyObject **lo, PyObject **hi, PyObject *compare)
938 /* compare -- comparison function object, or NULL for default */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000939{
940 register PyObject **l, **r;
941 register PyObject *tmp, *pivot;
942 register int k;
943 int n, extra, top, extraOnRight;
944 struct SamplesortStackNode stack[STACKSIZE];
945
946 /* assert lo <= hi */
947 n = hi - lo;
948
949 /* ----------------------------------------------------------
950 * Special cases
951 * --------------------------------------------------------*/
952 if (n < 2)
953 return 0;
954
955 /* Set r to the largest value such that [lo,r) is sorted.
956 This catches the already-sorted case, the all-the-same
957 case, and the appended-a-few-elements-to-a-sorted-list case.
958 If the array is unsorted, we're very likely to get out of
959 the loop fast, so the test is cheap if it doesn't pay off.
960 */
961 /* assert lo < hi */
962 for (r = lo+1; r < hi; ++r) {
963 SETK(*r, *(r-1));
964 if (k < 0)
965 break;
966 }
967 /* [lo,r) is sorted, [r,hi) unknown. Get out cheap if there are
968 few unknowns, or few elements in total. */
969 if (hi - r <= MAXMERGE || n < MINSIZE)
Guido van Rossum42812581998-06-17 14:15:44 +0000970 return binarysort(lo, hi, r, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000971
972 /* Check for the array already being reverse-sorted. Typical
973 benchmark-driven silliness <wink>. */
974 /* assert lo < hi */
975 for (r = lo+1; r < hi; ++r) {
976 SETK(*(r-1), *r);
977 if (k < 0)
978 break;
979 }
980 if (hi - r <= MAXMERGE) {
981 /* Reverse the reversed prefix, then insert the tail */
982 PyObject **originalr = r;
983 l = lo;
984 do {
985 --r;
986 tmp = *l; *l = *r; *r = tmp;
987 ++l;
988 } while (l < r);
Guido van Rossum42812581998-06-17 14:15:44 +0000989 return binarysort(lo, hi, originalr, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000990 }
991
992 /* ----------------------------------------------------------
993 * Normal case setup: a large array without obvious pattern.
994 * --------------------------------------------------------*/
995
996 /* extra := a power of 2 ~= n/ln(n), less 1.
997 First find the smallest extra s.t. n < cutoff[extra] */
998 for (extra = 0;
999 extra < sizeof(cutoff) / sizeof(cutoff[0]);
1000 ++extra) {
1001 if (n < cutoff[extra])
1002 break;
1003 /* note that if we fall out of the loop, the value of
1004 extra still makes *sense*, but may be smaller than
1005 we would like (but the array has more than ~= 2**31
1006 elements in this case!) */
1007 }
1008 /* Now k == extra - 1 + CUTOFFBASE. The smallest value k can
1009 have is CUTOFFBASE-1, so
1010 assert MINSIZE >= 2**(CUTOFFBASE-1) - 1 */
1011 extra = (1 << (extra - 1 + CUTOFFBASE)) - 1;
1012 /* assert extra > 0 and n >= extra */
1013
1014 /* Swap that many values to the start of the array. The
1015 selection of elements is pseudo-random, but the same on
1016 every run (this is intentional! timing algorithm changes is
1017 a pain if timing varies across runs). */
1018 {
1019 unsigned int seed = n / extra; /* arbitrary */
1020 unsigned int i;
1021 for (i = 0; i < (unsigned)extra; ++i) {
1022 /* j := random int in [i, n) */
1023 unsigned int j;
1024 seed = seed * 69069 + 7;
1025 j = i + seed % (n - i);
1026 tmp = lo[i]; lo[i] = lo[j]; lo[j] = tmp;
1027 }
1028 }
1029
1030 /* Recursively sort the preselected pivots. */
Guido van Rossum42812581998-06-17 14:15:44 +00001031 if (samplesortslice(lo, lo + extra, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001032 goto fail;
1033
1034 top = 0; /* index of available stack slot */
1035 lo += extra; /* point to first unknown */
1036 extraOnRight = 0; /* the PPs are at the left end */
1037
1038 /* ----------------------------------------------------------
1039 * Partition [lo, hi), and repeat until out of work.
1040 * --------------------------------------------------------*/
1041 for (;;) {
1042 /* assert lo <= hi, so n >= 0 */
1043 n = hi - lo;
1044
1045 /* We may not want, or may not be able, to partition:
1046 If n is small, it's quicker to insert.
1047 If extra is 0, we're out of pivots, and *must* use
1048 another method.
1049 */
1050 if (n < MINPARTITIONSIZE || extra == 0) {
1051 if (n >= MINSIZE) {
1052 /* assert extra == 0
1053 This is rare, since the average size
1054 of a final block is only about
1055 ln(original n). */
Guido van Rossum42812581998-06-17 14:15:44 +00001056 if (samplesortslice(lo, hi, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001057 goto fail;
1058 }
1059 else {
1060 /* Binary insertion should be quicker,
1061 and we can take advantage of the PPs
1062 already being sorted. */
1063 if (extraOnRight && extra) {
1064 /* swap the PPs to the left end */
1065 k = extra;
1066 do {
1067 tmp = *lo;
1068 *lo = *hi;
1069 *hi = tmp;
1070 ++lo; ++hi;
1071 } while (--k);
1072 }
1073 if (binarysort(lo - extra, hi, lo,
Guido van Rossum42812581998-06-17 14:15:44 +00001074 compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001075 goto fail;
1076 }
1077
1078 /* Find another slice to work on. */
1079 if (--top < 0)
1080 break; /* no more -- done! */
1081 lo = stack[top].lo;
1082 hi = stack[top].hi;
1083 extra = stack[top].extra;
1084 extraOnRight = 0;
1085 if (extra < 0) {
1086 extraOnRight = 1;
1087 extra = -extra;
1088 }
1089 continue;
1090 }
1091
1092 /* Pretend the PPs are indexed 0, 1, ..., extra-1.
1093 Then our preselected pivot is at (extra-1)/2, and we
1094 want to move the PPs before that to the left end of
1095 the slice, and the PPs after that to the right end.
1096 The following section changes extra, lo, hi, and the
1097 slice such that:
1098 [lo-extra, lo) contains the smaller PPs.
1099 *lo == our PP.
1100 (lo, hi) contains the unknown elements.
1101 [hi, hi+extra) contains the larger PPs.
1102 */
1103 k = extra >>= 1; /* num PPs to move */
1104 if (extraOnRight) {
1105 /* Swap the smaller PPs to the left end.
1106 Note that this loop actually moves k+1 items:
1107 the last is our PP */
1108 do {
1109 tmp = *lo; *lo = *hi; *hi = tmp;
1110 ++lo; ++hi;
1111 } while (k--);
1112 }
1113 else {
1114 /* Swap the larger PPs to the right end. */
1115 while (k--) {
1116 --lo; --hi;
1117 tmp = *lo; *lo = *hi; *hi = tmp;
1118 }
1119 }
1120 --lo; /* *lo is now our PP */
1121 pivot = *lo;
1122
1123 /* Now an almost-ordinary quicksort partition step.
1124 Note that most of the time is spent here!
1125 Only odd thing is that we partition into < and >=,
1126 instead of the usual <= and >=. This helps when
1127 there are lots of duplicates of different values,
1128 because it eventually tends to make subfiles
1129 "pure" (all duplicates), and we special-case for
1130 duplicates later. */
1131 l = lo + 1;
1132 r = hi - 1;
1133 /* assert lo < l < r < hi (small n weeded out above) */
1134
1135 do {
1136 /* slide l right, looking for key >= pivot */
1137 do {
1138 SETK(*l, pivot);
1139 if (k < 0)
1140 ++l;
1141 else
1142 break;
1143 } while (l < r);
1144
1145 /* slide r left, looking for key < pivot */
1146 while (l < r) {
Guido van Rossum42812581998-06-17 14:15:44 +00001147 register PyObject *rval = *r--;
1148 SETK(rval, pivot);
1149 if (k < 0) {
1150 /* swap and advance */
1151 r[1] = *l;
1152 *l++ = rval;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001153 break;
Guido van Rossum42812581998-06-17 14:15:44 +00001154 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001155 }
1156
1157 } while (l < r);
1158
1159 /* assert lo < r <= l < hi
1160 assert r == l or r+1 == l
1161 everything to the left of l is < pivot, and
1162 everything to the right of r is >= pivot */
1163
1164 if (l == r) {
1165 SETK(*r, pivot);
1166 if (k < 0)
1167 ++l;
1168 else
1169 --r;
1170 }
1171 /* assert lo <= r and r+1 == l and l <= hi
1172 assert r == lo or a[r] < pivot
1173 assert a[lo] is pivot
1174 assert l == hi or a[l] >= pivot
1175 Swap the pivot into "the middle", so we can henceforth
1176 ignore it.
1177 */
1178 *lo = *r;
1179 *r = pivot;
1180
1181 /* The following is true now, & will be preserved:
1182 All in [lo,r) are < pivot
1183 All in [r,l) == pivot (& so can be ignored)
1184 All in [l,hi) are >= pivot */
1185
1186 /* Check for duplicates of the pivot. One compare is
1187 wasted if there are no duplicates, but can win big
1188 when there are.
1189 Tricky: we're sticking to "<" compares, so deduce
1190 equality indirectly. We know pivot <= *l, so they're
1191 equal iff not pivot < *l.
1192 */
1193 while (l < hi) {
1194 /* pivot <= *l known */
1195 SETK(pivot, *l);
1196 if (k < 0)
1197 break;
1198 else
1199 /* <= and not < implies == */
1200 ++l;
1201 }
1202
1203 /* assert lo <= r < l <= hi
1204 Partitions are [lo, r) and [l, hi) */
1205
1206 /* push fattest first; remember we still have extra PPs
1207 to the left of the left chunk and to the right of
1208 the right chunk! */
1209 /* assert top < STACKSIZE */
1210 if (r - lo <= hi - l) {
1211 /* second is bigger */
1212 stack[top].lo = l;
1213 stack[top].hi = hi;
1214 stack[top].extra = -extra;
1215 hi = r;
1216 extraOnRight = 0;
1217 }
1218 else {
1219 /* first is bigger */
1220 stack[top].lo = lo;
1221 stack[top].hi = r;
1222 stack[top].extra = extra;
1223 lo = l;
1224 extraOnRight = 1;
1225 }
1226 ++top;
1227
1228 } /* end of partitioning loop */
1229
1230 return 0;
1231
1232 fail:
1233 return -1;
1234}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001235
1236#undef SETK
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001237
1238staticforward PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001239
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001240static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001241listsort(PyListObject *self, PyObject *args)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001242{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001243 int err;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001244 PyObject *compare = NULL;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001245
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001246 if (args != NULL) {
Guido van Rossumc00a9382000-02-24 21:48:29 +00001247 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001248 return NULL;
1249 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001250 self->ob_type = &immutable_list_type;
1251 err = samplesortslice(self->ob_item,
1252 self->ob_item + self->ob_size,
Guido van Rossum42812581998-06-17 14:15:44 +00001253 compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001254 self->ob_type = &PyList_Type;
1255 if (err < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001256 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 Py_INCREF(Py_None);
1258 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001259}
1260
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001261int
Fred Drakea2f55112000-07-09 15:16:51 +00001262PyList_Sort(PyObject *v)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001263{
1264 if (v == NULL || !PyList_Check(v)) {
1265 PyErr_BadInternalCall();
1266 return -1;
1267 }
1268 v = listsort((PyListObject *)v, (PyObject *)NULL);
1269 if (v == NULL)
1270 return -1;
1271 Py_DECREF(v);
1272 return 0;
1273}
1274
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001276listreverse(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00001277{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 register PyObject **p, **q;
1279 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +00001280
Guido van Rossumc00a9382000-02-24 21:48:29 +00001281 if (!PyArg_ParseTuple(args, ":reverse"))
Guido van Rossumed98d481991-03-06 13:07:53 +00001282 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001283
1284 if (self->ob_size > 1) {
1285 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
1286 p < q; p++, q--) {
1287 tmp = *p;
1288 *p = *q;
1289 *q = tmp;
1290 }
1291 }
1292
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293 Py_INCREF(Py_None);
1294 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001295}
1296
Guido van Rossum84c76f51990-10-30 13:32:20 +00001297int
Fred Drakea2f55112000-07-09 15:16:51 +00001298PyList_Reverse(PyObject *v)
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001299{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 if (v == NULL || !PyList_Check(v)) {
1301 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001302 return -1;
1303 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 v = listreverse((PyListObject *)v, (PyObject *)NULL);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001305 if (v == NULL)
1306 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 Py_DECREF(v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001308 return 0;
1309}
1310
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001312PyList_AsTuple(PyObject *v)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001313{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 PyObject *w;
1315 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001316 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 if (v == NULL || !PyList_Check(v)) {
1318 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001319 return NULL;
1320 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321 n = ((PyListObject *)v)->ob_size;
1322 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001323 if (w == NULL)
1324 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 p = ((PyTupleObject *)w)->ob_item;
Thomas Wouters334fb892000-07-25 12:56:38 +00001326 memcpy((void *)p,
1327 (void *)((PyListObject *)v)->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001329 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001331 p++;
1332 }
1333 return w;
1334}
1335
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001337listindex(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00001338{
1339 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001340 PyObject *v;
1341
Guido van Rossumef93b872000-03-13 15:41:59 +00001342 if (!PyArg_ParseTuple_Compat1(args, "O:index", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001343 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001344 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001345 if (PyObject_Compare(self->ob_item[i], v) == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001347 if (PyErr_Occurred())
1348 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001349 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001351 return NULL;
1352}
1353
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001355listcount(PyListObject *self, PyObject *args)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001356{
1357 int count = 0;
1358 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001359 PyObject *v;
1360
Guido van Rossumef93b872000-03-13 15:41:59 +00001361 if (!PyArg_ParseTuple_Compat1(args, "O:count", &v))
Guido van Rossume6f7d181991-10-20 20:20:40 +00001362 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001363 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001364 if (PyObject_Compare(self->ob_item[i], v) == 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001365 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001366 if (PyErr_Occurred())
1367 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001368 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001370}
1371
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001373listremove(PyListObject *self, PyObject *args)
Guido van Rossumed98d481991-03-06 13:07:53 +00001374{
1375 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001376 PyObject *v;
1377
Guido van Rossumef93b872000-03-13 15:41:59 +00001378 if (!PyArg_ParseTuple_Compat1(args, "O:remove", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001379 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001380 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001381 if (PyObject_Compare(self->ob_item[i], v) == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 if (list_ass_slice(self, i, i+1,
1383 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001384 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 Py_INCREF(Py_None);
1386 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001387 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001388 if (PyErr_Occurred())
1389 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001390 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001392 return NULL;
1393}
1394
Jeremy Hylton8caad492000-06-23 14:18:11 +00001395static int
1396list_traverse(PyListObject *o, visitproc visit, void *arg)
1397{
1398 int i, err;
1399 PyObject *x;
1400
1401 for (i = o->ob_size; --i >= 0; ) {
1402 x = o->ob_item[i];
1403 if (x != NULL) {
1404 err = visit(x, arg);
1405 if (err)
1406 return err;
1407 }
1408 }
1409 return 0;
1410}
1411
1412static int
1413list_clear(PyListObject *lp)
1414{
1415 (void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
1416 return 0;
1417}
1418
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001419static char append_doc[] =
1420"L.append(object) -- append object to end";
Barry Warsawdedf6d61998-10-09 16:37:25 +00001421static char extend_doc[] =
1422"L.extend(list) -- extend list by appending list elements";
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001423static char insert_doc[] =
1424"L.insert(index, object) -- insert object before index";
1425static char pop_doc[] =
1426"L.pop([index]) -> item -- remove and return item at index (default last)";
1427static char remove_doc[] =
1428"L.remove(value) -- remove first occurrence of value";
1429static char index_doc[] =
1430"L.index(value) -> integer -- return index of first occurrence of value";
1431static char count_doc[] =
1432"L.count(value) -> integer -- return number of occurrences of value";
1433static char reverse_doc[] =
1434"L.reverse() -- reverse *IN PLACE*";
1435static char sort_doc[] =
1436"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1";
1437
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438static PyMethodDef list_methods[] = {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001439 {"append", (PyCFunction)listappend, 1, append_doc},
1440 {"insert", (PyCFunction)listinsert, 1, insert_doc},
Barry Warsawdedf6d61998-10-09 16:37:25 +00001441 {"extend", (PyCFunction)listextend, 1, extend_doc},
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001442 {"pop", (PyCFunction)listpop, 1, pop_doc},
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001443 {"remove", (PyCFunction)listremove, 1, remove_doc},
1444 {"index", (PyCFunction)listindex, 1, index_doc},
1445 {"count", (PyCFunction)listcount, 1, count_doc},
1446 {"reverse", (PyCFunction)listreverse, 1, reverse_doc},
1447 {"sort", (PyCFunction)listsort, 1, sort_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001448 {NULL, NULL} /* sentinel */
1449};
1450
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001452list_getattr(PyListObject *f, char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001453{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454 return Py_FindMethod(list_methods, (PyObject *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001455}
1456
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457static PySequenceMethods list_as_sequence = {
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001458 (inquiry)list_length, /*sq_length*/
1459 (binaryfunc)list_concat, /*sq_concat*/
1460 (intargfunc)list_repeat, /*sq_repeat*/
1461 (intargfunc)list_item, /*sq_item*/
1462 (intintargfunc)list_slice, /*sq_slice*/
1463 (intobjargproc)list_ass_item, /*sq_ass_item*/
1464 (intintobjargproc)list_ass_slice, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +00001465 (objobjproc)list_contains, /*sq_contains*/
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001466 (binaryfunc)list_inplace_concat, /*sq_inplace_concat*/
1467 (intargfunc)list_inplace_repeat, /*sq_inplace_repeat*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001468};
1469
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470PyTypeObject PyList_Type = {
1471 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001472 0,
1473 "list",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001474 sizeof(PyListObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001475 0,
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001476 (destructor)list_dealloc, /*tp_dealloc*/
1477 (printfunc)list_print, /*tp_print*/
1478 (getattrfunc)list_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001479 0, /*tp_setattr*/
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001480 (cmpfunc)list_compare, /*tp_compare*/
1481 (reprfunc)list_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001482 0, /*tp_as_number*/
1483 &list_as_sequence, /*tp_as_sequence*/
1484 0, /*tp_as_mapping*/
Fred Drake56780252000-06-15 14:50:20 +00001485 0, /*tp_hash*/
1486 0, /*tp_call*/
1487 0, /*tp_str*/
1488 0, /*tp_getattro*/
1489 0, /*tp_setattro*/
1490 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001491 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001492 0, /* tp_doc */
1493 (traverseproc)list_traverse, /* tp_traverse */
1494 (inquiry)list_clear, /* tp_clear */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001495};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001496
1497
1498/* During a sort, we really can't have anyone modifying the list; it could
1499 cause core dumps. Thus, we substitute a dummy type that raises an
1500 explanatory exception when a modifying operation is used. Caveat:
1501 comparisons may behave differently; but I guess it's a bad idea anyway to
1502 compare a list that's being sorted... */
1503
1504static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001505immutable_list_op(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001506{
1507 PyErr_SetString(PyExc_TypeError,
1508 "a list cannot be modified while it is being sorted");
1509 return NULL;
1510}
1511
1512static PyMethodDef immutable_list_methods[] = {
1513 {"append", (PyCFunction)immutable_list_op},
1514 {"insert", (PyCFunction)immutable_list_op},
1515 {"remove", (PyCFunction)immutable_list_op},
1516 {"index", (PyCFunction)listindex},
1517 {"count", (PyCFunction)listcount},
1518 {"reverse", (PyCFunction)immutable_list_op},
1519 {"sort", (PyCFunction)immutable_list_op},
1520 {NULL, NULL} /* sentinel */
1521};
1522
1523static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001524immutable_list_getattr(PyListObject *f, char *name)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001525{
1526 return Py_FindMethod(immutable_list_methods, (PyObject *)f, name);
1527}
1528
1529static int
Fred Drakea2f55112000-07-09 15:16:51 +00001530immutable_list_ass(void)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001531{
1532 immutable_list_op();
1533 return -1;
1534}
1535
1536static PySequenceMethods immutable_list_as_sequence = {
1537 (inquiry)list_length, /*sq_length*/
1538 (binaryfunc)list_concat, /*sq_concat*/
1539 (intargfunc)list_repeat, /*sq_repeat*/
1540 (intargfunc)list_item, /*sq_item*/
1541 (intintargfunc)list_slice, /*sq_slice*/
1542 (intobjargproc)immutable_list_ass, /*sq_ass_item*/
1543 (intintobjargproc)immutable_list_ass, /*sq_ass_slice*/
Fred Drake56780252000-06-15 14:50:20 +00001544 (objobjproc)list_contains, /*sq_contains*/
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001545};
1546
1547static PyTypeObject immutable_list_type = {
1548 PyObject_HEAD_INIT(&PyType_Type)
1549 0,
1550 "list (immutable, during sort)",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001551 sizeof(PyListObject) + PyGC_HEAD_SIZE,
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001552 0,
1553 0, /*tp_dealloc*/ /* Cannot happen */
1554 (printfunc)list_print, /*tp_print*/
1555 (getattrfunc)immutable_list_getattr, /*tp_getattr*/
1556 0, /*tp_setattr*/
1557 0, /*tp_compare*/ /* Won't be called */
1558 (reprfunc)list_repr, /*tp_repr*/
1559 0, /*tp_as_number*/
1560 &immutable_list_as_sequence, /*tp_as_sequence*/
1561 0, /*tp_as_mapping*/
Fred Drake56780252000-06-15 14:50:20 +00001562 0, /*tp_hash*/
1563 0, /*tp_call*/
1564 0, /*tp_str*/
1565 0, /*tp_getattro*/
1566 0, /*tp_setattro*/
1567 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001568 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001569 0, /* tp_doc */
1570 (traverseproc)list_traverse, /* tp_traverse */
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001571};