Use richer assertions in test_mailbox (for better failure messages).
[python.git] / Objects / listobject.c
blobc5b147580292c55ccca97509d3f0b23482c3303c
1 /* List object implementation */
3 #include "Python.h"
5 #ifdef STDC_HEADERS
6 #include <stddef.h>
7 #else
8 #include <sys/types.h> /* For size_t */
9 #endif
11 /* 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.
24 static int
25 list_resize(PyListObject *self, Py_ssize_t newsize)
27 PyObject **items;
28 size_t new_allocated;
29 Py_ssize_t allocated = self->allocated;
31 /* Bypass realloc() when a previous overallocation is large enough
32 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
35 if (allocated >= newsize && newsize >= (allocated >> 1)) {
36 assert(self->ob_item != NULL || newsize == 0);
37 Py_SIZE(self) = newsize;
38 return 0;
41 /* This over-allocates proportional to the list size, making room
42 * 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
45 * system realloc().
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
48 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
50 /* check for integer overflow */
51 if (new_allocated > PY_SIZE_MAX - newsize) {
52 PyErr_NoMemory();
53 return -1;
54 } else {
55 new_allocated += newsize;
58 if (newsize == 0)
59 new_allocated = 0;
60 items = self->ob_item;
61 if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
62 PyMem_RESIZE(items, PyObject *, new_allocated);
63 else
64 items = NULL;
65 if (items == NULL) {
66 PyErr_NoMemory();
67 return -1;
69 self->ob_item = items;
70 Py_SIZE(self) = newsize;
71 self->allocated = new_allocated;
72 return 0;
75 /* Debug statistic to compare allocations with reuse through the free list */
76 #undef SHOW_ALLOC_COUNT
77 #ifdef SHOW_ALLOC_COUNT
78 static size_t count_alloc = 0;
79 static size_t count_reuse = 0;
81 static void
82 show_alloc(void)
84 fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
85 count_alloc);
86 fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
87 "d\n", count_reuse);
88 fprintf(stderr, "%.2f%% reuse rate\n\n",
89 (100.0*count_reuse/(count_alloc+count_reuse)));
91 #endif
93 /* Empty list reuse scheme to save calls to malloc and free */
94 #ifndef PyList_MAXFREELIST
95 #define PyList_MAXFREELIST 80
96 #endif
97 static PyListObject *free_list[PyList_MAXFREELIST];
98 static int numfree = 0;
100 void
101 PyList_Fini(void)
103 PyListObject *op;
105 while (numfree) {
106 op = free_list[--numfree];
107 assert(PyList_CheckExact(op));
108 PyObject_GC_Del(op);
112 PyObject *
113 PyList_New(Py_ssize_t size)
115 PyListObject *op;
116 size_t nbytes;
117 #ifdef SHOW_ALLOC_COUNT
118 static int initialized = 0;
119 if (!initialized) {
120 Py_AtExit(show_alloc);
121 initialized = 1;
123 #endif
125 if (size < 0) {
126 PyErr_BadInternalCall();
127 return NULL;
129 nbytes = size * sizeof(PyObject *);
130 /* Check for overflow without an actual overflow,
131 * which can cause compiler to optimise out */
132 if (size > PY_SIZE_MAX / sizeof(PyObject *))
133 return PyErr_NoMemory();
134 if (numfree) {
135 numfree--;
136 op = free_list[numfree];
137 _Py_NewReference((PyObject *)op);
138 #ifdef SHOW_ALLOC_COUNT
139 count_reuse++;
140 #endif
141 } else {
142 op = PyObject_GC_New(PyListObject, &PyList_Type);
143 if (op == NULL)
144 return NULL;
145 #ifdef SHOW_ALLOC_COUNT
146 count_alloc++;
147 #endif
149 if (size <= 0)
150 op->ob_item = NULL;
151 else {
152 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
153 if (op->ob_item == NULL) {
154 Py_DECREF(op);
155 return PyErr_NoMemory();
157 memset(op->ob_item, 0, nbytes);
159 Py_SIZE(op) = size;
160 op->allocated = size;
161 _PyObject_GC_TRACK(op);
162 return (PyObject *) op;
165 Py_ssize_t
166 PyList_Size(PyObject *op)
168 if (!PyList_Check(op)) {
169 PyErr_BadInternalCall();
170 return -1;
172 else
173 return Py_SIZE(op);
176 static PyObject *indexerr = NULL;
178 PyObject *
179 PyList_GetItem(PyObject *op, Py_ssize_t i)
181 if (!PyList_Check(op)) {
182 PyErr_BadInternalCall();
183 return NULL;
185 if (i < 0 || i >= Py_SIZE(op)) {
186 if (indexerr == NULL)
187 indexerr = PyString_FromString(
188 "list index out of range");
189 PyErr_SetObject(PyExc_IndexError, indexerr);
190 return NULL;
192 return ((PyListObject *)op) -> ob_item[i];
196 PyList_SetItem(register PyObject *op, register Py_ssize_t i,
197 register PyObject *newitem)
199 register PyObject *olditem;
200 register PyObject **p;
201 if (!PyList_Check(op)) {
202 Py_XDECREF(newitem);
203 PyErr_BadInternalCall();
204 return -1;
206 if (i < 0 || i >= Py_SIZE(op)) {
207 Py_XDECREF(newitem);
208 PyErr_SetString(PyExc_IndexError,
209 "list assignment index out of range");
210 return -1;
212 p = ((PyListObject *)op) -> ob_item + i;
213 olditem = *p;
214 *p = newitem;
215 Py_XDECREF(olditem);
216 return 0;
219 static int
220 ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
222 Py_ssize_t i, n = Py_SIZE(self);
223 PyObject **items;
224 if (v == NULL) {
225 PyErr_BadInternalCall();
226 return -1;
228 if (n == PY_SSIZE_T_MAX) {
229 PyErr_SetString(PyExc_OverflowError,
230 "cannot add more objects to list");
231 return -1;
234 if (list_resize(self, n+1) == -1)
235 return -1;
237 if (where < 0) {
238 where += n;
239 if (where < 0)
240 where = 0;
242 if (where > n)
243 where = n;
244 items = self->ob_item;
245 for (i = n; --i >= where; )
246 items[i+1] = items[i];
247 Py_INCREF(v);
248 items[where] = v;
249 return 0;
253 PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
255 if (!PyList_Check(op)) {
256 PyErr_BadInternalCall();
257 return -1;
259 return ins1((PyListObject *)op, where, newitem);
262 static int
263 app1(PyListObject *self, PyObject *v)
265 Py_ssize_t n = PyList_GET_SIZE(self);
267 assert (v != NULL);
268 if (n == PY_SSIZE_T_MAX) {
269 PyErr_SetString(PyExc_OverflowError,
270 "cannot add more objects to list");
271 return -1;
274 if (list_resize(self, n+1) == -1)
275 return -1;
277 Py_INCREF(v);
278 PyList_SET_ITEM(self, n, v);
279 return 0;
283 PyList_Append(PyObject *op, PyObject *newitem)
285 if (PyList_Check(op) && (newitem != NULL))
286 return app1((PyListObject *)op, newitem);
287 PyErr_BadInternalCall();
288 return -1;
291 /* Methods */
293 static void
294 list_dealloc(PyListObject *op)
296 Py_ssize_t i;
297 PyObject_GC_UnTrack(op);
298 Py_TRASHCAN_SAFE_BEGIN(op)
299 if (op->ob_item != NULL) {
300 /* Do it backwards, for Christian Tismer.
301 There's a simple test case where somehow this reduces
302 thrashing when a *very* large list is created and
303 immediately deleted. */
304 i = Py_SIZE(op);
305 while (--i >= 0) {
306 Py_XDECREF(op->ob_item[i]);
308 PyMem_FREE(op->ob_item);
310 if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
311 free_list[numfree++] = op;
312 else
313 Py_TYPE(op)->tp_free((PyObject *)op);
314 Py_TRASHCAN_SAFE_END(op)
317 static int
318 list_print(PyListObject *op, FILE *fp, int flags)
320 int rc;
321 Py_ssize_t i;
322 PyObject *item;
324 rc = Py_ReprEnter((PyObject*)op);
325 if (rc != 0) {
326 if (rc < 0)
327 return rc;
328 Py_BEGIN_ALLOW_THREADS
329 fprintf(fp, "[...]");
330 Py_END_ALLOW_THREADS
331 return 0;
333 Py_BEGIN_ALLOW_THREADS
334 fprintf(fp, "[");
335 Py_END_ALLOW_THREADS
336 for (i = 0; i < Py_SIZE(op); i++) {
337 item = op->ob_item[i];
338 Py_INCREF(item);
339 if (i > 0) {
340 Py_BEGIN_ALLOW_THREADS
341 fprintf(fp, ", ");
342 Py_END_ALLOW_THREADS
344 if (PyObject_Print(item, fp, 0) != 0) {
345 Py_DECREF(item);
346 Py_ReprLeave((PyObject *)op);
347 return -1;
349 Py_DECREF(item);
351 Py_BEGIN_ALLOW_THREADS
352 fprintf(fp, "]");
353 Py_END_ALLOW_THREADS
354 Py_ReprLeave((PyObject *)op);
355 return 0;
358 static PyObject *
359 list_repr(PyListObject *v)
361 Py_ssize_t i;
362 PyObject *s, *temp;
363 PyObject *pieces = NULL, *result = NULL;
365 i = Py_ReprEnter((PyObject*)v);
366 if (i != 0) {
367 return i > 0 ? PyString_FromString("[...]") : NULL;
370 if (Py_SIZE(v) == 0) {
371 result = PyString_FromString("[]");
372 goto Done;
375 pieces = PyList_New(0);
376 if (pieces == NULL)
377 goto Done;
379 /* Do repr() on each element. Note that this may mutate the list,
380 so must refetch the list size on each iteration. */
381 for (i = 0; i < Py_SIZE(v); ++i) {
382 int status;
383 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
384 goto Done;
385 s = PyObject_Repr(v->ob_item[i]);
386 Py_LeaveRecursiveCall();
387 if (s == NULL)
388 goto Done;
389 status = PyList_Append(pieces, s);
390 Py_DECREF(s); /* append created a new ref */
391 if (status < 0)
392 goto Done;
395 /* Add "[]" decorations to the first and last items. */
396 assert(PyList_GET_SIZE(pieces) > 0);
397 s = PyString_FromString("[");
398 if (s == NULL)
399 goto Done;
400 temp = PyList_GET_ITEM(pieces, 0);
401 PyString_ConcatAndDel(&s, temp);
402 PyList_SET_ITEM(pieces, 0, s);
403 if (s == NULL)
404 goto Done;
406 s = PyString_FromString("]");
407 if (s == NULL)
408 goto Done;
409 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
410 PyString_ConcatAndDel(&temp, s);
411 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
412 if (temp == NULL)
413 goto Done;
415 /* Paste them all together with ", " between. */
416 s = PyString_FromString(", ");
417 if (s == NULL)
418 goto Done;
419 result = _PyString_Join(s, pieces);
420 Py_DECREF(s);
422 Done:
423 Py_XDECREF(pieces);
424 Py_ReprLeave((PyObject *)v);
425 return result;
428 static Py_ssize_t
429 list_length(PyListObject *a)
431 return Py_SIZE(a);
434 static int
435 list_contains(PyListObject *a, PyObject *el)
437 Py_ssize_t i;
438 int cmp;
440 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
441 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
442 Py_EQ);
443 return cmp;
446 static PyObject *
447 list_item(PyListObject *a, Py_ssize_t i)
449 if (i < 0 || i >= Py_SIZE(a)) {
450 if (indexerr == NULL)
451 indexerr = PyString_FromString(
452 "list index out of range");
453 PyErr_SetObject(PyExc_IndexError, indexerr);
454 return NULL;
456 Py_INCREF(a->ob_item[i]);
457 return a->ob_item[i];
460 static PyObject *
461 list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
463 PyListObject *np;
464 PyObject **src, **dest;
465 Py_ssize_t i, len;
466 if (ilow < 0)
467 ilow = 0;
468 else if (ilow > Py_SIZE(a))
469 ilow = Py_SIZE(a);
470 if (ihigh < ilow)
471 ihigh = ilow;
472 else if (ihigh > Py_SIZE(a))
473 ihigh = Py_SIZE(a);
474 len = ihigh - ilow;
475 np = (PyListObject *) PyList_New(len);
476 if (np == NULL)
477 return NULL;
479 src = a->ob_item + ilow;
480 dest = np->ob_item;
481 for (i = 0; i < len; i++) {
482 PyObject *v = src[i];
483 Py_INCREF(v);
484 dest[i] = v;
486 return (PyObject *)np;
489 PyObject *
490 PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
492 if (!PyList_Check(a)) {
493 PyErr_BadInternalCall();
494 return NULL;
496 return list_slice((PyListObject *)a, ilow, ihigh);
499 static PyObject *
500 list_concat(PyListObject *a, PyObject *bb)
502 Py_ssize_t size;
503 Py_ssize_t i;
504 PyObject **src, **dest;
505 PyListObject *np;
506 if (!PyList_Check(bb)) {
507 PyErr_Format(PyExc_TypeError,
508 "can only concatenate list (not \"%.200s\") to list",
509 bb->ob_type->tp_name);
510 return NULL;
512 #define b ((PyListObject *)bb)
513 size = Py_SIZE(a) + Py_SIZE(b);
514 if (size < 0)
515 return PyErr_NoMemory();
516 np = (PyListObject *) PyList_New(size);
517 if (np == NULL) {
518 return NULL;
520 src = a->ob_item;
521 dest = np->ob_item;
522 for (i = 0; i < Py_SIZE(a); i++) {
523 PyObject *v = src[i];
524 Py_INCREF(v);
525 dest[i] = v;
527 src = b->ob_item;
528 dest = np->ob_item + Py_SIZE(a);
529 for (i = 0; i < Py_SIZE(b); i++) {
530 PyObject *v = src[i];
531 Py_INCREF(v);
532 dest[i] = v;
534 return (PyObject *)np;
535 #undef b
538 static PyObject *
539 list_repeat(PyListObject *a, Py_ssize_t n)
541 Py_ssize_t i, j;
542 Py_ssize_t size;
543 PyListObject *np;
544 PyObject **p, **items;
545 PyObject *elem;
546 if (n < 0)
547 n = 0;
548 size = Py_SIZE(a) * n;
549 if (n && size/n != Py_SIZE(a))
550 return PyErr_NoMemory();
551 if (size == 0)
552 return PyList_New(0);
553 np = (PyListObject *) PyList_New(size);
554 if (np == NULL)
555 return NULL;
557 items = np->ob_item;
558 if (Py_SIZE(a) == 1) {
559 elem = a->ob_item[0];
560 for (i = 0; i < n; i++) {
561 items[i] = elem;
562 Py_INCREF(elem);
564 return (PyObject *) np;
566 p = np->ob_item;
567 items = a->ob_item;
568 for (i = 0; i < n; i++) {
569 for (j = 0; j < Py_SIZE(a); j++) {
570 *p = items[j];
571 Py_INCREF(*p);
572 p++;
575 return (PyObject *) np;
578 static int
579 list_clear(PyListObject *a)
581 Py_ssize_t i;
582 PyObject **item = a->ob_item;
583 if (item != NULL) {
584 /* Because XDECREF can recursively invoke operations on
585 this list, we make it empty first. */
586 i = Py_SIZE(a);
587 Py_SIZE(a) = 0;
588 a->ob_item = NULL;
589 a->allocated = 0;
590 while (--i >= 0) {
591 Py_XDECREF(item[i]);
593 PyMem_FREE(item);
595 /* Never fails; the return value can be ignored.
596 Note that there is no guarantee that the list is actually empty
597 at this point, because XDECREF may have populated it again! */
598 return 0;
601 /* a[ilow:ihigh] = v if v != NULL.
602 * del a[ilow:ihigh] if v == NULL.
604 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
605 * guaranteed the call cannot fail.
607 static int
608 list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
610 /* Because [X]DECREF can recursively invoke list operations on
611 this list, we must postpone all [X]DECREF activity until
612 after the list is back in its canonical shape. Therefore
613 we must allocate an additional array, 'recycle', into which
614 we temporarily copy the items that are deleted from the
615 list. :-( */
616 PyObject *recycle_on_stack[8];
617 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
618 PyObject **item;
619 PyObject **vitem = NULL;
620 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
621 Py_ssize_t n; /* # of elements in replacement list */
622 Py_ssize_t norig; /* # of elements in list getting replaced */
623 Py_ssize_t d; /* Change in size */
624 Py_ssize_t k;
625 size_t s;
626 int result = -1; /* guilty until proved innocent */
627 #define b ((PyListObject *)v)
628 if (v == NULL)
629 n = 0;
630 else {
631 if (a == b) {
632 /* Special case "a[i:j] = a" -- copy b first */
633 v = list_slice(b, 0, Py_SIZE(b));
634 if (v == NULL)
635 return result;
636 result = list_ass_slice(a, ilow, ihigh, v);
637 Py_DECREF(v);
638 return result;
640 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
641 if(v_as_SF == NULL)
642 goto Error;
643 n = PySequence_Fast_GET_SIZE(v_as_SF);
644 vitem = PySequence_Fast_ITEMS(v_as_SF);
646 if (ilow < 0)
647 ilow = 0;
648 else if (ilow > Py_SIZE(a))
649 ilow = Py_SIZE(a);
651 if (ihigh < ilow)
652 ihigh = ilow;
653 else if (ihigh > Py_SIZE(a))
654 ihigh = Py_SIZE(a);
656 norig = ihigh - ilow;
657 assert(norig >= 0);
658 d = n - norig;
659 if (Py_SIZE(a) + d == 0) {
660 Py_XDECREF(v_as_SF);
661 return list_clear(a);
663 item = a->ob_item;
664 /* recycle the items that we are about to remove */
665 s = norig * sizeof(PyObject *);
666 if (s > sizeof(recycle_on_stack)) {
667 recycle = (PyObject **)PyMem_MALLOC(s);
668 if (recycle == NULL) {
669 PyErr_NoMemory();
670 goto Error;
673 memcpy(recycle, &item[ilow], s);
675 if (d < 0) { /* Delete -d items */
676 memmove(&item[ihigh+d], &item[ihigh],
677 (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
678 list_resize(a, Py_SIZE(a) + d);
679 item = a->ob_item;
681 else if (d > 0) { /* Insert d items */
682 k = Py_SIZE(a);
683 if (list_resize(a, k+d) < 0)
684 goto Error;
685 item = a->ob_item;
686 memmove(&item[ihigh+d], &item[ihigh],
687 (k - ihigh)*sizeof(PyObject *));
689 for (k = 0; k < n; k++, ilow++) {
690 PyObject *w = vitem[k];
691 Py_XINCREF(w);
692 item[ilow] = w;
694 for (k = norig - 1; k >= 0; --k)
695 Py_XDECREF(recycle[k]);
696 result = 0;
697 Error:
698 if (recycle != recycle_on_stack)
699 PyMem_FREE(recycle);
700 Py_XDECREF(v_as_SF);
701 return result;
702 #undef b
706 PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
708 if (!PyList_Check(a)) {
709 PyErr_BadInternalCall();
710 return -1;
712 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
715 static PyObject *
716 list_inplace_repeat(PyListObject *self, Py_ssize_t n)
718 PyObject **items;
719 Py_ssize_t size, i, j, p;
722 size = PyList_GET_SIZE(self);
723 if (size == 0 || n == 1) {
724 Py_INCREF(self);
725 return (PyObject *)self;
728 if (n < 1) {
729 (void)list_clear(self);
730 Py_INCREF(self);
731 return (PyObject *)self;
734 if (size > PY_SSIZE_T_MAX / n) {
735 return PyErr_NoMemory();
738 if (list_resize(self, size*n) == -1)
739 return NULL;
741 p = size;
742 items = self->ob_item;
743 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
744 for (j = 0; j < size; j++) {
745 PyObject *o = items[j];
746 Py_INCREF(o);
747 items[p++] = o;
750 Py_INCREF(self);
751 return (PyObject *)self;
754 static int
755 list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
757 PyObject *old_value;
758 if (i < 0 || i >= Py_SIZE(a)) {
759 PyErr_SetString(PyExc_IndexError,
760 "list assignment index out of range");
761 return -1;
763 if (v == NULL)
764 return list_ass_slice(a, i, i+1, v);
765 Py_INCREF(v);
766 old_value = a->ob_item[i];
767 a->ob_item[i] = v;
768 Py_DECREF(old_value);
769 return 0;
772 static PyObject *
773 listinsert(PyListObject *self, PyObject *args)
775 Py_ssize_t i;
776 PyObject *v;
777 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
778 return NULL;
779 if (ins1(self, i, v) == 0)
780 Py_RETURN_NONE;
781 return NULL;
784 static PyObject *
785 listappend(PyListObject *self, PyObject *v)
787 if (app1(self, v) == 0)
788 Py_RETURN_NONE;
789 return NULL;
792 static PyObject *
793 listextend(PyListObject *self, PyObject *b)
795 PyObject *it; /* iter(v) */
796 Py_ssize_t m; /* size of self */
797 Py_ssize_t n; /* guess for size of b */
798 Py_ssize_t mn; /* m + n */
799 Py_ssize_t i;
800 PyObject *(*iternext)(PyObject *);
802 /* Special cases:
803 1) lists and tuples which can use PySequence_Fast ops
804 2) extending self to self requires making a copy first
806 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
807 PyObject **src, **dest;
808 b = PySequence_Fast(b, "argument must be iterable");
809 if (!b)
810 return NULL;
811 n = PySequence_Fast_GET_SIZE(b);
812 if (n == 0) {
813 /* short circuit when b is empty */
814 Py_DECREF(b);
815 Py_RETURN_NONE;
817 m = Py_SIZE(self);
818 if (list_resize(self, m + n) == -1) {
819 Py_DECREF(b);
820 return NULL;
822 /* note that we may still have self == b here for the
823 * situation a.extend(a), but the following code works
824 * in that case too. Just make sure to resize self
825 * before calling PySequence_Fast_ITEMS.
827 /* populate the end of self with b's items */
828 src = PySequence_Fast_ITEMS(b);
829 dest = self->ob_item + m;
830 for (i = 0; i < n; i++) {
831 PyObject *o = src[i];
832 Py_INCREF(o);
833 dest[i] = o;
835 Py_DECREF(b);
836 Py_RETURN_NONE;
839 it = PyObject_GetIter(b);
840 if (it == NULL)
841 return NULL;
842 iternext = *it->ob_type->tp_iternext;
844 /* Guess a result list size. */
845 n = _PyObject_LengthHint(b, 8);
846 if (n == -1) {
847 Py_DECREF(it);
848 return NULL;
850 m = Py_SIZE(self);
851 mn = m + n;
852 if (mn >= m) {
853 /* Make room. */
854 if (list_resize(self, mn) == -1)
855 goto error;
856 /* Make the list sane again. */
857 Py_SIZE(self) = m;
859 /* Else m + n overflowed; on the chance that n lied, and there really
860 * is enough room, ignore it. If n was telling the truth, we'll
861 * eventually run out of memory during the loop.
864 /* Run iterator to exhaustion. */
865 for (;;) {
866 PyObject *item = iternext(it);
867 if (item == NULL) {
868 if (PyErr_Occurred()) {
869 if (PyErr_ExceptionMatches(PyExc_StopIteration))
870 PyErr_Clear();
871 else
872 goto error;
874 break;
876 if (Py_SIZE(self) < self->allocated) {
877 /* steals ref */
878 PyList_SET_ITEM(self, Py_SIZE(self), item);
879 ++Py_SIZE(self);
881 else {
882 int status = app1(self, item);
883 Py_DECREF(item); /* append creates a new ref */
884 if (status < 0)
885 goto error;
889 /* Cut back result list if initial guess was too large. */
890 if (Py_SIZE(self) < self->allocated)
891 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
893 Py_DECREF(it);
894 Py_RETURN_NONE;
896 error:
897 Py_DECREF(it);
898 return NULL;
901 PyObject *
902 _PyList_Extend(PyListObject *self, PyObject *b)
904 return listextend(self, b);
907 static PyObject *
908 list_inplace_concat(PyListObject *self, PyObject *other)
910 PyObject *result;
912 result = listextend(self, other);
913 if (result == NULL)
914 return result;
915 Py_DECREF(result);
916 Py_INCREF(self);
917 return (PyObject *)self;
920 static PyObject *
921 listpop(PyListObject *self, PyObject *args)
923 Py_ssize_t i = -1;
924 PyObject *v;
925 int status;
927 if (!PyArg_ParseTuple(args, "|n:pop", &i))
928 return NULL;
930 if (Py_SIZE(self) == 0) {
931 /* Special-case most common failure cause */
932 PyErr_SetString(PyExc_IndexError, "pop from empty list");
933 return NULL;
935 if (i < 0)
936 i += Py_SIZE(self);
937 if (i < 0 || i >= Py_SIZE(self)) {
938 PyErr_SetString(PyExc_IndexError, "pop index out of range");
939 return NULL;
941 v = self->ob_item[i];
942 if (i == Py_SIZE(self) - 1) {
943 status = list_resize(self, Py_SIZE(self) - 1);
944 assert(status >= 0);
945 return v; /* and v now owns the reference the list had */
947 Py_INCREF(v);
948 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
949 assert(status >= 0);
950 /* Use status, so that in a release build compilers don't
951 * complain about the unused name.
953 (void) status;
955 return v;
958 /* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
959 static void
960 reverse_slice(PyObject **lo, PyObject **hi)
962 assert(lo && hi);
964 --hi;
965 while (lo < hi) {
966 PyObject *t = *lo;
967 *lo = *hi;
968 *hi = t;
969 ++lo;
970 --hi;
974 /* Lots of code for an adaptive, stable, natural mergesort. There are many
975 * pieces to this algorithm; read listsort.txt for overviews and details.
978 /* Comparison function. Takes care of calling a user-supplied
979 * comparison function (any callable Python object), which must not be
980 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
981 * with Py_LT if you know it's NULL).
982 * Returns -1 on error, 1 if x < y, 0 if x >= y.
984 static int
985 islt(PyObject *x, PyObject *y, PyObject *compare)
987 PyObject *res;
988 PyObject *args;
989 Py_ssize_t i;
991 assert(compare != NULL);
992 /* Call the user's comparison function and translate the 3-way
993 * result into true or false (or error).
995 args = PyTuple_New(2);
996 if (args == NULL)
997 return -1;
998 Py_INCREF(x);
999 Py_INCREF(y);
1000 PyTuple_SET_ITEM(args, 0, x);
1001 PyTuple_SET_ITEM(args, 1, y);
1002 res = PyObject_Call(compare, args, NULL);
1003 Py_DECREF(args);
1004 if (res == NULL)
1005 return -1;
1006 if (!PyInt_Check(res)) {
1007 PyErr_Format(PyExc_TypeError,
1008 "comparison function must return int, not %.200s",
1009 res->ob_type->tp_name);
1010 Py_DECREF(res);
1011 return -1;
1013 i = PyInt_AsLong(res);
1014 Py_DECREF(res);
1015 return i < 0;
1018 /* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
1019 * islt. This avoids a layer of function call in the usual case, and
1020 * sorting does many comparisons.
1021 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1023 #define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
1024 PyObject_RichCompareBool(X, Y, Py_LT) : \
1025 islt(X, Y, COMPARE))
1027 /* Compare X to Y via "<". Goto "fail" if the comparison raises an
1028 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
1029 started. It makes more sense in context <wink>. X and Y are PyObject*s.
1031 #define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
1032 if (k)
1034 /* binarysort is the best method for sorting small arrays: it does
1035 few compares, but can do data movement quadratic in the number of
1036 elements.
1037 [lo, hi) is a contiguous slice of a list, and is sorted via
1038 binary insertion. This sort is stable.
1039 On entry, must have lo <= start <= hi, and that [lo, start) is already
1040 sorted (pass start == lo if you don't know!).
1041 If islt() complains return -1, else 0.
1042 Even in case of error, the output slice will be some permutation of
1043 the input (nothing is lost or duplicated).
1045 static int
1046 binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
1047 /* compare -- comparison function object, or NULL for default */
1049 register Py_ssize_t k;
1050 register PyObject **l, **p, **r;
1051 register PyObject *pivot;
1053 assert(lo <= start && start <= hi);
1054 /* assert [lo, start) is sorted */
1055 if (lo == start)
1056 ++start;
1057 for (; start < hi; ++start) {
1058 /* set l to where *start belongs */
1059 l = lo;
1060 r = start;
1061 pivot = *r;
1062 /* Invariants:
1063 * pivot >= all in [lo, l).
1064 * pivot < all in [r, start).
1065 * The second is vacuously true at the start.
1067 assert(l < r);
1068 do {
1069 p = l + ((r - l) >> 1);
1070 IFLT(pivot, *p)
1071 r = p;
1072 else
1073 l = p+1;
1074 } while (l < r);
1075 assert(l == r);
1076 /* The invariants still hold, so pivot >= all in [lo, l) and
1077 pivot < all in [l, start), so pivot belongs at l. Note
1078 that if there are elements equal to pivot, l points to the
1079 first slot after them -- that's why this sort is stable.
1080 Slide over to make room.
1081 Caution: using memmove is much slower under MSVC 5;
1082 we're not usually moving many slots. */
1083 for (p = start; p > l; --p)
1084 *p = *(p-1);
1085 *l = pivot;
1087 return 0;
1089 fail:
1090 return -1;
1094 Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1095 is required on entry. "A run" is the longest ascending sequence, with
1097 lo[0] <= lo[1] <= lo[2] <= ...
1099 or the longest descending sequence, with
1101 lo[0] > lo[1] > lo[2] > ...
1103 Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1104 For its intended use in a stable mergesort, the strictness of the defn of
1105 "descending" is needed so that the caller can safely reverse a descending
1106 sequence without violating stability (strict > ensures there are no equal
1107 elements to get out of order).
1109 Returns -1 in case of error.
1111 static Py_ssize_t
1112 count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
1114 Py_ssize_t k;
1115 Py_ssize_t n;
1117 assert(lo < hi);
1118 *descending = 0;
1119 ++lo;
1120 if (lo == hi)
1121 return 1;
1123 n = 2;
1124 IFLT(*lo, *(lo-1)) {
1125 *descending = 1;
1126 for (lo = lo+1; lo < hi; ++lo, ++n) {
1127 IFLT(*lo, *(lo-1))
1129 else
1130 break;
1133 else {
1134 for (lo = lo+1; lo < hi; ++lo, ++n) {
1135 IFLT(*lo, *(lo-1))
1136 break;
1140 return n;
1141 fail:
1142 return -1;
1146 Locate the proper position of key in a sorted vector; if the vector contains
1147 an element equal to key, return the position immediately to the left of
1148 the leftmost equal element. [gallop_right() does the same except returns
1149 the position to the right of the rightmost equal element (if any).]
1151 "a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
1153 "hint" is an index at which to begin the search, 0 <= hint < n. The closer
1154 hint is to the final result, the faster this runs.
1156 The return value is the int k in 0..n such that
1158 a[k-1] < key <= a[k]
1160 pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1161 key belongs at index k; or, IOW, the first k elements of a should precede
1162 key, and the last n-k should follow key.
1164 Returns -1 on error. See listsort.txt for info on the method.
1166 static Py_ssize_t
1167 gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
1169 Py_ssize_t ofs;
1170 Py_ssize_t lastofs;
1171 Py_ssize_t k;
1173 assert(key && a && n > 0 && hint >= 0 && hint < n);
1175 a += hint;
1176 lastofs = 0;
1177 ofs = 1;
1178 IFLT(*a, key) {
1179 /* a[hint] < key -- gallop right, until
1180 * a[hint + lastofs] < key <= a[hint + ofs]
1182 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1183 while (ofs < maxofs) {
1184 IFLT(a[ofs], key) {
1185 lastofs = ofs;
1186 ofs = (ofs << 1) + 1;
1187 if (ofs <= 0) /* int overflow */
1188 ofs = maxofs;
1190 else /* key <= a[hint + ofs] */
1191 break;
1193 if (ofs > maxofs)
1194 ofs = maxofs;
1195 /* Translate back to offsets relative to &a[0]. */
1196 lastofs += hint;
1197 ofs += hint;
1199 else {
1200 /* key <= a[hint] -- gallop left, until
1201 * a[hint - ofs] < key <= a[hint - lastofs]
1203 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1204 while (ofs < maxofs) {
1205 IFLT(*(a-ofs), key)
1206 break;
1207 /* key <= a[hint - ofs] */
1208 lastofs = ofs;
1209 ofs = (ofs << 1) + 1;
1210 if (ofs <= 0) /* int overflow */
1211 ofs = maxofs;
1213 if (ofs > maxofs)
1214 ofs = maxofs;
1215 /* Translate back to positive offsets relative to &a[0]. */
1216 k = lastofs;
1217 lastofs = hint - ofs;
1218 ofs = hint - k;
1220 a -= hint;
1222 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1223 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1224 * right of lastofs but no farther right than ofs. Do a binary
1225 * search, with invariant a[lastofs-1] < key <= a[ofs].
1227 ++lastofs;
1228 while (lastofs < ofs) {
1229 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
1231 IFLT(a[m], key)
1232 lastofs = m+1; /* a[m] < key */
1233 else
1234 ofs = m; /* key <= a[m] */
1236 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
1237 return ofs;
1239 fail:
1240 return -1;
1244 Exactly like gallop_left(), except that if key already exists in a[0:n],
1245 finds the position immediately to the right of the rightmost equal value.
1247 The return value is the int k in 0..n such that
1249 a[k-1] <= key < a[k]
1251 or -1 if error.
1253 The code duplication is massive, but this is enough different given that
1254 we're sticking to "<" comparisons that it's much harder to follow if
1255 written as one routine with yet another "left or right?" flag.
1257 static Py_ssize_t
1258 gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
1260 Py_ssize_t ofs;
1261 Py_ssize_t lastofs;
1262 Py_ssize_t k;
1264 assert(key && a && n > 0 && hint >= 0 && hint < n);
1266 a += hint;
1267 lastofs = 0;
1268 ofs = 1;
1269 IFLT(key, *a) {
1270 /* key < a[hint] -- gallop left, until
1271 * a[hint - ofs] <= key < a[hint - lastofs]
1273 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
1274 while (ofs < maxofs) {
1275 IFLT(key, *(a-ofs)) {
1276 lastofs = ofs;
1277 ofs = (ofs << 1) + 1;
1278 if (ofs <= 0) /* int overflow */
1279 ofs = maxofs;
1281 else /* a[hint - ofs] <= key */
1282 break;
1284 if (ofs > maxofs)
1285 ofs = maxofs;
1286 /* Translate back to positive offsets relative to &a[0]. */
1287 k = lastofs;
1288 lastofs = hint - ofs;
1289 ofs = hint - k;
1291 else {
1292 /* a[hint] <= key -- gallop right, until
1293 * a[hint + lastofs] <= key < a[hint + ofs]
1295 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
1296 while (ofs < maxofs) {
1297 IFLT(key, a[ofs])
1298 break;
1299 /* a[hint + ofs] <= key */
1300 lastofs = ofs;
1301 ofs = (ofs << 1) + 1;
1302 if (ofs <= 0) /* int overflow */
1303 ofs = maxofs;
1305 if (ofs > maxofs)
1306 ofs = maxofs;
1307 /* Translate back to offsets relative to &a[0]. */
1308 lastofs += hint;
1309 ofs += hint;
1311 a -= hint;
1313 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1314 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1315 * right of lastofs but no farther right than ofs. Do a binary
1316 * search, with invariant a[lastofs-1] <= key < a[ofs].
1318 ++lastofs;
1319 while (lastofs < ofs) {
1320 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
1322 IFLT(key, a[m])
1323 ofs = m; /* key < a[m] */
1324 else
1325 lastofs = m+1; /* a[m] <= key */
1327 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
1328 return ofs;
1330 fail:
1331 return -1;
1334 /* The maximum number of entries in a MergeState's pending-runs stack.
1335 * This is enough to sort arrays of size up to about
1336 * 32 * phi ** MAX_MERGE_PENDING
1337 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1338 * with 2**64 elements.
1340 #define MAX_MERGE_PENDING 85
1342 /* When we get into galloping mode, we stay there until both runs win less
1343 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
1345 #define MIN_GALLOP 7
1347 /* Avoid malloc for small temp arrays. */
1348 #define MERGESTATE_TEMP_SIZE 256
1350 /* One MergeState exists on the stack per invocation of mergesort. It's just
1351 * a convenient way to pass state around among the helper functions.
1353 struct s_slice {
1354 PyObject **base;
1355 Py_ssize_t len;
1358 typedef struct s_MergeState {
1359 /* The user-supplied comparison function. or NULL if none given. */
1360 PyObject *compare;
1362 /* This controls when we get *into* galloping mode. It's initialized
1363 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1364 * random data, and lower for highly structured data.
1366 Py_ssize_t min_gallop;
1368 /* 'a' is temp storage to help with merges. It contains room for
1369 * alloced entries.
1371 PyObject **a; /* may point to temparray below */
1372 Py_ssize_t alloced;
1374 /* A stack of n pending runs yet to be merged. Run #i starts at
1375 * address base[i] and extends for len[i] elements. It's always
1376 * true (so long as the indices are in bounds) that
1378 * pending[i].base + pending[i].len == pending[i+1].base
1380 * so we could cut the storage for this, but it's a minor amount,
1381 * and keeping all the info explicit simplifies the code.
1383 int n;
1384 struct s_slice pending[MAX_MERGE_PENDING];
1386 /* 'a' points to this when possible, rather than muck with malloc. */
1387 PyObject *temparray[MERGESTATE_TEMP_SIZE];
1388 } MergeState;
1390 /* Conceptually a MergeState's constructor. */
1391 static void
1392 merge_init(MergeState *ms, PyObject *compare)
1394 assert(ms != NULL);
1395 ms->compare = compare;
1396 ms->a = ms->temparray;
1397 ms->alloced = MERGESTATE_TEMP_SIZE;
1398 ms->n = 0;
1399 ms->min_gallop = MIN_GALLOP;
1402 /* Free all the temp memory owned by the MergeState. This must be called
1403 * when you're done with a MergeState, and may be called before then if
1404 * you want to free the temp memory early.
1406 static void
1407 merge_freemem(MergeState *ms)
1409 assert(ms != NULL);
1410 if (ms->a != ms->temparray)
1411 PyMem_Free(ms->a);
1412 ms->a = ms->temparray;
1413 ms->alloced = MERGESTATE_TEMP_SIZE;
1416 /* Ensure enough temp memory for 'need' array slots is available.
1417 * Returns 0 on success and -1 if the memory can't be gotten.
1419 static int
1420 merge_getmem(MergeState *ms, Py_ssize_t need)
1422 assert(ms != NULL);
1423 if (need <= ms->alloced)
1424 return 0;
1425 /* Don't realloc! That can cost cycles to copy the old data, but
1426 * we don't care what's in the block.
1428 merge_freemem(ms);
1429 if (need > PY_SSIZE_T_MAX / sizeof(PyObject*)) {
1430 PyErr_NoMemory();
1431 return -1;
1433 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1434 if (ms->a) {
1435 ms->alloced = need;
1436 return 0;
1438 PyErr_NoMemory();
1439 merge_freemem(ms); /* reset to sane state */
1440 return -1;
1442 #define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1443 merge_getmem(MS, NEED))
1445 /* Merge the na elements starting at pa with the nb elements starting at pb
1446 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1447 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1448 * merge, and should have na <= nb. See listsort.txt for more info.
1449 * Return 0 if successful, -1 if error.
1451 static Py_ssize_t
1452 merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1453 PyObject **pb, Py_ssize_t nb)
1455 Py_ssize_t k;
1456 PyObject *compare;
1457 PyObject **dest;
1458 int result = -1; /* guilty until proved innocent */
1459 Py_ssize_t min_gallop;
1461 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1462 if (MERGE_GETMEM(ms, na) < 0)
1463 return -1;
1464 memcpy(ms->a, pa, na * sizeof(PyObject*));
1465 dest = pa;
1466 pa = ms->a;
1468 *dest++ = *pb++;
1469 --nb;
1470 if (nb == 0)
1471 goto Succeed;
1472 if (na == 1)
1473 goto CopyB;
1475 min_gallop = ms->min_gallop;
1476 compare = ms->compare;
1477 for (;;) {
1478 Py_ssize_t acount = 0; /* # of times A won in a row */
1479 Py_ssize_t bcount = 0; /* # of times B won in a row */
1481 /* Do the straightforward thing until (if ever) one run
1482 * appears to win consistently.
1484 for (;;) {
1485 assert(na > 1 && nb > 0);
1486 k = ISLT(*pb, *pa, compare);
1487 if (k) {
1488 if (k < 0)
1489 goto Fail;
1490 *dest++ = *pb++;
1491 ++bcount;
1492 acount = 0;
1493 --nb;
1494 if (nb == 0)
1495 goto Succeed;
1496 if (bcount >= min_gallop)
1497 break;
1499 else {
1500 *dest++ = *pa++;
1501 ++acount;
1502 bcount = 0;
1503 --na;
1504 if (na == 1)
1505 goto CopyB;
1506 if (acount >= min_gallop)
1507 break;
1511 /* One run is winning so consistently that galloping may
1512 * be a huge win. So try that, and continue galloping until
1513 * (if ever) neither run appears to be winning consistently
1514 * anymore.
1516 ++min_gallop;
1517 do {
1518 assert(na > 1 && nb > 0);
1519 min_gallop -= min_gallop > 1;
1520 ms->min_gallop = min_gallop;
1521 k = gallop_right(*pb, pa, na, 0, compare);
1522 acount = k;
1523 if (k) {
1524 if (k < 0)
1525 goto Fail;
1526 memcpy(dest, pa, k * sizeof(PyObject *));
1527 dest += k;
1528 pa += k;
1529 na -= k;
1530 if (na == 1)
1531 goto CopyB;
1532 /* na==0 is impossible now if the comparison
1533 * function is consistent, but we can't assume
1534 * that it is.
1536 if (na == 0)
1537 goto Succeed;
1539 *dest++ = *pb++;
1540 --nb;
1541 if (nb == 0)
1542 goto Succeed;
1544 k = gallop_left(*pa, pb, nb, 0, compare);
1545 bcount = k;
1546 if (k) {
1547 if (k < 0)
1548 goto Fail;
1549 memmove(dest, pb, k * sizeof(PyObject *));
1550 dest += k;
1551 pb += k;
1552 nb -= k;
1553 if (nb == 0)
1554 goto Succeed;
1556 *dest++ = *pa++;
1557 --na;
1558 if (na == 1)
1559 goto CopyB;
1560 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1561 ++min_gallop; /* penalize it for leaving galloping mode */
1562 ms->min_gallop = min_gallop;
1564 Succeed:
1565 result = 0;
1566 Fail:
1567 if (na)
1568 memcpy(dest, pa, na * sizeof(PyObject*));
1569 return result;
1570 CopyB:
1571 assert(na == 1 && nb > 0);
1572 /* The last element of pa belongs at the end of the merge. */
1573 memmove(dest, pb, nb * sizeof(PyObject *));
1574 dest[nb] = *pa;
1575 return 0;
1578 /* Merge the na elements starting at pa with the nb elements starting at pb
1579 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1580 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1581 * merge, and should have na >= nb. See listsort.txt for more info.
1582 * Return 0 if successful, -1 if error.
1584 static Py_ssize_t
1585 merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
1587 Py_ssize_t k;
1588 PyObject *compare;
1589 PyObject **dest;
1590 int result = -1; /* guilty until proved innocent */
1591 PyObject **basea;
1592 PyObject **baseb;
1593 Py_ssize_t min_gallop;
1595 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1596 if (MERGE_GETMEM(ms, nb) < 0)
1597 return -1;
1598 dest = pb + nb - 1;
1599 memcpy(ms->a, pb, nb * sizeof(PyObject*));
1600 basea = pa;
1601 baseb = ms->a;
1602 pb = ms->a + nb - 1;
1603 pa += na - 1;
1605 *dest-- = *pa--;
1606 --na;
1607 if (na == 0)
1608 goto Succeed;
1609 if (nb == 1)
1610 goto CopyA;
1612 min_gallop = ms->min_gallop;
1613 compare = ms->compare;
1614 for (;;) {
1615 Py_ssize_t acount = 0; /* # of times A won in a row */
1616 Py_ssize_t bcount = 0; /* # of times B won in a row */
1618 /* Do the straightforward thing until (if ever) one run
1619 * appears to win consistently.
1621 for (;;) {
1622 assert(na > 0 && nb > 1);
1623 k = ISLT(*pb, *pa, compare);
1624 if (k) {
1625 if (k < 0)
1626 goto Fail;
1627 *dest-- = *pa--;
1628 ++acount;
1629 bcount = 0;
1630 --na;
1631 if (na == 0)
1632 goto Succeed;
1633 if (acount >= min_gallop)
1634 break;
1636 else {
1637 *dest-- = *pb--;
1638 ++bcount;
1639 acount = 0;
1640 --nb;
1641 if (nb == 1)
1642 goto CopyA;
1643 if (bcount >= min_gallop)
1644 break;
1648 /* One run is winning so consistently that galloping may
1649 * be a huge win. So try that, and continue galloping until
1650 * (if ever) neither run appears to be winning consistently
1651 * anymore.
1653 ++min_gallop;
1654 do {
1655 assert(na > 0 && nb > 1);
1656 min_gallop -= min_gallop > 1;
1657 ms->min_gallop = min_gallop;
1658 k = gallop_right(*pb, basea, na, na-1, compare);
1659 if (k < 0)
1660 goto Fail;
1661 k = na - k;
1662 acount = k;
1663 if (k) {
1664 dest -= k;
1665 pa -= k;
1666 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1667 na -= k;
1668 if (na == 0)
1669 goto Succeed;
1671 *dest-- = *pb--;
1672 --nb;
1673 if (nb == 1)
1674 goto CopyA;
1676 k = gallop_left(*pa, baseb, nb, nb-1, compare);
1677 if (k < 0)
1678 goto Fail;
1679 k = nb - k;
1680 bcount = k;
1681 if (k) {
1682 dest -= k;
1683 pb -= k;
1684 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1685 nb -= k;
1686 if (nb == 1)
1687 goto CopyA;
1688 /* nb==0 is impossible now if the comparison
1689 * function is consistent, but we can't assume
1690 * that it is.
1692 if (nb == 0)
1693 goto Succeed;
1695 *dest-- = *pa--;
1696 --na;
1697 if (na == 0)
1698 goto Succeed;
1699 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1700 ++min_gallop; /* penalize it for leaving galloping mode */
1701 ms->min_gallop = min_gallop;
1703 Succeed:
1704 result = 0;
1705 Fail:
1706 if (nb)
1707 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1708 return result;
1709 CopyA:
1710 assert(nb == 1 && na > 0);
1711 /* The first element of pb belongs at the front of the merge. */
1712 dest -= na;
1713 pa -= na;
1714 memmove(dest+1, pa+1, na * sizeof(PyObject *));
1715 *dest = *pb;
1716 return 0;
1719 /* Merge the two runs at stack indices i and i+1.
1720 * Returns 0 on success, -1 on error.
1722 static Py_ssize_t
1723 merge_at(MergeState *ms, Py_ssize_t i)
1725 PyObject **pa, **pb;
1726 Py_ssize_t na, nb;
1727 Py_ssize_t k;
1728 PyObject *compare;
1730 assert(ms != NULL);
1731 assert(ms->n >= 2);
1732 assert(i >= 0);
1733 assert(i == ms->n - 2 || i == ms->n - 3);
1735 pa = ms->pending[i].base;
1736 na = ms->pending[i].len;
1737 pb = ms->pending[i+1].base;
1738 nb = ms->pending[i+1].len;
1739 assert(na > 0 && nb > 0);
1740 assert(pa + na == pb);
1742 /* Record the length of the combined runs; if i is the 3rd-last
1743 * run now, also slide over the last run (which isn't involved
1744 * in this merge). The current run i+1 goes away in any case.
1746 ms->pending[i].len = na + nb;
1747 if (i == ms->n - 3)
1748 ms->pending[i+1] = ms->pending[i+2];
1749 --ms->n;
1751 /* Where does b start in a? Elements in a before that can be
1752 * ignored (already in place).
1754 compare = ms->compare;
1755 k = gallop_right(*pb, pa, na, 0, compare);
1756 if (k < 0)
1757 return -1;
1758 pa += k;
1759 na -= k;
1760 if (na == 0)
1761 return 0;
1763 /* Where does a end in b? Elements in b after that can be
1764 * ignored (already in place).
1766 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1767 if (nb <= 0)
1768 return nb;
1770 /* Merge what remains of the runs, using a temp array with
1771 * min(na, nb) elements.
1773 if (na <= nb)
1774 return merge_lo(ms, pa, na, pb, nb);
1775 else
1776 return merge_hi(ms, pa, na, pb, nb);
1779 /* Examine the stack of runs waiting to be merged, merging adjacent runs
1780 * until the stack invariants are re-established:
1782 * 1. len[-3] > len[-2] + len[-1]
1783 * 2. len[-2] > len[-1]
1785 * See listsort.txt for more info.
1787 * Returns 0 on success, -1 on error.
1789 static int
1790 merge_collapse(MergeState *ms)
1792 struct s_slice *p = ms->pending;
1794 assert(ms);
1795 while (ms->n > 1) {
1796 Py_ssize_t n = ms->n - 2;
1797 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
1798 if (p[n-1].len < p[n+1].len)
1799 --n;
1800 if (merge_at(ms, n) < 0)
1801 return -1;
1803 else if (p[n].len <= p[n+1].len) {
1804 if (merge_at(ms, n) < 0)
1805 return -1;
1807 else
1808 break;
1810 return 0;
1813 /* Regardless of invariants, merge all runs on the stack until only one
1814 * remains. This is used at the end of the mergesort.
1816 * Returns 0 on success, -1 on error.
1818 static int
1819 merge_force_collapse(MergeState *ms)
1821 struct s_slice *p = ms->pending;
1823 assert(ms);
1824 while (ms->n > 1) {
1825 Py_ssize_t n = ms->n - 2;
1826 if (n > 0 && p[n-1].len < p[n+1].len)
1827 --n;
1828 if (merge_at(ms, n) < 0)
1829 return -1;
1831 return 0;
1834 /* Compute a good value for the minimum run length; natural runs shorter
1835 * than this are boosted artificially via binary insertion.
1837 * If n < 64, return n (it's too small to bother with fancy stuff).
1838 * Else if n is an exact power of 2, return 32.
1839 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1840 * strictly less than, an exact power of 2.
1842 * See listsort.txt for more info.
1844 static Py_ssize_t
1845 merge_compute_minrun(Py_ssize_t n)
1847 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
1849 assert(n >= 0);
1850 while (n >= 64) {
1851 r |= n & 1;
1852 n >>= 1;
1854 return n + r;
1857 /* Special wrapper to support stable sorting using the decorate-sort-undecorate
1858 pattern. Holds a key which is used for comparisons and the original record
1859 which is returned during the undecorate phase. By exposing only the key
1860 during comparisons, the underlying sort stability characteristics are left
1861 unchanged. Also, if a custom comparison function is used, it will only see
1862 the key instead of a full record. */
1864 typedef struct {
1865 PyObject_HEAD
1866 PyObject *key;
1867 PyObject *value;
1868 } sortwrapperobject;
1870 PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
1871 static PyObject *
1872 sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1873 static void
1874 sortwrapper_dealloc(sortwrapperobject *);
1876 static PyTypeObject sortwrapper_type = {
1877 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1878 "sortwrapper", /* tp_name */
1879 sizeof(sortwrapperobject), /* tp_basicsize */
1880 0, /* tp_itemsize */
1881 /* methods */
1882 (destructor)sortwrapper_dealloc, /* tp_dealloc */
1883 0, /* tp_print */
1884 0, /* tp_getattr */
1885 0, /* tp_setattr */
1886 0, /* tp_compare */
1887 0, /* tp_repr */
1888 0, /* tp_as_number */
1889 0, /* tp_as_sequence */
1890 0, /* tp_as_mapping */
1891 0, /* tp_hash */
1892 0, /* tp_call */
1893 0, /* tp_str */
1894 PyObject_GenericGetAttr, /* tp_getattro */
1895 0, /* tp_setattro */
1896 0, /* tp_as_buffer */
1897 Py_TPFLAGS_DEFAULT |
1898 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */
1899 sortwrapper_doc, /* tp_doc */
1900 0, /* tp_traverse */
1901 0, /* tp_clear */
1902 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */
1906 static PyObject *
1907 sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1909 if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1910 PyErr_SetString(PyExc_TypeError,
1911 "expected a sortwrapperobject");
1912 return NULL;
1914 return PyObject_RichCompare(a->key, b->key, op);
1917 static void
1918 sortwrapper_dealloc(sortwrapperobject *so)
1920 Py_XDECREF(so->key);
1921 Py_XDECREF(so->value);
1922 PyObject_Del(so);
1925 /* Returns a new reference to a sortwrapper.
1926 Consumes the references to the two underlying objects. */
1928 static PyObject *
1929 build_sortwrapper(PyObject *key, PyObject *value)
1931 sortwrapperobject *so;
1933 so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1934 if (so == NULL)
1935 return NULL;
1936 so->key = key;
1937 so->value = value;
1938 return (PyObject *)so;
1941 /* Returns a new reference to the value underlying the wrapper. */
1942 static PyObject *
1943 sortwrapper_getvalue(PyObject *so)
1945 PyObject *value;
1947 if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
1948 PyErr_SetString(PyExc_TypeError,
1949 "expected a sortwrapperobject");
1950 return NULL;
1952 value = ((sortwrapperobject *)so)->value;
1953 Py_INCREF(value);
1954 return value;
1957 /* Wrapper for user specified cmp functions in combination with a
1958 specified key function. Makes sure the cmp function is presented
1959 with the actual key instead of the sortwrapper */
1961 typedef struct {
1962 PyObject_HEAD
1963 PyObject *func;
1964 } cmpwrapperobject;
1966 static void
1967 cmpwrapper_dealloc(cmpwrapperobject *co)
1969 Py_XDECREF(co->func);
1970 PyObject_Del(co);
1973 static PyObject *
1974 cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1976 PyObject *x, *y, *xx, *yy;
1978 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1979 return NULL;
1980 if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
1981 !PyObject_TypeCheck(y, &sortwrapper_type)) {
1982 PyErr_SetString(PyExc_TypeError,
1983 "expected a sortwrapperobject");
1984 return NULL;
1986 xx = ((sortwrapperobject *)x)->key;
1987 yy = ((sortwrapperobject *)y)->key;
1988 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1991 PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1993 static PyTypeObject cmpwrapper_type = {
1994 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1995 "cmpwrapper", /* tp_name */
1996 sizeof(cmpwrapperobject), /* tp_basicsize */
1997 0, /* tp_itemsize */
1998 /* methods */
1999 (destructor)cmpwrapper_dealloc, /* tp_dealloc */
2000 0, /* tp_print */
2001 0, /* tp_getattr */
2002 0, /* tp_setattr */
2003 0, /* tp_compare */
2004 0, /* tp_repr */
2005 0, /* tp_as_number */
2006 0, /* tp_as_sequence */
2007 0, /* tp_as_mapping */
2008 0, /* tp_hash */
2009 (ternaryfunc)cmpwrapper_call, /* tp_call */
2010 0, /* tp_str */
2011 PyObject_GenericGetAttr, /* tp_getattro */
2012 0, /* tp_setattro */
2013 0, /* tp_as_buffer */
2014 Py_TPFLAGS_DEFAULT, /* tp_flags */
2015 cmpwrapper_doc, /* tp_doc */
2018 static PyObject *
2019 build_cmpwrapper(PyObject *cmpfunc)
2021 cmpwrapperobject *co;
2023 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
2024 if (co == NULL)
2025 return NULL;
2026 Py_INCREF(cmpfunc);
2027 co->func = cmpfunc;
2028 return (PyObject *)co;
2031 /* An adaptive, stable, natural mergesort. See listsort.txt.
2032 * Returns Py_None on success, NULL on error. Even in case of error, the
2033 * list will be some permutation of its input state (nothing is lost or
2034 * duplicated).
2036 static PyObject *
2037 listsort(PyListObject *self, PyObject *args, PyObject *kwds)
2039 MergeState ms;
2040 PyObject **lo, **hi;
2041 Py_ssize_t nremaining;
2042 Py_ssize_t minrun;
2043 Py_ssize_t saved_ob_size, saved_allocated;
2044 PyObject **saved_ob_item;
2045 PyObject **final_ob_item;
2046 PyObject *compare = NULL;
2047 PyObject *result = NULL; /* guilty until proved innocent */
2048 int reverse = 0;
2049 PyObject *keyfunc = NULL;
2050 Py_ssize_t i;
2051 PyObject *key, *value, *kvpair;
2052 static char *kwlist[] = {"cmp", "key", "reverse", 0};
2054 assert(self != NULL);
2055 assert (PyList_Check(self));
2056 if (args != NULL) {
2057 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2058 kwlist, &compare, &keyfunc, &reverse))
2059 return NULL;
2061 if (compare == Py_None)
2062 compare = NULL;
2063 if (compare != NULL &&
2064 PyErr_WarnPy3k("the cmp argument is not supported in 3.x", 1) < 0)
2065 return NULL;
2066 if (keyfunc == Py_None)
2067 keyfunc = NULL;
2068 if (compare != NULL && keyfunc != NULL) {
2069 compare = build_cmpwrapper(compare);
2070 if (compare == NULL)
2071 return NULL;
2072 } else
2073 Py_XINCREF(compare);
2075 /* The list is temporarily made empty, so that mutations performed
2076 * by comparison functions can't affect the slice of memory we're
2077 * sorting (allowing mutations during sorting is a core-dump
2078 * factory, since ob_item may change).
2080 saved_ob_size = Py_SIZE(self);
2081 saved_ob_item = self->ob_item;
2082 saved_allocated = self->allocated;
2083 Py_SIZE(self) = 0;
2084 self->ob_item = NULL;
2085 self->allocated = -1; /* any operation will reset it to >= 0 */
2087 if (keyfunc != NULL) {
2088 for (i=0 ; i < saved_ob_size ; i++) {
2089 value = saved_ob_item[i];
2090 key = PyObject_CallFunctionObjArgs(keyfunc, value,
2091 NULL);
2092 if (key == NULL) {
2093 for (i=i-1 ; i>=0 ; i--) {
2094 kvpair = saved_ob_item[i];
2095 value = sortwrapper_getvalue(kvpair);
2096 saved_ob_item[i] = value;
2097 Py_DECREF(kvpair);
2099 goto dsu_fail;
2101 kvpair = build_sortwrapper(key, value);
2102 if (kvpair == NULL)
2103 goto dsu_fail;
2104 saved_ob_item[i] = kvpair;
2108 /* Reverse sort stability achieved by initially reversing the list,
2109 applying a stable forward sort, then reversing the final result. */
2110 if (reverse && saved_ob_size > 1)
2111 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2113 merge_init(&ms, compare);
2115 nremaining = saved_ob_size;
2116 if (nremaining < 2)
2117 goto succeed;
2119 /* March over the array once, left to right, finding natural runs,
2120 * and extending short natural runs to minrun elements.
2122 lo = saved_ob_item;
2123 hi = lo + nremaining;
2124 minrun = merge_compute_minrun(nremaining);
2125 do {
2126 int descending;
2127 Py_ssize_t n;
2129 /* Identify next run. */
2130 n = count_run(lo, hi, compare, &descending);
2131 if (n < 0)
2132 goto fail;
2133 if (descending)
2134 reverse_slice(lo, lo + n);
2135 /* If short, extend to min(minrun, nremaining). */
2136 if (n < minrun) {
2137 const Py_ssize_t force = nremaining <= minrun ?
2138 nremaining : minrun;
2139 if (binarysort(lo, lo + force, lo + n, compare) < 0)
2140 goto fail;
2141 n = force;
2143 /* Push run onto pending-runs stack, and maybe merge. */
2144 assert(ms.n < MAX_MERGE_PENDING);
2145 ms.pending[ms.n].base = lo;
2146 ms.pending[ms.n].len = n;
2147 ++ms.n;
2148 if (merge_collapse(&ms) < 0)
2149 goto fail;
2150 /* Advance to find next run. */
2151 lo += n;
2152 nremaining -= n;
2153 } while (nremaining);
2154 assert(lo == hi);
2156 if (merge_force_collapse(&ms) < 0)
2157 goto fail;
2158 assert(ms.n == 1);
2159 assert(ms.pending[0].base == saved_ob_item);
2160 assert(ms.pending[0].len == saved_ob_size);
2162 succeed:
2163 result = Py_None;
2164 fail:
2165 if (keyfunc != NULL) {
2166 for (i=0 ; i < saved_ob_size ; i++) {
2167 kvpair = saved_ob_item[i];
2168 value = sortwrapper_getvalue(kvpair);
2169 saved_ob_item[i] = value;
2170 Py_DECREF(kvpair);
2174 if (self->allocated != -1 && result != NULL) {
2175 /* The user mucked with the list during the sort,
2176 * and we don't already have another error to report.
2178 PyErr_SetString(PyExc_ValueError, "list modified during sort");
2179 result = NULL;
2182 if (reverse && saved_ob_size > 1)
2183 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2185 merge_freemem(&ms);
2187 dsu_fail:
2188 final_ob_item = self->ob_item;
2189 i = Py_SIZE(self);
2190 Py_SIZE(self) = saved_ob_size;
2191 self->ob_item = saved_ob_item;
2192 self->allocated = saved_allocated;
2193 if (final_ob_item != NULL) {
2194 /* we cannot use list_clear() for this because it does not
2195 guarantee that the list is really empty when it returns */
2196 while (--i >= 0) {
2197 Py_XDECREF(final_ob_item[i]);
2199 PyMem_FREE(final_ob_item);
2201 Py_XDECREF(compare);
2202 Py_XINCREF(result);
2203 return result;
2205 #undef IFLT
2206 #undef ISLT
2209 PyList_Sort(PyObject *v)
2211 if (v == NULL || !PyList_Check(v)) {
2212 PyErr_BadInternalCall();
2213 return -1;
2215 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2216 if (v == NULL)
2217 return -1;
2218 Py_DECREF(v);
2219 return 0;
2222 static PyObject *
2223 listreverse(PyListObject *self)
2225 if (Py_SIZE(self) > 1)
2226 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2227 Py_RETURN_NONE;
2231 PyList_Reverse(PyObject *v)
2233 PyListObject *self = (PyListObject *)v;
2235 if (v == NULL || !PyList_Check(v)) {
2236 PyErr_BadInternalCall();
2237 return -1;
2239 if (Py_SIZE(self) > 1)
2240 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2241 return 0;
2244 PyObject *
2245 PyList_AsTuple(PyObject *v)
2247 PyObject *w;
2248 PyObject **p, **q;
2249 Py_ssize_t n;
2250 if (v == NULL || !PyList_Check(v)) {
2251 PyErr_BadInternalCall();
2252 return NULL;
2254 n = Py_SIZE(v);
2255 w = PyTuple_New(n);
2256 if (w == NULL)
2257 return NULL;
2258 p = ((PyTupleObject *)w)->ob_item;
2259 q = ((PyListObject *)v)->ob_item;
2260 while (--n >= 0) {
2261 Py_INCREF(*q);
2262 *p = *q;
2263 p++;
2264 q++;
2266 return w;
2269 static PyObject *
2270 listindex(PyListObject *self, PyObject *args)
2272 Py_ssize_t i, start=0, stop=Py_SIZE(self);
2273 PyObject *v;
2275 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2276 _PyEval_SliceIndex, &start,
2277 _PyEval_SliceIndex, &stop))
2278 return NULL;
2279 if (start < 0) {
2280 start += Py_SIZE(self);
2281 if (start < 0)
2282 start = 0;
2284 if (stop < 0) {
2285 stop += Py_SIZE(self);
2286 if (stop < 0)
2287 stop = 0;
2289 for (i = start; i < stop && i < Py_SIZE(self); i++) {
2290 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2291 if (cmp > 0)
2292 return PyInt_FromSsize_t(i);
2293 else if (cmp < 0)
2294 return NULL;
2296 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
2297 return NULL;
2300 static PyObject *
2301 listcount(PyListObject *self, PyObject *v)
2303 Py_ssize_t count = 0;
2304 Py_ssize_t i;
2306 for (i = 0; i < Py_SIZE(self); i++) {
2307 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2308 if (cmp > 0)
2309 count++;
2310 else if (cmp < 0)
2311 return NULL;
2313 return PyInt_FromSsize_t(count);
2316 static PyObject *
2317 listremove(PyListObject *self, PyObject *v)
2319 Py_ssize_t i;
2321 for (i = 0; i < Py_SIZE(self); i++) {
2322 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2323 if (cmp > 0) {
2324 if (list_ass_slice(self, i, i+1,
2325 (PyObject *)NULL) == 0)
2326 Py_RETURN_NONE;
2327 return NULL;
2329 else if (cmp < 0)
2330 return NULL;
2332 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2333 return NULL;
2336 static int
2337 list_traverse(PyListObject *o, visitproc visit, void *arg)
2339 Py_ssize_t i;
2341 for (i = Py_SIZE(o); --i >= 0; )
2342 Py_VISIT(o->ob_item[i]);
2343 return 0;
2346 static PyObject *
2347 list_richcompare(PyObject *v, PyObject *w, int op)
2349 PyListObject *vl, *wl;
2350 Py_ssize_t i;
2352 if (!PyList_Check(v) || !PyList_Check(w)) {
2353 Py_INCREF(Py_NotImplemented);
2354 return Py_NotImplemented;
2357 vl = (PyListObject *)v;
2358 wl = (PyListObject *)w;
2360 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2361 /* Shortcut: if the lengths differ, the lists differ */
2362 PyObject *res;
2363 if (op == Py_EQ)
2364 res = Py_False;
2365 else
2366 res = Py_True;
2367 Py_INCREF(res);
2368 return res;
2371 /* Search for the first index where items are different */
2372 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2373 int k = PyObject_RichCompareBool(vl->ob_item[i],
2374 wl->ob_item[i], Py_EQ);
2375 if (k < 0)
2376 return NULL;
2377 if (!k)
2378 break;
2381 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2382 /* No more items to compare -- compare sizes */
2383 Py_ssize_t vs = Py_SIZE(vl);
2384 Py_ssize_t ws = Py_SIZE(wl);
2385 int cmp;
2386 PyObject *res;
2387 switch (op) {
2388 case Py_LT: cmp = vs < ws; break;
2389 case Py_LE: cmp = vs <= ws; break;
2390 case Py_EQ: cmp = vs == ws; break;
2391 case Py_NE: cmp = vs != ws; break;
2392 case Py_GT: cmp = vs > ws; break;
2393 case Py_GE: cmp = vs >= ws; break;
2394 default: return NULL; /* cannot happen */
2396 if (cmp)
2397 res = Py_True;
2398 else
2399 res = Py_False;
2400 Py_INCREF(res);
2401 return res;
2404 /* We have an item that differs -- shortcuts for EQ/NE */
2405 if (op == Py_EQ) {
2406 Py_INCREF(Py_False);
2407 return Py_False;
2409 if (op == Py_NE) {
2410 Py_INCREF(Py_True);
2411 return Py_True;
2414 /* Compare the final item again using the proper operator */
2415 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2418 static int
2419 list_init(PyListObject *self, PyObject *args, PyObject *kw)
2421 PyObject *arg = NULL;
2422 static char *kwlist[] = {"sequence", 0};
2424 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2425 return -1;
2427 /* Verify list invariants established by PyType_GenericAlloc() */
2428 assert(0 <= Py_SIZE(self));
2429 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2430 assert(self->ob_item != NULL ||
2431 self->allocated == 0 || self->allocated == -1);
2433 /* Empty previous contents */
2434 if (self->ob_item != NULL) {
2435 (void)list_clear(self);
2437 if (arg != NULL) {
2438 PyObject *rv = listextend(self, arg);
2439 if (rv == NULL)
2440 return -1;
2441 Py_DECREF(rv);
2443 return 0;
2446 static PyObject *
2447 list_sizeof(PyListObject *self)
2449 Py_ssize_t res;
2451 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
2452 return PyInt_FromSsize_t(res);
2455 static PyObject *list_iter(PyObject *seq);
2456 static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2458 PyDoc_STRVAR(getitem_doc,
2459 "x.__getitem__(y) <==> x[y]");
2460 PyDoc_STRVAR(reversed_doc,
2461 "L.__reversed__() -- return a reverse iterator over the list");
2462 PyDoc_STRVAR(sizeof_doc,
2463 "L.__sizeof__() -- size of L in memory, in bytes");
2464 PyDoc_STRVAR(append_doc,
2465 "L.append(object) -- append object to end");
2466 PyDoc_STRVAR(extend_doc,
2467 "L.extend(iterable) -- extend list by appending elements from the iterable");
2468 PyDoc_STRVAR(insert_doc,
2469 "L.insert(index, object) -- insert object before index");
2470 PyDoc_STRVAR(pop_doc,
2471 "L.pop([index]) -> item -- remove and return item at index (default last).\n"
2472 "Raises IndexError if list is empty or index is out of range.");
2473 PyDoc_STRVAR(remove_doc,
2474 "L.remove(value) -- remove first occurrence of value.\n"
2475 "Raises ValueError if the value is not present.");
2476 PyDoc_STRVAR(index_doc,
2477 "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2478 "Raises ValueError if the value is not present.");
2479 PyDoc_STRVAR(count_doc,
2480 "L.count(value) -> integer -- return number of occurrences of value");
2481 PyDoc_STRVAR(reverse_doc,
2482 "L.reverse() -- reverse *IN PLACE*");
2483 PyDoc_STRVAR(sort_doc,
2484 "L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2485 cmp(x, y) -> -1, 0, 1");
2487 static PyObject *list_subscript(PyListObject*, PyObject*);
2489 static PyMethodDef list_methods[] = {
2490 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2491 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2492 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
2493 {"append", (PyCFunction)listappend, METH_O, append_doc},
2494 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
2495 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
2496 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
2497 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
2498 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
2499 {"count", (PyCFunction)listcount, METH_O, count_doc},
2500 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2501 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
2502 {NULL, NULL} /* sentinel */
2505 static PySequenceMethods list_as_sequence = {
2506 (lenfunc)list_length, /* sq_length */
2507 (binaryfunc)list_concat, /* sq_concat */
2508 (ssizeargfunc)list_repeat, /* sq_repeat */
2509 (ssizeargfunc)list_item, /* sq_item */
2510 (ssizessizeargfunc)list_slice, /* sq_slice */
2511 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
2512 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */
2513 (objobjproc)list_contains, /* sq_contains */
2514 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
2515 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
2518 PyDoc_STRVAR(list_doc,
2519 "list() -> new list\n"
2520 "list(sequence) -> new list initialized from sequence's items");
2523 static PyObject *
2524 list_subscript(PyListObject* self, PyObject* item)
2526 if (PyIndex_Check(item)) {
2527 Py_ssize_t i;
2528 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2529 if (i == -1 && PyErr_Occurred())
2530 return NULL;
2531 if (i < 0)
2532 i += PyList_GET_SIZE(self);
2533 return list_item(self, i);
2535 else if (PySlice_Check(item)) {
2536 Py_ssize_t start, stop, step, slicelength, cur, i;
2537 PyObject* result;
2538 PyObject* it;
2539 PyObject **src, **dest;
2541 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
2542 &start, &stop, &step, &slicelength) < 0) {
2543 return NULL;
2546 if (slicelength <= 0) {
2547 return PyList_New(0);
2549 else if (step == 1) {
2550 return list_slice(self, start, stop);
2552 else {
2553 result = PyList_New(slicelength);
2554 if (!result) return NULL;
2556 src = self->ob_item;
2557 dest = ((PyListObject *)result)->ob_item;
2558 for (cur = start, i = 0; i < slicelength;
2559 cur += step, i++) {
2560 it = src[cur];
2561 Py_INCREF(it);
2562 dest[i] = it;
2565 return result;
2568 else {
2569 PyErr_Format(PyExc_TypeError,
2570 "list indices must be integers, not %.200s",
2571 item->ob_type->tp_name);
2572 return NULL;
2576 static int
2577 list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2579 if (PyIndex_Check(item)) {
2580 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2581 if (i == -1 && PyErr_Occurred())
2582 return -1;
2583 if (i < 0)
2584 i += PyList_GET_SIZE(self);
2585 return list_ass_item(self, i, value);
2587 else if (PySlice_Check(item)) {
2588 Py_ssize_t start, stop, step, slicelength;
2590 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
2591 &start, &stop, &step, &slicelength) < 0) {
2592 return -1;
2595 if (step == 1)
2596 return list_ass_slice(self, start, stop, value);
2598 /* Make sure s[5:2] = [..] inserts at the right place:
2599 before 5, not before 2. */
2600 if ((step < 0 && start < stop) ||
2601 (step > 0 && start > stop))
2602 stop = start;
2604 if (value == NULL) {
2605 /* delete slice */
2606 PyObject **garbage;
2607 Py_ssize_t cur, i;
2609 if (slicelength <= 0)
2610 return 0;
2612 if (step < 0) {
2613 stop = start + 1;
2614 start = stop + step*(slicelength - 1) - 1;
2615 step = -step;
2618 assert(slicelength <= PY_SIZE_MAX / sizeof(PyObject*));
2620 garbage = (PyObject**)
2621 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2622 if (!garbage) {
2623 PyErr_NoMemory();
2624 return -1;
2627 /* drawing pictures might help understand these for
2628 loops. Basically, we memmove the parts of the
2629 list that are *not* part of the slice: step-1
2630 items for each item that is part of the slice,
2631 and then tail end of the list that was not
2632 covered by the slice */
2633 for (cur = start, i = 0;
2634 cur < stop;
2635 cur += step, i++) {
2636 Py_ssize_t lim = step - 1;
2638 garbage[i] = PyList_GET_ITEM(self, cur);
2640 if (cur + step >= Py_SIZE(self)) {
2641 lim = Py_SIZE(self) - cur - 1;
2644 memmove(self->ob_item + cur - i,
2645 self->ob_item + cur + 1,
2646 lim * sizeof(PyObject *));
2648 cur = start + slicelength*step;
2649 if (cur < Py_SIZE(self)) {
2650 memmove(self->ob_item + cur - slicelength,
2651 self->ob_item + cur,
2652 (Py_SIZE(self) - cur) *
2653 sizeof(PyObject *));
2656 Py_SIZE(self) -= slicelength;
2657 list_resize(self, Py_SIZE(self));
2659 for (i = 0; i < slicelength; i++) {
2660 Py_DECREF(garbage[i]);
2662 PyMem_FREE(garbage);
2664 return 0;
2666 else {
2667 /* assign slice */
2668 PyObject *ins, *seq;
2669 PyObject **garbage, **seqitems, **selfitems;
2670 Py_ssize_t cur, i;
2672 /* protect against a[::-1] = a */
2673 if (self == (PyListObject*)value) {
2674 seq = list_slice((PyListObject*)value, 0,
2675 PyList_GET_SIZE(value));
2677 else {
2678 seq = PySequence_Fast(value,
2679 "must assign iterable "
2680 "to extended slice");
2682 if (!seq)
2683 return -1;
2685 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2686 PyErr_Format(PyExc_ValueError,
2687 "attempt to assign sequence of "
2688 "size %zd to extended slice of "
2689 "size %zd",
2690 PySequence_Fast_GET_SIZE(seq),
2691 slicelength);
2692 Py_DECREF(seq);
2693 return -1;
2696 if (!slicelength) {
2697 Py_DECREF(seq);
2698 return 0;
2701 garbage = (PyObject**)
2702 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2703 if (!garbage) {
2704 Py_DECREF(seq);
2705 PyErr_NoMemory();
2706 return -1;
2709 selfitems = self->ob_item;
2710 seqitems = PySequence_Fast_ITEMS(seq);
2711 for (cur = start, i = 0; i < slicelength;
2712 cur += step, i++) {
2713 garbage[i] = selfitems[cur];
2714 ins = seqitems[i];
2715 Py_INCREF(ins);
2716 selfitems[cur] = ins;
2719 for (i = 0; i < slicelength; i++) {
2720 Py_DECREF(garbage[i]);
2723 PyMem_FREE(garbage);
2724 Py_DECREF(seq);
2726 return 0;
2729 else {
2730 PyErr_Format(PyExc_TypeError,
2731 "list indices must be integers, not %.200s",
2732 item->ob_type->tp_name);
2733 return -1;
2737 static PyMappingMethods list_as_mapping = {
2738 (lenfunc)list_length,
2739 (binaryfunc)list_subscript,
2740 (objobjargproc)list_ass_subscript
2743 PyTypeObject PyList_Type = {
2744 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2745 "list",
2746 sizeof(PyListObject),
2748 (destructor)list_dealloc, /* tp_dealloc */
2749 (printfunc)list_print, /* tp_print */
2750 0, /* tp_getattr */
2751 0, /* tp_setattr */
2752 0, /* tp_compare */
2753 (reprfunc)list_repr, /* tp_repr */
2754 0, /* tp_as_number */
2755 &list_as_sequence, /* tp_as_sequence */
2756 &list_as_mapping, /* tp_as_mapping */
2757 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
2758 0, /* tp_call */
2759 0, /* tp_str */
2760 PyObject_GenericGetAttr, /* tp_getattro */
2761 0, /* tp_setattro */
2762 0, /* tp_as_buffer */
2763 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2764 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
2765 list_doc, /* tp_doc */
2766 (traverseproc)list_traverse, /* tp_traverse */
2767 (inquiry)list_clear, /* tp_clear */
2768 list_richcompare, /* tp_richcompare */
2769 0, /* tp_weaklistoffset */
2770 list_iter, /* tp_iter */
2771 0, /* tp_iternext */
2772 list_methods, /* tp_methods */
2773 0, /* tp_members */
2774 0, /* tp_getset */
2775 0, /* tp_base */
2776 0, /* tp_dict */
2777 0, /* tp_descr_get */
2778 0, /* tp_descr_set */
2779 0, /* tp_dictoffset */
2780 (initproc)list_init, /* tp_init */
2781 PyType_GenericAlloc, /* tp_alloc */
2782 PyType_GenericNew, /* tp_new */
2783 PyObject_GC_Del, /* tp_free */
2787 /*********************** List Iterator **************************/
2789 typedef struct {
2790 PyObject_HEAD
2791 long it_index;
2792 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2793 } listiterobject;
2795 static PyObject *list_iter(PyObject *);
2796 static void listiter_dealloc(listiterobject *);
2797 static int listiter_traverse(listiterobject *, visitproc, void *);
2798 static PyObject *listiter_next(listiterobject *);
2799 static PyObject *listiter_len(listiterobject *);
2801 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2803 static PyMethodDef listiter_methods[] = {
2804 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2805 {NULL, NULL} /* sentinel */
2808 PyTypeObject PyListIter_Type = {
2809 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2810 "listiterator", /* tp_name */
2811 sizeof(listiterobject), /* tp_basicsize */
2812 0, /* tp_itemsize */
2813 /* methods */
2814 (destructor)listiter_dealloc, /* tp_dealloc */
2815 0, /* tp_print */
2816 0, /* tp_getattr */
2817 0, /* tp_setattr */
2818 0, /* tp_compare */
2819 0, /* tp_repr */
2820 0, /* tp_as_number */
2821 0, /* tp_as_sequence */
2822 0, /* tp_as_mapping */
2823 0, /* tp_hash */
2824 0, /* tp_call */
2825 0, /* tp_str */
2826 PyObject_GenericGetAttr, /* tp_getattro */
2827 0, /* tp_setattro */
2828 0, /* tp_as_buffer */
2829 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2830 0, /* tp_doc */
2831 (traverseproc)listiter_traverse, /* tp_traverse */
2832 0, /* tp_clear */
2833 0, /* tp_richcompare */
2834 0, /* tp_weaklistoffset */
2835 PyObject_SelfIter, /* tp_iter */
2836 (iternextfunc)listiter_next, /* tp_iternext */
2837 listiter_methods, /* tp_methods */
2838 0, /* tp_members */
2842 static PyObject *
2843 list_iter(PyObject *seq)
2845 listiterobject *it;
2847 if (!PyList_Check(seq)) {
2848 PyErr_BadInternalCall();
2849 return NULL;
2851 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2852 if (it == NULL)
2853 return NULL;
2854 it->it_index = 0;
2855 Py_INCREF(seq);
2856 it->it_seq = (PyListObject *)seq;
2857 _PyObject_GC_TRACK(it);
2858 return (PyObject *)it;
2861 static void
2862 listiter_dealloc(listiterobject *it)
2864 _PyObject_GC_UNTRACK(it);
2865 Py_XDECREF(it->it_seq);
2866 PyObject_GC_Del(it);
2869 static int
2870 listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2872 Py_VISIT(it->it_seq);
2873 return 0;
2876 static PyObject *
2877 listiter_next(listiterobject *it)
2879 PyListObject *seq;
2880 PyObject *item;
2882 assert(it != NULL);
2883 seq = it->it_seq;
2884 if (seq == NULL)
2885 return NULL;
2886 assert(PyList_Check(seq));
2888 if (it->it_index < PyList_GET_SIZE(seq)) {
2889 item = PyList_GET_ITEM(seq, it->it_index);
2890 ++it->it_index;
2891 Py_INCREF(item);
2892 return item;
2895 Py_DECREF(seq);
2896 it->it_seq = NULL;
2897 return NULL;
2900 static PyObject *
2901 listiter_len(listiterobject *it)
2903 Py_ssize_t len;
2904 if (it->it_seq) {
2905 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2906 if (len >= 0)
2907 return PyInt_FromSsize_t(len);
2909 return PyInt_FromLong(0);
2911 /*********************** List Reverse Iterator **************************/
2913 typedef struct {
2914 PyObject_HEAD
2915 Py_ssize_t it_index;
2916 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2917 } listreviterobject;
2919 static PyObject *list_reversed(PyListObject *, PyObject *);
2920 static void listreviter_dealloc(listreviterobject *);
2921 static int listreviter_traverse(listreviterobject *, visitproc, void *);
2922 static PyObject *listreviter_next(listreviterobject *);
2923 static PyObject *listreviter_len(listreviterobject *);
2925 static PyMethodDef listreviter_methods[] = {
2926 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
2927 {NULL, NULL} /* sentinel */
2930 PyTypeObject PyListRevIter_Type = {
2931 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2932 "listreverseiterator", /* tp_name */
2933 sizeof(listreviterobject), /* tp_basicsize */
2934 0, /* tp_itemsize */
2935 /* methods */
2936 (destructor)listreviter_dealloc, /* tp_dealloc */
2937 0, /* tp_print */
2938 0, /* tp_getattr */
2939 0, /* tp_setattr */
2940 0, /* tp_compare */
2941 0, /* tp_repr */
2942 0, /* tp_as_number */
2943 0, /* tp_as_sequence */
2944 0, /* tp_as_mapping */
2945 0, /* tp_hash */
2946 0, /* tp_call */
2947 0, /* tp_str */
2948 PyObject_GenericGetAttr, /* tp_getattro */
2949 0, /* tp_setattro */
2950 0, /* tp_as_buffer */
2951 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2952 0, /* tp_doc */
2953 (traverseproc)listreviter_traverse, /* tp_traverse */
2954 0, /* tp_clear */
2955 0, /* tp_richcompare */
2956 0, /* tp_weaklistoffset */
2957 PyObject_SelfIter, /* tp_iter */
2958 (iternextfunc)listreviter_next, /* tp_iternext */
2959 listreviter_methods, /* tp_methods */
2963 static PyObject *
2964 list_reversed(PyListObject *seq, PyObject *unused)
2966 listreviterobject *it;
2968 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2969 if (it == NULL)
2970 return NULL;
2971 assert(PyList_Check(seq));
2972 it->it_index = PyList_GET_SIZE(seq) - 1;
2973 Py_INCREF(seq);
2974 it->it_seq = seq;
2975 PyObject_GC_Track(it);
2976 return (PyObject *)it;
2979 static void
2980 listreviter_dealloc(listreviterobject *it)
2982 PyObject_GC_UnTrack(it);
2983 Py_XDECREF(it->it_seq);
2984 PyObject_GC_Del(it);
2987 static int
2988 listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
2990 Py_VISIT(it->it_seq);
2991 return 0;
2994 static PyObject *
2995 listreviter_next(listreviterobject *it)
2997 PyObject *item;
2998 Py_ssize_t index = it->it_index;
2999 PyListObject *seq = it->it_seq;
3001 if (index>=0 && index < PyList_GET_SIZE(seq)) {
3002 item = PyList_GET_ITEM(seq, index);
3003 it->it_index--;
3004 Py_INCREF(item);
3005 return item;
3007 it->it_index = -1;
3008 if (seq != NULL) {
3009 it->it_seq = NULL;
3010 Py_DECREF(seq);
3012 return NULL;
3015 static PyObject *
3016 listreviter_len(listreviterobject *it)
3018 Py_ssize_t len = it->it_index + 1;
3019 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
3020 len = 0;
3021 return PyLong_FromSsize_t(len);