1 /* List object implementation */
2 
3 #include "Python.h"
4 
5 #ifdef STDC_HEADERS
6 #include <stddef.h>
7 #else
8 #include <sys/types.h>          /* For size_t */
9 #endif
10 
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  * responsibility to overwrite them with sane values.
15  * The number of allocated elements may grow, shrink, or stay the same.
16  * Failure is impossible if newsize <= self.allocated on entry, although
17  * that partly relies on an assumption that the system realloc() never
18  * fails when passed a number of bytes <= the number of bytes last
19  * allocated (the C standard doesn't guarantee this, but it's hard to
20  * imagine a realloc implementation where it wouldn't be true).
21  * Note that self->ob_item may change, and even if newsize is less
22  * than ob_size on entry.
23  */
24 static int
list_resize(PyListObject * self,Py_ssize_t newsize)25 list_resize(PyListObject *self, Py_ssize_t newsize)
26 {
27     PyObject **items;
28     size_t new_allocated;
29     Py_ssize_t allocated = self->allocated;
30 
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.
34     */
35     if (allocated >= newsize && newsize >= (allocated >> 1)) {
36         assert(self->ob_item != NULL || newsize == 0);
37         Py_SIZE(self) = newsize;
38         return 0;
39     }
40 
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, ...
47      */
48     new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
49 
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;
56     }
57 
58     if (newsize == 0)
59         new_allocated = 0;
60     items = self->ob_item;
61     if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *)))
62         PyMem_RESIZE(items, PyObject *, new_allocated);
63     else
64         items = NULL;
65     if (items == NULL) {
66         PyErr_NoMemory();
67         return -1;
68     }
69     self->ob_item = items;
70     Py_SIZE(self) = newsize;
71     self->allocated = new_allocated;
72     return 0;
73 }
74 
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;
80 
81 static void
show_alloc(void)82 show_alloc(void)
83 {
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)));
90 }
91 #endif
92 
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;
99 
100 void
PyList_Fini(void)101 PyList_Fini(void)
102 {
103     PyListObject *op;
104 
105     while (numfree) {
106         op = free_list[--numfree];
107         assert(PyList_CheckExact(op));
108         PyObject_GC_Del(op);
109     }
110 }
111 
112 PyObject *
PyList_New(Py_ssize_t size)113 PyList_New(Py_ssize_t size)
114 {
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;
122     }
123 #endif
124 
125     if (size < 0) {
126         PyErr_BadInternalCall();
127         return NULL;
128     }
129     /* Check for overflow without an actual overflow,
130      *  which can cause compiler to optimise out */
131     if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *))
132         return PyErr_NoMemory();
133     nbytes = size * sizeof(PyObject *);
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
148     }
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();
156         }
157         memset(op->ob_item, 0, nbytes);
158     }
159     Py_SIZE(op) = size;
160     op->allocated = size;
161     _PyObject_GC_TRACK(op);
162     return (PyObject *) op;
163 }
164 
165 Py_ssize_t
PyList_Size(PyObject * op)166 PyList_Size(PyObject *op)
167 {
168     if (!PyList_Check(op)) {
169         PyErr_BadInternalCall();
170         return -1;
171     }
172     else
173         return Py_SIZE(op);
174 }
175 
176 static PyObject *indexerr = NULL;
177 
178 PyObject *
PyList_GetItem(PyObject * op,Py_ssize_t i)179 PyList_GetItem(PyObject *op, Py_ssize_t i)
180 {
181     if (!PyList_Check(op)) {
182         PyErr_BadInternalCall();
183         return NULL;
184     }
185     if (i < 0 || i >= Py_SIZE(op)) {
186         if (indexerr == NULL) {
187             indexerr = PyString_FromString(
188                 "list index out of range");
189             if (indexerr == NULL)
190                 return NULL;
191         }
192         PyErr_SetObject(PyExc_IndexError, indexerr);
193         return NULL;
194     }
195     return ((PyListObject *)op) -> ob_item[i];
196 }
197 
198 int
PyList_SetItem(register PyObject * op,register Py_ssize_t i,register PyObject * newitem)199 PyList_SetItem(register PyObject *op, register Py_ssize_t i,
200                register PyObject *newitem)
201 {
202     register PyObject *olditem;
203     register PyObject **p;
204     if (!PyList_Check(op)) {
205         Py_XDECREF(newitem);
206         PyErr_BadInternalCall();
207         return -1;
208     }
209     if (i < 0 || i >= Py_SIZE(op)) {
210         Py_XDECREF(newitem);
211         PyErr_SetString(PyExc_IndexError,
212                         "list assignment index out of range");
213         return -1;
214     }
215     p = ((PyListObject *)op) -> ob_item + i;
216     olditem = *p;
217     *p = newitem;
218     Py_XDECREF(olditem);
219     return 0;
220 }
221 
222 static int
ins1(PyListObject * self,Py_ssize_t where,PyObject * v)223 ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
224 {
225     Py_ssize_t i, n = Py_SIZE(self);
226     PyObject **items;
227     if (v == NULL) {
228         PyErr_BadInternalCall();
229         return -1;
230     }
231     if (n == PY_SSIZE_T_MAX) {
232         PyErr_SetString(PyExc_OverflowError,
233             "cannot add more objects to list");
234         return -1;
235     }
236 
237     if (list_resize(self, n+1) == -1)
238         return -1;
239 
240     if (where < 0) {
241         where += n;
242         if (where < 0)
243             where = 0;
244     }
245     if (where > n)
246         where = n;
247     items = self->ob_item;
248     for (i = n; --i >= where; )
249         items[i+1] = items[i];
250     Py_INCREF(v);
251     items[where] = v;
252     return 0;
253 }
254 
255 int
PyList_Insert(PyObject * op,Py_ssize_t where,PyObject * newitem)256 PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
257 {
258     if (!PyList_Check(op)) {
259         PyErr_BadInternalCall();
260         return -1;
261     }
262     return ins1((PyListObject *)op, where, newitem);
263 }
264 
265 static int
app1(PyListObject * self,PyObject * v)266 app1(PyListObject *self, PyObject *v)
267 {
268     Py_ssize_t n = PyList_GET_SIZE(self);
269 
270     assert (v != NULL);
271     if (n == PY_SSIZE_T_MAX) {
272         PyErr_SetString(PyExc_OverflowError,
273             "cannot add more objects to list");
274         return -1;
275     }
276 
277     if (list_resize(self, n+1) == -1)
278         return -1;
279 
280     Py_INCREF(v);
281     PyList_SET_ITEM(self, n, v);
282     return 0;
283 }
284 
285 int
PyList_Append(PyObject * op,PyObject * newitem)286 PyList_Append(PyObject *op, PyObject *newitem)
287 {
288     if (PyList_Check(op) && (newitem != NULL))
289         return app1((PyListObject *)op, newitem);
290     PyErr_BadInternalCall();
291     return -1;
292 }
293 
294 /* Methods */
295 
296 static void
list_dealloc(PyListObject * op)297 list_dealloc(PyListObject *op)
298 {
299     Py_ssize_t i;
300     PyObject_GC_UnTrack(op);
301     Py_TRASHCAN_SAFE_BEGIN(op)
302     if (op->ob_item != NULL) {
303         /* Do it backwards, for Christian Tismer.
304            There's a simple test case where somehow this reduces
305            thrashing when a *very* large list is created and
306            immediately deleted. */
307         i = Py_SIZE(op);
308         while (--i >= 0) {
309             Py_XDECREF(op->ob_item[i]);
310         }
311         PyMem_FREE(op->ob_item);
312     }
313     if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
314         free_list[numfree++] = op;
315     else
316         Py_TYPE(op)->tp_free((PyObject *)op);
317     Py_TRASHCAN_SAFE_END(op)
318 }
319 
320 static int
list_print(PyListObject * op,FILE * fp,int flags)321 list_print(PyListObject *op, FILE *fp, int flags)
322 {
323     int rc;
324     Py_ssize_t i;
325     PyObject *item;
326 
327     rc = Py_ReprEnter((PyObject*)op);
328     if (rc != 0) {
329         if (rc < 0)
330             return rc;
331         Py_BEGIN_ALLOW_THREADS
332         fprintf(fp, "[...]");
333         Py_END_ALLOW_THREADS
334         return 0;
335     }
336     Py_BEGIN_ALLOW_THREADS
337     fprintf(fp, "[");
338     Py_END_ALLOW_THREADS
339     for (i = 0; i < Py_SIZE(op); i++) {
340         item = op->ob_item[i];
341         Py_INCREF(item);
342         if (i > 0) {
343             Py_BEGIN_ALLOW_THREADS
344             fprintf(fp, ", ");
345             Py_END_ALLOW_THREADS
346         }
347         if (PyObject_Print(item, fp, 0) != 0) {
348             Py_DECREF(item);
349             Py_ReprLeave((PyObject *)op);
350             return -1;
351         }
352         Py_DECREF(item);
353     }
354     Py_BEGIN_ALLOW_THREADS
355     fprintf(fp, "]");
356     Py_END_ALLOW_THREADS
357     Py_ReprLeave((PyObject *)op);
358     return 0;
359 }
360 
361 static PyObject *
list_repr(PyListObject * v)362 list_repr(PyListObject *v)
363 {
364     Py_ssize_t i;
365     PyObject *s, *temp;
366     PyObject *pieces = NULL, *result = NULL;
367 
368     i = Py_ReprEnter((PyObject*)v);
369     if (i != 0) {
370         return i > 0 ? PyString_FromString("[...]") : NULL;
371     }
372 
373     if (Py_SIZE(v) == 0) {
374         result = PyString_FromString("[]");
375         goto Done;
376     }
377 
378     pieces = PyList_New(0);
379     if (pieces == NULL)
380         goto Done;
381 
382     /* Do repr() on each element.  Note that this may mutate the list,
383        so must refetch the list size on each iteration. */
384     for (i = 0; i < Py_SIZE(v); ++i) {
385         int status;
386         s = PyObject_Repr(v->ob_item[i]);
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;
393     }
394 
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;
405 
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;
414 
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);
421 
422 Done:
423     Py_XDECREF(pieces);
424     Py_ReprLeave((PyObject *)v);
425     return result;
426 }
427 
428 static Py_ssize_t
list_length(PyListObject * a)429 list_length(PyListObject *a)
430 {
431     return Py_SIZE(a);
432 }
433 
434 static int
list_contains(PyListObject * a,PyObject * el)435 list_contains(PyListObject *a, PyObject *el)
436 {
437     Py_ssize_t i;
438     int cmp;
439 
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;
444 }
445 
446 static PyObject *
list_item(PyListObject * a,Py_ssize_t i)447 list_item(PyListObject *a, Py_ssize_t i)
448 {
449     if (i < 0 || i >= Py_SIZE(a)) {
450         if (indexerr == NULL) {
451             indexerr = PyString_FromString(
452                 "list index out of range");
453             if (indexerr == NULL)
454                 return NULL;
455         }
456         PyErr_SetObject(PyExc_IndexError, indexerr);
457         return NULL;
458     }
459     Py_INCREF(a->ob_item[i]);
460     return a->ob_item[i];
461 }
462 
463 static PyObject *
list_slice(PyListObject * a,Py_ssize_t ilow,Py_ssize_t ihigh)464 list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
465 {
466     PyListObject *np;
467     PyObject **src, **dest;
468     Py_ssize_t i, len;
469     if (ilow < 0)
470         ilow = 0;
471     else if (ilow > Py_SIZE(a))
472         ilow = Py_SIZE(a);
473     if (ihigh < ilow)
474         ihigh = ilow;
475     else if (ihigh > Py_SIZE(a))
476         ihigh = Py_SIZE(a);
477     len = ihigh - ilow;
478     np = (PyListObject *) PyList_New(len);
479     if (np == NULL)
480         return NULL;
481 
482     src = a->ob_item + ilow;
483     dest = np->ob_item;
484     for (i = 0; i < len; i++) {
485         PyObject *v = src[i];
486         Py_INCREF(v);
487         dest[i] = v;
488     }
489     return (PyObject *)np;
490 }
491 
492 PyObject *
PyList_GetSlice(PyObject * a,Py_ssize_t ilow,Py_ssize_t ihigh)493 PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
494 {
495     if (!PyList_Check(a)) {
496         PyErr_BadInternalCall();
497         return NULL;
498     }
499     return list_slice((PyListObject *)a, ilow, ihigh);
500 }
501 
502 static PyObject *
list_concat(PyListObject * a,PyObject * bb)503 list_concat(PyListObject *a, PyObject *bb)
504 {
505     Py_ssize_t size;
506     Py_ssize_t i;
507     PyObject **src, **dest;
508     PyListObject *np;
509     if (!PyList_Check(bb)) {
510         PyErr_Format(PyExc_TypeError,
511                   "can only concatenate list (not \"%.200s\") to list",
512                   bb->ob_type->tp_name);
513         return NULL;
514     }
515 #define b ((PyListObject *)bb)
516     size = Py_SIZE(a) + Py_SIZE(b);
517     if (size < 0)
518         return PyErr_NoMemory();
519     np = (PyListObject *) PyList_New(size);
520     if (np == NULL) {
521         return NULL;
522     }
523     src = a->ob_item;
524     dest = np->ob_item;
525     for (i = 0; i < Py_SIZE(a); i++) {
526         PyObject *v = src[i];
527         Py_INCREF(v);
528         dest[i] = v;
529     }
530     src = b->ob_item;
531     dest = np->ob_item + Py_SIZE(a);
532     for (i = 0; i < Py_SIZE(b); i++) {
533         PyObject *v = src[i];
534         Py_INCREF(v);
535         dest[i] = v;
536     }
537     return (PyObject *)np;
538 #undef b
539 }
540 
541 static PyObject *
list_repeat(PyListObject * a,Py_ssize_t n)542 list_repeat(PyListObject *a, Py_ssize_t n)
543 {
544     Py_ssize_t i, j;
545     Py_ssize_t size;
546     PyListObject *np;
547     PyObject **p, **items;
548     PyObject *elem;
549     if (n < 0)
550         n = 0;
551     if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
552         return PyErr_NoMemory();
553     size = Py_SIZE(a) * n;
554     if (size == 0)
555         return PyList_New(0);
556     np = (PyListObject *) PyList_New(size);
557     if (np == NULL)
558         return NULL;
559 
560     items = np->ob_item;
561     if (Py_SIZE(a) == 1) {
562         elem = a->ob_item[0];
563         for (i = 0; i < n; i++) {
564             items[i] = elem;
565             Py_INCREF(elem);
566         }
567         return (PyObject *) np;
568     }
569     p = np->ob_item;
570     items = a->ob_item;
571     for (i = 0; i < n; i++) {
572         for (j = 0; j < Py_SIZE(a); j++) {
573             *p = items[j];
574             Py_INCREF(*p);
575             p++;
576         }
577     }
578     return (PyObject *) np;
579 }
580 
581 static int
list_clear(PyListObject * a)582 list_clear(PyListObject *a)
583 {
584     Py_ssize_t i;
585     PyObject **item = a->ob_item;
586     if (item != NULL) {
587         /* Because XDECREF can recursively invoke operations on
588            this list, we make it empty first. */
589         i = Py_SIZE(a);
590         Py_SIZE(a) = 0;
591         a->ob_item = NULL;
592         a->allocated = 0;
593         while (--i >= 0) {
594             Py_XDECREF(item[i]);
595         }
596         PyMem_FREE(item);
597     }
598     /* Never fails; the return value can be ignored.
599        Note that there is no guarantee that the list is actually empty
600        at this point, because XDECREF may have populated it again! */
601     return 0;
602 }
603 
604 /* a[ilow:ihigh] = v if v != NULL.
605  * del a[ilow:ihigh] if v == NULL.
606  *
607  * Special speed gimmick:  when v is NULL and ihigh - ilow <= 8, it's
608  * guaranteed the call cannot fail.
609  */
610 static int
list_ass_slice(PyListObject * a,Py_ssize_t ilow,Py_ssize_t ihigh,PyObject * v)611 list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
612 {
613     /* Because [X]DECREF can recursively invoke list operations on
614        this list, we must postpone all [X]DECREF activity until
615        after the list is back in its canonical shape.  Therefore
616        we must allocate an additional array, 'recycle', into which
617        we temporarily copy the items that are deleted from the
618        list. :-( */
619     PyObject *recycle_on_stack[8];
620     PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
621     PyObject **item;
622     PyObject **vitem = NULL;
623     PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
624     Py_ssize_t n; /* # of elements in replacement list */
625     Py_ssize_t norig; /* # of elements in list getting replaced */
626     Py_ssize_t d; /* Change in size */
627     Py_ssize_t k;
628     size_t s;
629     int result = -1;            /* guilty until proved innocent */
630 #define b ((PyListObject *)v)
631     if (v == NULL)
632         n = 0;
633     else {
634         if (a == b) {
635             /* Special case "a[i:j] = a" -- copy b first */
636             v = list_slice(b, 0, Py_SIZE(b));
637             if (v == NULL)
638                 return result;
639             result = list_ass_slice(a, ilow, ihigh, v);
640             Py_DECREF(v);
641             return result;
642         }
643         v_as_SF = PySequence_Fast(v, "can only assign an iterable");
644         if(v_as_SF == NULL)
645             goto Error;
646         n = PySequence_Fast_GET_SIZE(v_as_SF);
647         vitem = PySequence_Fast_ITEMS(v_as_SF);
648     }
649     if (ilow < 0)
650         ilow = 0;
651     else if (ilow > Py_SIZE(a))
652         ilow = Py_SIZE(a);
653 
654     if (ihigh < ilow)
655         ihigh = ilow;
656     else if (ihigh > Py_SIZE(a))
657         ihigh = Py_SIZE(a);
658 
659     norig = ihigh - ilow;
660     assert(norig >= 0);
661     d = n - norig;
662     if (Py_SIZE(a) + d == 0) {
663         Py_XDECREF(v_as_SF);
664         return list_clear(a);
665     }
666     item = a->ob_item;
667     /* recycle the items that we are about to remove */
668     s = norig * sizeof(PyObject *);
669     /* If norig == 0, item might be NULL, in which case we may not memcpy from it. */
670     if (s) {
671         if (s > sizeof(recycle_on_stack)) {
672             recycle = (PyObject **)PyMem_MALLOC(s);
673             if (recycle == NULL) {
674                 PyErr_NoMemory();
675                 goto Error;
676             }
677         }
678         memcpy(recycle, &item[ilow], s);
679     }
680 
681     if (d < 0) { /* Delete -d items */
682         memmove(&item[ihigh+d], &item[ihigh],
683             (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
684         list_resize(a, Py_SIZE(a) + d);
685         item = a->ob_item;
686     }
687     else if (d > 0) { /* Insert d items */
688         k = Py_SIZE(a);
689         if (list_resize(a, k+d) < 0)
690             goto Error;
691         item = a->ob_item;
692         memmove(&item[ihigh+d], &item[ihigh],
693             (k - ihigh)*sizeof(PyObject *));
694     }
695     for (k = 0; k < n; k++, ilow++) {
696         PyObject *w = vitem[k];
697         Py_XINCREF(w);
698         item[ilow] = w;
699     }
700     for (k = norig - 1; k >= 0; --k)
701         Py_XDECREF(recycle[k]);
702     result = 0;
703  Error:
704     if (recycle != recycle_on_stack)
705         PyMem_FREE(recycle);
706     Py_XDECREF(v_as_SF);
707     return result;
708 #undef b
709 }
710 
711 int
PyList_SetSlice(PyObject * a,Py_ssize_t ilow,Py_ssize_t ihigh,PyObject * v)712 PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
713 {
714     if (!PyList_Check(a)) {
715         PyErr_BadInternalCall();
716         return -1;
717     }
718     return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
719 }
720 
721 static PyObject *
list_inplace_repeat(PyListObject * self,Py_ssize_t n)722 list_inplace_repeat(PyListObject *self, Py_ssize_t n)
723 {
724     PyObject **items;
725     Py_ssize_t size, i, j, p;
726 
727 
728     size = PyList_GET_SIZE(self);
729     if (size == 0 || n == 1) {
730         Py_INCREF(self);
731         return (PyObject *)self;
732     }
733 
734     if (n < 1) {
735         (void)list_clear(self);
736         Py_INCREF(self);
737         return (PyObject *)self;
738     }
739 
740     if (size > PY_SSIZE_T_MAX / n) {
741         return PyErr_NoMemory();
742     }
743 
744     if (list_resize(self, size*n) == -1)
745         return NULL;
746 
747     p = size;
748     items = self->ob_item;
749     for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
750         for (j = 0; j < size; j++) {
751             PyObject *o = items[j];
752             Py_INCREF(o);
753             items[p++] = o;
754         }
755     }
756     Py_INCREF(self);
757     return (PyObject *)self;
758 }
759 
760 static int
list_ass_item(PyListObject * a,Py_ssize_t i,PyObject * v)761 list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
762 {
763     PyObject *old_value;
764     if (i < 0 || i >= Py_SIZE(a)) {
765         PyErr_SetString(PyExc_IndexError,
766                         "list assignment index out of range");
767         return -1;
768     }
769     if (v == NULL)
770         return list_ass_slice(a, i, i+1, v);
771     Py_INCREF(v);
772     old_value = a->ob_item[i];
773     a->ob_item[i] = v;
774     Py_DECREF(old_value);
775     return 0;
776 }
777 
778 static PyObject *
listinsert(PyListObject * self,PyObject * args)779 listinsert(PyListObject *self, PyObject *args)
780 {
781     Py_ssize_t i;
782     PyObject *v;
783     if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
784         return NULL;
785     if (ins1(self, i, v) == 0)
786         Py_RETURN_NONE;
787     return NULL;
788 }
789 
790 static PyObject *
listappend(PyListObject * self,PyObject * v)791 listappend(PyListObject *self, PyObject *v)
792 {
793     if (app1(self, v) == 0)
794         Py_RETURN_NONE;
795     return NULL;
796 }
797 
798 static PyObject *
listextend(PyListObject * self,PyObject * b)799 listextend(PyListObject *self, PyObject *b)
800 {
801     PyObject *it;      /* iter(v) */
802     Py_ssize_t m;                  /* size of self */
803     Py_ssize_t n;                  /* guess for size of b */
804     Py_ssize_t mn;                 /* m + n */
805     Py_ssize_t i;
806     PyObject *(*iternext)(PyObject *);
807 
808     /* Special cases:
809        1) lists and tuples which can use PySequence_Fast ops
810        2) extending self to self requires making a copy first
811     */
812     if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
813         PyObject **src, **dest;
814         b = PySequence_Fast(b, "argument must be iterable");
815         if (!b)
816             return NULL;
817         n = PySequence_Fast_GET_SIZE(b);
818         if (n == 0) {
819             /* short circuit when b is empty */
820             Py_DECREF(b);
821             Py_RETURN_NONE;
822         }
823         m = Py_SIZE(self);
824         if (list_resize(self, m + n) == -1) {
825             Py_DECREF(b);
826             return NULL;
827         }
828         /* note that we may still have self == b here for the
829          * situation a.extend(a), but the following code works
830          * in that case too.  Just make sure to resize self
831          * before calling PySequence_Fast_ITEMS.
832          */
833         /* populate the end of self with b's items */
834         src = PySequence_Fast_ITEMS(b);
835         dest = self->ob_item + m;
836         for (i = 0; i < n; i++) {
837             PyObject *o = src[i];
838             Py_INCREF(o);
839             dest[i] = o;
840         }
841         Py_DECREF(b);
842         Py_RETURN_NONE;
843     }
844 
845     it = PyObject_GetIter(b);
846     if (it == NULL)
847         return NULL;
848     iternext = *it->ob_type->tp_iternext;
849 
850     /* Guess a result list size. */
851     n = _PyObject_LengthHint(b, 8);
852     if (n == -1) {
853         Py_DECREF(it);
854         return NULL;
855     }
856     m = Py_SIZE(self);
857     mn = m + n;
858     if (mn >= m) {
859         /* Make room. */
860         if (list_resize(self, mn) == -1)
861             goto error;
862         /* Make the list sane again. */
863         Py_SIZE(self) = m;
864     }
865     /* Else m + n overflowed; on the chance that n lied, and there really
866      * is enough room, ignore it.  If n was telling the truth, we'll
867      * eventually run out of memory during the loop.
868      */
869 
870     /* Run iterator to exhaustion. */
871     for (;;) {
872         PyObject *item = iternext(it);
873         if (item == NULL) {
874             if (PyErr_Occurred()) {
875                 if (PyErr_ExceptionMatches(PyExc_StopIteration))
876                     PyErr_Clear();
877                 else
878                     goto error;
879             }
880             break;
881         }
882         if (Py_SIZE(self) < self->allocated) {
883             /* steals ref */
884             PyList_SET_ITEM(self, Py_SIZE(self), item);
885             ++Py_SIZE(self);
886         }
887         else {
888             int status = app1(self, item);
889             Py_DECREF(item);  /* append creates a new ref */
890             if (status < 0)
891                 goto error;
892         }
893     }
894 
895     /* Cut back result list if initial guess was too large. */
896     if (Py_SIZE(self) < self->allocated)
897         list_resize(self, Py_SIZE(self));  /* shrinking can't fail */
898 
899     Py_DECREF(it);
900     Py_RETURN_NONE;
901 
902   error:
903     Py_DECREF(it);
904     return NULL;
905 }
906 
907 PyObject *
_PyList_Extend(PyListObject * self,PyObject * b)908 _PyList_Extend(PyListObject *self, PyObject *b)
909 {
910     return listextend(self, b);
911 }
912 
913 static PyObject *
list_inplace_concat(PyListObject * self,PyObject * other)914 list_inplace_concat(PyListObject *self, PyObject *other)
915 {
916     PyObject *result;
917 
918     result = listextend(self, other);
919     if (result == NULL)
920         return result;
921     Py_DECREF(result);
922     Py_INCREF(self);
923     return (PyObject *)self;
924 }
925 
926 static PyObject *
listpop(PyListObject * self,PyObject * args)927 listpop(PyListObject *self, PyObject *args)
928 {
929     Py_ssize_t i = -1;
930     PyObject *v;
931     int status;
932 
933     if (!PyArg_ParseTuple(args, "|n:pop", &i))
934         return NULL;
935 
936     if (Py_SIZE(self) == 0) {
937         /* Special-case most common failure cause */
938         PyErr_SetString(PyExc_IndexError, "pop from empty list");
939         return NULL;
940     }
941     if (i < 0)
942         i += Py_SIZE(self);
943     if (i < 0 || i >= Py_SIZE(self)) {
944         PyErr_SetString(PyExc_IndexError, "pop index out of range");
945         return NULL;
946     }
947     v = self->ob_item[i];
948     if (i == Py_SIZE(self) - 1) {
949         status = list_resize(self, Py_SIZE(self) - 1);
950         assert(status >= 0);
951         return v; /* and v now owns the reference the list had */
952     }
953     Py_INCREF(v);
954     status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
955     assert(status >= 0);
956     /* Use status, so that in a release build compilers don't
957      * complain about the unused name.
958      */
959     (void) status;
960 
961     return v;
962 }
963 
964 /* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
965 static void
reverse_slice(PyObject ** lo,PyObject ** hi)966 reverse_slice(PyObject **lo, PyObject **hi)
967 {
968     assert(lo && hi);
969 
970     --hi;
971     while (lo < hi) {
972         PyObject *t = *lo;
973         *lo = *hi;
974         *hi = t;
975         ++lo;
976         --hi;
977     }
978 }
979 
980 /* Lots of code for an adaptive, stable, natural mergesort.  There are many
981  * pieces to this algorithm; read listsort.txt for overviews and details.
982  */
983 
984 /* Comparison function.  Takes care of calling a user-supplied
985  * comparison function (any callable Python object), which must not be
986  * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
987  * with Py_LT if you know it's NULL).
988  * Returns -1 on error, 1 if x < y, 0 if x >= y.
989  */
990 static int
islt(PyObject * x,PyObject * y,PyObject * compare)991 islt(PyObject *x, PyObject *y, PyObject *compare)
992 {
993     PyObject *res;
994     PyObject *args;
995     Py_ssize_t i;
996 
997     assert(compare != NULL);
998     /* Call the user's comparison function and translate the 3-way
999      * result into true or false (or error).
1000      */
1001     args = PyTuple_New(2);
1002     if (args == NULL)
1003         return -1;
1004     Py_INCREF(x);
1005     Py_INCREF(y);
1006     PyTuple_SET_ITEM(args, 0, x);
1007     PyTuple_SET_ITEM(args, 1, y);
1008     res = PyObject_Call(compare, args, NULL);
1009     Py_DECREF(args);
1010     if (res == NULL)
1011         return -1;
1012     if (!PyInt_Check(res)) {
1013         PyErr_Format(PyExc_TypeError,
1014                      "comparison function must return int, not %.200s",
1015                      res->ob_type->tp_name);
1016         Py_DECREF(res);
1017         return -1;
1018     }
1019     i = PyInt_AsLong(res);
1020     Py_DECREF(res);
1021     return i < 0;
1022 }
1023 
1024 /* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
1025  * islt.  This avoids a layer of function call in the usual case, and
1026  * sorting does many comparisons.
1027  * Returns -1 on error, 1 if x < y, 0 if x >= y.
1028  */
1029 #define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ?                        \
1030                  PyObject_RichCompareBool(X, Y, Py_LT) :                \
1031                  islt(X, Y, COMPARE))
1032 
1033 /* Compare X to Y via "<".  Goto "fail" if the comparison raises an
1034    error.  Else "k" is set to true iff X<Y, and an "if (k)" block is
1035    started.  It makes more sense in context <wink>.  X and Y are PyObject*s.
1036 */
1037 #define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail;  \
1038            if (k)
1039 
1040 /* binarysort is the best method for sorting small arrays: it does
1041    few compares, but can do data movement quadratic in the number of
1042    elements.
1043    [lo, hi) is a contiguous slice of a list, and is sorted via
1044    binary insertion.  This sort is stable.
1045    On entry, must have lo <= start <= hi, and that [lo, start) is already
1046    sorted (pass start == lo if you don't know!).
1047    If islt() complains return -1, else 0.
1048    Even in case of error, the output slice will be some permutation of
1049    the input (nothing is lost or duplicated).
1050 */
1051 static int
binarysort(PyObject ** lo,PyObject ** hi,PyObject ** start,PyObject * compare)1052 binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
1053      /* compare -- comparison function object, or NULL for default */
1054 {
1055     register Py_ssize_t k;
1056     register PyObject **l, **p, **r;
1057     register PyObject *pivot;
1058 
1059     assert(lo <= start && start <= hi);
1060     /* assert [lo, start) is sorted */
1061     if (lo == start)
1062         ++start;
1063     for (; start < hi; ++start) {
1064         /* set l to where *start belongs */
1065         l = lo;
1066         r = start;
1067         pivot = *r;
1068         /* Invariants:
1069          * pivot >= all in [lo, l).
1070          * pivot  < all in [r, start).
1071          * The second is vacuously true at the start.
1072          */
1073         assert(l < r);
1074         do {
1075             p = l + ((r - l) >> 1);
1076             IFLT(pivot, *p)
1077                 r = p;
1078             else
1079                 l = p+1;
1080         } while (l < r);
1081         assert(l == r);
1082         /* The invariants still hold, so pivot >= all in [lo, l) and
1083            pivot < all in [l, start), so pivot belongs at l.  Note
1084            that if there are elements equal to pivot, l points to the
1085            first slot after them -- that's why this sort is stable.
1086            Slide over to make room.
1087            Caution: using memmove is much slower under MSVC 5;
1088            we're not usually moving many slots. */
1089         for (p = start; p > l; --p)
1090             *p = *(p-1);
1091         *l = pivot;
1092     }
1093     return 0;
1094 
1095  fail:
1096     return -1;
1097 }
1098 
1099 /*
1100 Return the length of the run beginning at lo, in the slice [lo, hi).  lo < hi
1101 is required on entry.  "A run" is the longest ascending sequence, with
1102 
1103     lo[0] <= lo[1] <= lo[2] <= ...
1104 
1105 or the longest descending sequence, with
1106 
1107     lo[0] > lo[1] > lo[2] > ...
1108 
1109 Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1110 For its intended use in a stable mergesort, the strictness of the defn of
1111 "descending" is needed so that the caller can safely reverse a descending
1112 sequence without violating stability (strict > ensures there are no equal
1113 elements to get out of order).
1114 
1115 Returns -1 in case of error.
1116 */
1117 static Py_ssize_t
count_run(PyObject ** lo,PyObject ** hi,PyObject * compare,int * descending)1118 count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
1119 {
1120     Py_ssize_t k;
1121     Py_ssize_t n;
1122 
1123     assert(lo < hi);
1124     *descending = 0;
1125     ++lo;
1126     if (lo == hi)
1127         return 1;
1128 
1129     n = 2;
1130     IFLT(*lo, *(lo-1)) {
1131         *descending = 1;
1132         for (lo = lo+1; lo < hi; ++lo, ++n) {
1133             IFLT(*lo, *(lo-1))
1134                 ;
1135             else
1136                 break;
1137         }
1138     }
1139     else {
1140         for (lo = lo+1; lo < hi; ++lo, ++n) {
1141             IFLT(*lo, *(lo-1))
1142                 break;
1143         }
1144     }
1145 
1146     return n;
1147 fail:
1148     return -1;
1149 }
1150 
1151 /*
1152 Locate the proper position of key in a sorted vector; if the vector contains
1153 an element equal to key, return the position immediately to the left of
1154 the leftmost equal element.  [gallop_right() does the same except returns
1155 the position to the right of the rightmost equal element (if any).]
1156 
1157 "a" is a sorted vector with n elements, starting at a[0].  n must be > 0.
1158 
1159 "hint" is an index at which to begin the search, 0 <= hint < n.  The closer
1160 hint is to the final result, the faster this runs.
1161 
1162 The return value is the int k in 0..n such that
1163 
1164     a[k-1] < key <= a[k]
1165 
1166 pretending that *(a-1) is minus infinity and a[n] is plus infinity.  IOW,
1167 key belongs at index k; or, IOW, the first k elements of a should precede
1168 key, and the last n-k should follow key.
1169 
1170 Returns -1 on error.  See listsort.txt for info on the method.
1171 */
1172 static Py_ssize_t
gallop_left(PyObject * key,PyObject ** a,Py_ssize_t n,Py_ssize_t hint,PyObject * compare)1173 gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
1174 {
1175     Py_ssize_t ofs;
1176     Py_ssize_t lastofs;
1177     Py_ssize_t k;
1178 
1179     assert(key && a && n > 0 && hint >= 0 && hint < n);
1180 
1181     a += hint;
1182     lastofs = 0;
1183     ofs = 1;
1184     IFLT(*a, key) {
1185         /* a[hint] < key -- gallop right, until
1186          * a[hint + lastofs] < key <= a[hint + ofs]
1187          */
1188         const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
1189         while (ofs < maxofs) {
1190             IFLT(a[ofs], key) {
1191                 lastofs = ofs;
1192                 ofs = (ofs << 1) + 1;
1193                 if (ofs <= 0)                   /* int overflow */
1194                     ofs = maxofs;
1195             }
1196             else                /* key <= a[hint + ofs] */
1197                 break;
1198         }
1199         if (ofs > maxofs)
1200             ofs = maxofs;
1201         /* Translate back to offsets relative to &a[0]. */
1202         lastofs += hint;
1203         ofs += hint;
1204     }
1205     else {
1206         /* key <= a[hint] -- gallop left, until
1207          * a[hint - ofs] < key <= a[hint - lastofs]
1208          */
1209         const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
1210         while (ofs < maxofs) {
1211             IFLT(*(a-ofs), key)
1212                 break;
1213             /* key <= a[hint - ofs] */
1214             lastofs = ofs;
1215             ofs = (ofs << 1) + 1;
1216             if (ofs <= 0)               /* int overflow */
1217                 ofs = maxofs;
1218         }
1219         if (ofs > maxofs)
1220             ofs = maxofs;
1221         /* Translate back to positive offsets relative to &a[0]. */
1222         k = lastofs;
1223         lastofs = hint - ofs;
1224         ofs = hint - k;
1225     }
1226     a -= hint;
1227 
1228     assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1229     /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1230      * right of lastofs but no farther right than ofs.  Do a binary
1231      * search, with invariant a[lastofs-1] < key <= a[ofs].
1232      */
1233     ++lastofs;
1234     while (lastofs < ofs) {
1235         Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
1236 
1237         IFLT(a[m], key)
1238             lastofs = m+1;              /* a[m] < key */
1239         else
1240             ofs = m;                    /* key <= a[m] */
1241     }
1242     assert(lastofs == ofs);             /* so a[ofs-1] < key <= a[ofs] */
1243     return ofs;
1244 
1245 fail:
1246     return -1;
1247 }
1248 
1249 /*
1250 Exactly like gallop_left(), except that if key already exists in a[0:n],
1251 finds the position immediately to the right of the rightmost equal value.
1252 
1253 The return value is the int k in 0..n such that
1254 
1255     a[k-1] <= key < a[k]
1256 
1257 or -1 if error.
1258 
1259 The code duplication is massive, but this is enough different given that
1260 we're sticking to "<" comparisons that it's much harder to follow if
1261 written as one routine with yet another "left or right?" flag.
1262 */
1263 static Py_ssize_t
gallop_right(PyObject * key,PyObject ** a,Py_ssize_t n,Py_ssize_t hint,PyObject * compare)1264 gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
1265 {
1266     Py_ssize_t ofs;
1267     Py_ssize_t lastofs;
1268     Py_ssize_t k;
1269 
1270     assert(key && a && n > 0 && hint >= 0 && hint < n);
1271 
1272     a += hint;
1273     lastofs = 0;
1274     ofs = 1;
1275     IFLT(key, *a) {
1276         /* key < a[hint] -- gallop left, until
1277          * a[hint - ofs] <= key < a[hint - lastofs]
1278          */
1279         const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
1280         while (ofs < maxofs) {
1281             IFLT(key, *(a-ofs)) {
1282                 lastofs = ofs;
1283                 ofs = (ofs << 1) + 1;
1284                 if (ofs <= 0)                   /* int overflow */
1285                     ofs = maxofs;
1286             }
1287             else                /* a[hint - ofs] <= key */
1288                 break;
1289         }
1290         if (ofs > maxofs)
1291             ofs = maxofs;
1292         /* Translate back to positive offsets relative to &a[0]. */
1293         k = lastofs;
1294         lastofs = hint - ofs;
1295         ofs = hint - k;
1296     }
1297     else {
1298         /* a[hint] <= key -- gallop right, until
1299          * a[hint + lastofs] <= key < a[hint + ofs]
1300         */
1301         const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
1302         while (ofs < maxofs) {
1303             IFLT(key, a[ofs])
1304                 break;
1305             /* a[hint + ofs] <= key */
1306             lastofs = ofs;
1307             ofs = (ofs << 1) + 1;
1308             if (ofs <= 0)               /* int overflow */
1309                 ofs = maxofs;
1310         }
1311         if (ofs > maxofs)
1312             ofs = maxofs;
1313         /* Translate back to offsets relative to &a[0]. */
1314         lastofs += hint;
1315         ofs += hint;
1316     }
1317     a -= hint;
1318 
1319     assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1320     /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1321      * right of lastofs but no farther right than ofs.  Do a binary
1322      * search, with invariant a[lastofs-1] <= key < a[ofs].
1323      */
1324     ++lastofs;
1325     while (lastofs < ofs) {
1326         Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
1327 
1328         IFLT(key, a[m])
1329             ofs = m;                    /* key < a[m] */
1330         else
1331             lastofs = m+1;              /* a[m] <= key */
1332     }
1333     assert(lastofs == ofs);             /* so a[ofs-1] <= key < a[ofs] */
1334     return ofs;
1335 
1336 fail:
1337     return -1;
1338 }
1339 
1340 /* The maximum number of entries in a MergeState's pending-runs stack.
1341  * This is enough to sort arrays of size up to about
1342  *     32 * phi ** MAX_MERGE_PENDING
1343  * where phi ~= 1.618.  85 is ridiculouslylarge enough, good for an array
1344  * with 2**64 elements.
1345  */
1346 #define MAX_MERGE_PENDING 85
1347 
1348 /* When we get into galloping mode, we stay there until both runs win less
1349  * often than MIN_GALLOP consecutive times.  See listsort.txt for more info.
1350  */
1351 #define MIN_GALLOP 7
1352 
1353 /* Avoid malloc for small temp arrays. */
1354 #define MERGESTATE_TEMP_SIZE 256
1355 
1356 /* One MergeState exists on the stack per invocation of mergesort.  It's just
1357  * a convenient way to pass state around among the helper functions.
1358  */
1359 struct s_slice {
1360     PyObject **base;
1361     Py_ssize_t len;
1362 };
1363 
1364 typedef struct s_MergeState {
1365     /* The user-supplied comparison function. or NULL if none given. */
1366     PyObject *compare;
1367 
1368     /* This controls when we get *into* galloping mode.  It's initialized
1369      * to MIN_GALLOP.  merge_lo and merge_hi tend to nudge it higher for
1370      * random data, and lower for highly structured data.
1371      */
1372     Py_ssize_t min_gallop;
1373 
1374     /* 'a' is temp storage to help with merges.  It contains room for
1375      * alloced entries.
1376      */
1377     PyObject **a;       /* may point to temparray below */
1378     Py_ssize_t alloced;
1379 
1380     /* A stack of n pending runs yet to be merged.  Run #i starts at
1381      * address base[i] and extends for len[i] elements.  It's always
1382      * true (so long as the indices are in bounds) that
1383      *
1384      *     pending[i].base + pending[i].len == pending[i+1].base
1385      *
1386      * so we could cut the storage for this, but it's a minor amount,
1387      * and keeping all the info explicit simplifies the code.
1388      */
1389     int n;
1390     struct s_slice pending[MAX_MERGE_PENDING];
1391 
1392     /* 'a' points to this when possible, rather than muck with malloc. */
1393     PyObject *temparray[MERGESTATE_TEMP_SIZE];
1394 } MergeState;
1395 
1396 /* Conceptually a MergeState's constructor. */
1397 static void
merge_init(MergeState * ms,PyObject * compare)1398 merge_init(MergeState *ms, PyObject *compare)
1399 {
1400     assert(ms != NULL);
1401     ms->compare = compare;
1402     ms->a = ms->temparray;
1403     ms->alloced = MERGESTATE_TEMP_SIZE;
1404     ms->n = 0;
1405     ms->min_gallop = MIN_GALLOP;
1406 }
1407 
1408 /* Free all the temp memory owned by the MergeState.  This must be called
1409  * when you're done with a MergeState, and may be called before then if
1410  * you want to free the temp memory early.
1411  */
1412 static void
merge_freemem(MergeState * ms)1413 merge_freemem(MergeState *ms)
1414 {
1415     assert(ms != NULL);
1416     if (ms->a != ms->temparray)
1417         PyMem_Free(ms->a);
1418     ms->a = ms->temparray;
1419     ms->alloced = MERGESTATE_TEMP_SIZE;
1420 }
1421 
1422 /* Ensure enough temp memory for 'need' array slots is available.
1423  * Returns 0 on success and -1 if the memory can't be gotten.
1424  */
1425 static int
merge_getmem(MergeState * ms,Py_ssize_t need)1426 merge_getmem(MergeState *ms, Py_ssize_t need)
1427 {
1428     assert(ms != NULL);
1429     if (need <= ms->alloced)
1430         return 0;
1431     /* Don't realloc!  That can cost cycles to copy the old data, but
1432      * we don't care what's in the block.
1433      */
1434     merge_freemem(ms);
1435     if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*)) {
1436         PyErr_NoMemory();
1437         return -1;
1438     }
1439     ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
1440     if (ms->a) {
1441         ms->alloced = need;
1442         return 0;
1443     }
1444     PyErr_NoMemory();
1445     merge_freemem(ms);          /* reset to sane state */
1446     return -1;
1447 }
1448 #define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 :   \
1449                                 merge_getmem(MS, NEED))
1450 
1451 /* Merge the na elements starting at pa with the nb elements starting at pb
1452  * in a stable way, in-place.  na and nb must be > 0, and pa + na == pb.
1453  * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1454  * merge, and should have na <= nb.  See listsort.txt for more info.
1455  * Return 0 if successful, -1 if error.
1456  */
1457 static Py_ssize_t
merge_lo(MergeState * ms,PyObject ** pa,Py_ssize_t na,PyObject ** pb,Py_ssize_t nb)1458 merge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
1459                          PyObject **pb, Py_ssize_t nb)
1460 {
1461     Py_ssize_t k;
1462     PyObject *compare;
1463     PyObject **dest;
1464     int result = -1;            /* guilty until proved innocent */
1465     Py_ssize_t min_gallop;
1466 
1467     assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1468     if (MERGE_GETMEM(ms, na) < 0)
1469         return -1;
1470     memcpy(ms->a, pa, na * sizeof(PyObject*));
1471     dest = pa;
1472     pa = ms->a;
1473 
1474     *dest++ = *pb++;
1475     --nb;
1476     if (nb == 0)
1477         goto Succeed;
1478     if (na == 1)
1479         goto CopyB;
1480 
1481     min_gallop = ms->min_gallop;
1482     compare = ms->compare;
1483     for (;;) {
1484         Py_ssize_t acount = 0;          /* # of times A won in a row */
1485         Py_ssize_t bcount = 0;          /* # of times B won in a row */
1486 
1487         /* Do the straightforward thing until (if ever) one run
1488          * appears to win consistently.
1489          */
1490         for (;;) {
1491             assert(na > 1 && nb > 0);
1492             k = ISLT(*pb, *pa, compare);
1493             if (k) {
1494                 if (k < 0)
1495                     goto Fail;
1496                 *dest++ = *pb++;
1497                 ++bcount;
1498                 acount = 0;
1499                 --nb;
1500                 if (nb == 0)
1501                     goto Succeed;
1502                 if (bcount >= min_gallop)
1503                     break;
1504             }
1505             else {
1506                 *dest++ = *pa++;
1507                 ++acount;
1508                 bcount = 0;
1509                 --na;
1510                 if (na == 1)
1511                     goto CopyB;
1512                 if (acount >= min_gallop)
1513                     break;
1514             }
1515         }
1516 
1517         /* One run is winning so consistently that galloping may
1518          * be a huge win.  So try that, and continue galloping until
1519          * (if ever) neither run appears to be winning consistently
1520          * anymore.
1521          */
1522         ++min_gallop;
1523         do {
1524             assert(na > 1 && nb > 0);
1525             min_gallop -= min_gallop > 1;
1526             ms->min_gallop = min_gallop;
1527             k = gallop_right(*pb, pa, na, 0, compare);
1528             acount = k;
1529             if (k) {
1530                 if (k < 0)
1531                     goto Fail;
1532                 memcpy(dest, pa, k * sizeof(PyObject *));
1533                 dest += k;
1534                 pa += k;
1535                 na -= k;
1536                 if (na == 1)
1537                     goto CopyB;
1538                 /* na==0 is impossible now if the comparison
1539                  * function is consistent, but we can't assume
1540                  * that it is.
1541                  */
1542                 if (na == 0)
1543                     goto Succeed;
1544             }
1545             *dest++ = *pb++;
1546             --nb;
1547             if (nb == 0)
1548                 goto Succeed;
1549 
1550             k = gallop_left(*pa, pb, nb, 0, compare);
1551             bcount = k;
1552             if (k) {
1553                 if (k < 0)
1554                     goto Fail;
1555                 memmove(dest, pb, k * sizeof(PyObject *));
1556                 dest += k;
1557                 pb += k;
1558                 nb -= k;
1559                 if (nb == 0)
1560                     goto Succeed;
1561             }
1562             *dest++ = *pa++;
1563             --na;
1564             if (na == 1)
1565                 goto CopyB;
1566         } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1567         ++min_gallop;           /* penalize it for leaving galloping mode */
1568         ms->min_gallop = min_gallop;
1569     }
1570 Succeed:
1571     result = 0;
1572 Fail:
1573     if (na)
1574         memcpy(dest, pa, na * sizeof(PyObject*));
1575     return result;
1576 CopyB:
1577     assert(na == 1 && nb > 0);
1578     /* The last element of pa belongs at the end of the merge. */
1579     memmove(dest, pb, nb * sizeof(PyObject *));
1580     dest[nb] = *pa;
1581     return 0;
1582 }
1583 
1584 /* Merge the na elements starting at pa with the nb elements starting at pb
1585  * in a stable way, in-place.  na and nb must be > 0, and pa + na == pb.
1586  * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1587  * merge, and should have na >= nb.  See listsort.txt for more info.
1588  * Return 0 if successful, -1 if error.
1589  */
1590 static Py_ssize_t
merge_hi(MergeState * ms,PyObject ** pa,Py_ssize_t na,PyObject ** pb,Py_ssize_t nb)1591 merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
1592 {
1593     Py_ssize_t k;
1594     PyObject *compare;
1595     PyObject **dest;
1596     int result = -1;            /* guilty until proved innocent */
1597     PyObject **basea;
1598     PyObject **baseb;
1599     Py_ssize_t min_gallop;
1600 
1601     assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
1602     if (MERGE_GETMEM(ms, nb) < 0)
1603         return -1;
1604     dest = pb + nb - 1;
1605     memcpy(ms->a, pb, nb * sizeof(PyObject*));
1606     basea = pa;
1607     baseb = ms->a;
1608     pb = ms->a + nb - 1;
1609     pa += na - 1;
1610 
1611     *dest-- = *pa--;
1612     --na;
1613     if (na == 0)
1614         goto Succeed;
1615     if (nb == 1)
1616         goto CopyA;
1617 
1618     min_gallop = ms->min_gallop;
1619     compare = ms->compare;
1620     for (;;) {
1621         Py_ssize_t acount = 0;          /* # of times A won in a row */
1622         Py_ssize_t bcount = 0;          /* # of times B won in a row */
1623 
1624         /* Do the straightforward thing until (if ever) one run
1625          * appears to win consistently.
1626          */
1627         for (;;) {
1628             assert(na > 0 && nb > 1);
1629             k = ISLT(*pb, *pa, compare);
1630             if (k) {
1631                 if (k < 0)
1632                     goto Fail;
1633                 *dest-- = *pa--;
1634                 ++acount;
1635                 bcount = 0;
1636                 --na;
1637                 if (na == 0)
1638                     goto Succeed;
1639                 if (acount >= min_gallop)
1640                     break;
1641             }
1642             else {
1643                 *dest-- = *pb--;
1644                 ++bcount;
1645                 acount = 0;
1646                 --nb;
1647                 if (nb == 1)
1648                     goto CopyA;
1649                 if (bcount >= min_gallop)
1650                     break;
1651             }
1652         }
1653 
1654         /* One run is winning so consistently that galloping may
1655          * be a huge win.  So try that, and continue galloping until
1656          * (if ever) neither run appears to be winning consistently
1657          * anymore.
1658          */
1659         ++min_gallop;
1660         do {
1661             assert(na > 0 && nb > 1);
1662             min_gallop -= min_gallop > 1;
1663             ms->min_gallop = min_gallop;
1664             k = gallop_right(*pb, basea, na, na-1, compare);
1665             if (k < 0)
1666                 goto Fail;
1667             k = na - k;
1668             acount = k;
1669             if (k) {
1670                 dest -= k;
1671                 pa -= k;
1672                 memmove(dest+1, pa+1, k * sizeof(PyObject *));
1673                 na -= k;
1674                 if (na == 0)
1675                     goto Succeed;
1676             }
1677             *dest-- = *pb--;
1678             --nb;
1679             if (nb == 1)
1680                 goto CopyA;
1681 
1682             k = gallop_left(*pa, baseb, nb, nb-1, compare);
1683             if (k < 0)
1684                 goto Fail;
1685             k = nb - k;
1686             bcount = k;
1687             if (k) {
1688                 dest -= k;
1689                 pb -= k;
1690                 memcpy(dest+1, pb+1, k * sizeof(PyObject *));
1691                 nb -= k;
1692                 if (nb == 1)
1693                     goto CopyA;
1694                 /* nb==0 is impossible now if the comparison
1695                  * function is consistent, but we can't assume
1696                  * that it is.
1697                  */
1698                 if (nb == 0)
1699                     goto Succeed;
1700             }
1701             *dest-- = *pa--;
1702             --na;
1703             if (na == 0)
1704                 goto Succeed;
1705         } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1706         ++min_gallop;           /* penalize it for leaving galloping mode */
1707         ms->min_gallop = min_gallop;
1708     }
1709 Succeed:
1710     result = 0;
1711 Fail:
1712     if (nb)
1713         memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
1714     return result;
1715 CopyA:
1716     assert(nb == 1 && na > 0);
1717     /* The first element of pb belongs at the front of the merge. */
1718     dest -= na;
1719     pa -= na;
1720     memmove(dest+1, pa+1, na * sizeof(PyObject *));
1721     *dest = *pb;
1722     return 0;
1723 }
1724 
1725 /* Merge the two runs at stack indices i and i+1.
1726  * Returns 0 on success, -1 on error.
1727  */
1728 static Py_ssize_t
merge_at(MergeState * ms,Py_ssize_t i)1729 merge_at(MergeState *ms, Py_ssize_t i)
1730 {
1731     PyObject **pa, **pb;
1732     Py_ssize_t na, nb;
1733     Py_ssize_t k;
1734     PyObject *compare;
1735 
1736     assert(ms != NULL);
1737     assert(ms->n >= 2);
1738     assert(i >= 0);
1739     assert(i == ms->n - 2 || i == ms->n - 3);
1740 
1741     pa = ms->pending[i].base;
1742     na = ms->pending[i].len;
1743     pb = ms->pending[i+1].base;
1744     nb = ms->pending[i+1].len;
1745     assert(na > 0 && nb > 0);
1746     assert(pa + na == pb);
1747 
1748     /* Record the length of the combined runs; if i is the 3rd-last
1749      * run now, also slide over the last run (which isn't involved
1750      * in this merge).  The current run i+1 goes away in any case.
1751      */
1752     ms->pending[i].len = na + nb;
1753     if (i == ms->n - 3)
1754         ms->pending[i+1] = ms->pending[i+2];
1755     --ms->n;
1756 
1757     /* Where does b start in a?  Elements in a before that can be
1758      * ignored (already in place).
1759      */
1760     compare = ms->compare;
1761     k = gallop_right(*pb, pa, na, 0, compare);
1762     if (k < 0)
1763         return -1;
1764     pa += k;
1765     na -= k;
1766     if (na == 0)
1767         return 0;
1768 
1769     /* Where does a end in b?  Elements in b after that can be
1770      * ignored (already in place).
1771      */
1772     nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
1773     if (nb <= 0)
1774         return nb;
1775 
1776     /* Merge what remains of the runs, using a temp array with
1777      * min(na, nb) elements.
1778      */
1779     if (na <= nb)
1780         return merge_lo(ms, pa, na, pb, nb);
1781     else
1782         return merge_hi(ms, pa, na, pb, nb);
1783 }
1784 
1785 /* Examine the stack of runs waiting to be merged, merging adjacent runs
1786  * until the stack invariants are re-established:
1787  *
1788  * 1. len[-3] > len[-2] + len[-1]
1789  * 2. len[-2] > len[-1]
1790  *
1791  * See listsort.txt for more info.
1792  *
1793  * Returns 0 on success, -1 on error.
1794  */
1795 static int
merge_collapse(MergeState * ms)1796 merge_collapse(MergeState *ms)
1797 {
1798     struct s_slice *p = ms->pending;
1799 
1800     assert(ms);
1801     while (ms->n > 1) {
1802         Py_ssize_t n = ms->n - 2;
1803         if ((n > 0 && p[n-1].len <= p[n].len + p[n+1].len) ||
1804             (n > 1 && p[n-2].len <= p[n-1].len + p[n].len)) {
1805             if (p[n-1].len < p[n+1].len)
1806                 --n;
1807             if (merge_at(ms, n) < 0)
1808                 return -1;
1809         }
1810         else if (p[n].len <= p[n+1].len) {
1811                  if (merge_at(ms, n) < 0)
1812                         return -1;
1813         }
1814         else
1815             break;
1816     }
1817     return 0;
1818 }
1819 
1820 /* Regardless of invariants, merge all runs on the stack until only one
1821  * remains.  This is used at the end of the mergesort.
1822  *
1823  * Returns 0 on success, -1 on error.
1824  */
1825 static int
merge_force_collapse(MergeState * ms)1826 merge_force_collapse(MergeState *ms)
1827 {
1828     struct s_slice *p = ms->pending;
1829 
1830     assert(ms);
1831     while (ms->n > 1) {
1832         Py_ssize_t n = ms->n - 2;
1833         if (n > 0 && p[n-1].len < p[n+1].len)
1834             --n;
1835         if (merge_at(ms, n) < 0)
1836             return -1;
1837     }
1838     return 0;
1839 }
1840 
1841 /* Compute a good value for the minimum run length; natural runs shorter
1842  * than this are boosted artificially via binary insertion.
1843  *
1844  * If n < 64, return n (it's too small to bother with fancy stuff).
1845  * Else if n is an exact power of 2, return 32.
1846  * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1847  * strictly less than, an exact power of 2.
1848  *
1849  * See listsort.txt for more info.
1850  */
1851 static Py_ssize_t
merge_compute_minrun(Py_ssize_t n)1852 merge_compute_minrun(Py_ssize_t n)
1853 {
1854     Py_ssize_t r = 0;           /* becomes 1 if any 1 bits are shifted off */
1855 
1856     assert(n >= 0);
1857     while (n >= 64) {
1858         r |= n & 1;
1859         n >>= 1;
1860     }
1861     return n + r;
1862 }
1863 
1864 /* Special wrapper to support stable sorting using the decorate-sort-undecorate
1865    pattern.  Holds a key which is used for comparisons and the original record
1866    which is returned during the undecorate phase.  By exposing only the key
1867    during comparisons, the underlying sort stability characteristics are left
1868    unchanged.  Also, if a custom comparison function is used, it will only see
1869    the key instead of a full record. */
1870 
1871 typedef struct {
1872     PyObject_HEAD
1873     PyObject *key;
1874     PyObject *value;
1875 } sortwrapperobject;
1876 
1877 PyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
1878 static PyObject *
1879 sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
1880 static void
1881 sortwrapper_dealloc(sortwrapperobject *);
1882 
1883 static PyTypeObject sortwrapper_type = {
1884     PyVarObject_HEAD_INIT(&PyType_Type, 0)
1885     "sortwrapper",                              /* tp_name */
1886     sizeof(sortwrapperobject),                  /* tp_basicsize */
1887     0,                                          /* tp_itemsize */
1888     /* methods */
1889     (destructor)sortwrapper_dealloc,            /* tp_dealloc */
1890     0,                                          /* tp_print */
1891     0,                                          /* tp_getattr */
1892     0,                                          /* tp_setattr */
1893     0,                                          /* tp_compare */
1894     0,                                          /* tp_repr */
1895     0,                                          /* tp_as_number */
1896     0,                                          /* tp_as_sequence */
1897     0,                                          /* tp_as_mapping */
1898     0,                                          /* tp_hash */
1899     0,                                          /* tp_call */
1900     0,                                          /* tp_str */
1901     PyObject_GenericGetAttr,                    /* tp_getattro */
1902     0,                                          /* tp_setattro */
1903     0,                                          /* tp_as_buffer */
1904     Py_TPFLAGS_DEFAULT |
1905     Py_TPFLAGS_HAVE_RICHCOMPARE,                /* tp_flags */
1906     sortwrapper_doc,                            /* tp_doc */
1907     0,                                          /* tp_traverse */
1908     0,                                          /* tp_clear */
1909     (richcmpfunc)sortwrapper_richcompare,       /* tp_richcompare */
1910 };
1911 
1912 
1913 static PyObject *
sortwrapper_richcompare(sortwrapperobject * a,sortwrapperobject * b,int op)1914 sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
1915 {
1916     if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
1917         PyErr_SetString(PyExc_TypeError,
1918             "expected a sortwrapperobject");
1919         return NULL;
1920     }
1921     return PyObject_RichCompare(a->key, b->key, op);
1922 }
1923 
1924 static void
sortwrapper_dealloc(sortwrapperobject * so)1925 sortwrapper_dealloc(sortwrapperobject *so)
1926 {
1927     Py_XDECREF(so->key);
1928     Py_XDECREF(so->value);
1929     PyObject_Del(so);
1930 }
1931 
1932 /* Returns a new reference to a sortwrapper.
1933    Consumes the references to the two underlying objects. */
1934 
1935 static PyObject *
build_sortwrapper(PyObject * key,PyObject * value)1936 build_sortwrapper(PyObject *key, PyObject *value)
1937 {
1938     sortwrapperobject *so;
1939 
1940     so = PyObject_New(sortwrapperobject, &sortwrapper_type);
1941     if (so == NULL)
1942         return NULL;
1943     so->key = key;
1944     so->value = value;
1945     return (PyObject *)so;
1946 }
1947 
1948 /* Returns a new reference to the value underlying the wrapper. */
1949 static PyObject *
sortwrapper_getvalue(PyObject * so)1950 sortwrapper_getvalue(PyObject *so)
1951 {
1952     PyObject *value;
1953 
1954     if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
1955         PyErr_SetString(PyExc_TypeError,
1956             "expected a sortwrapperobject");
1957         return NULL;
1958     }
1959     value = ((sortwrapperobject *)so)->value;
1960     Py_INCREF(value);
1961     return value;
1962 }
1963 
1964 /* Wrapper for user specified cmp functions in combination with a
1965    specified key function.  Makes sure the cmp function is presented
1966    with the actual key instead of the sortwrapper */
1967 
1968 typedef struct {
1969     PyObject_HEAD
1970     PyObject *func;
1971 } cmpwrapperobject;
1972 
1973 static void
cmpwrapper_dealloc(cmpwrapperobject * co)1974 cmpwrapper_dealloc(cmpwrapperobject *co)
1975 {
1976     Py_XDECREF(co->func);
1977     PyObject_Del(co);
1978 }
1979 
1980 static PyObject *
cmpwrapper_call(cmpwrapperobject * co,PyObject * args,PyObject * kwds)1981 cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
1982 {
1983     PyObject *x, *y, *xx, *yy;
1984 
1985     if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
1986         return NULL;
1987     if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
1988         !PyObject_TypeCheck(y, &sortwrapper_type)) {
1989         PyErr_SetString(PyExc_TypeError,
1990             "expected a sortwrapperobject");
1991         return NULL;
1992     }
1993     xx = ((sortwrapperobject *)x)->key;
1994     yy = ((sortwrapperobject *)y)->key;
1995     return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
1996 }
1997 
1998 PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
1999 
2000 static PyTypeObject cmpwrapper_type = {
2001     PyVarObject_HEAD_INIT(&PyType_Type, 0)
2002     "cmpwrapper",                               /* tp_name */
2003     sizeof(cmpwrapperobject),                   /* tp_basicsize */
2004     0,                                          /* tp_itemsize */
2005     /* methods */
2006     (destructor)cmpwrapper_dealloc,             /* tp_dealloc */
2007     0,                                          /* tp_print */
2008     0,                                          /* tp_getattr */
2009     0,                                          /* tp_setattr */
2010     0,                                          /* tp_compare */
2011     0,                                          /* tp_repr */
2012     0,                                          /* tp_as_number */
2013     0,                                          /* tp_as_sequence */
2014     0,                                          /* tp_as_mapping */
2015     0,                                          /* tp_hash */
2016     (ternaryfunc)cmpwrapper_call,               /* tp_call */
2017     0,                                          /* tp_str */
2018     PyObject_GenericGetAttr,                    /* tp_getattro */
2019     0,                                          /* tp_setattro */
2020     0,                                          /* tp_as_buffer */
2021     Py_TPFLAGS_DEFAULT,                         /* tp_flags */
2022     cmpwrapper_doc,                             /* tp_doc */
2023 };
2024 
2025 static PyObject *
build_cmpwrapper(PyObject * cmpfunc)2026 build_cmpwrapper(PyObject *cmpfunc)
2027 {
2028     cmpwrapperobject *co;
2029 
2030     co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
2031     if (co == NULL)
2032         return NULL;
2033     Py_INCREF(cmpfunc);
2034     co->func = cmpfunc;
2035     return (PyObject *)co;
2036 }
2037 
2038 /* An adaptive, stable, natural mergesort.  See listsort.txt.
2039  * Returns Py_None on success, NULL on error.  Even in case of error, the
2040  * list will be some permutation of its input state (nothing is lost or
2041  * duplicated).
2042  */
2043 static PyObject *
listsort(PyListObject * self,PyObject * args,PyObject * kwds)2044 listsort(PyListObject *self, PyObject *args, PyObject *kwds)
2045 {
2046     MergeState ms;
2047     PyObject **lo, **hi;
2048     Py_ssize_t nremaining;
2049     Py_ssize_t minrun;
2050     Py_ssize_t saved_ob_size, saved_allocated;
2051     PyObject **saved_ob_item;
2052     PyObject **final_ob_item;
2053     PyObject *compare = NULL;
2054     PyObject *result = NULL;            /* guilty until proved innocent */
2055     int reverse = 0;
2056     PyObject *keyfunc = NULL;
2057     Py_ssize_t i;
2058     PyObject *key, *value, *kvpair;
2059     static char *kwlist[] = {"cmp", "key", "reverse", 0};
2060 
2061     assert(self != NULL);
2062     assert (PyList_Check(self));
2063     if (args != NULL) {
2064         if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
2065             kwlist, &compare, &keyfunc, &reverse))
2066             return NULL;
2067     }
2068     if (compare == Py_None)
2069         compare = NULL;
2070     if (compare != NULL &&
2071         PyErr_WarnPy3k("the cmp argument is not supported in 3.x", 1) < 0)
2072         return NULL;
2073     if (keyfunc == Py_None)
2074         keyfunc = NULL;
2075     if (compare != NULL && keyfunc != NULL) {
2076         compare = build_cmpwrapper(compare);
2077         if (compare == NULL)
2078             return NULL;
2079     } else
2080         Py_XINCREF(compare);
2081 
2082     /* The list is temporarily made empty, so that mutations performed
2083      * by comparison functions can't affect the slice of memory we're
2084      * sorting (allowing mutations during sorting is a core-dump
2085      * factory, since ob_item may change).
2086      */
2087     saved_ob_size = Py_SIZE(self);
2088     saved_ob_item = self->ob_item;
2089     saved_allocated = self->allocated;
2090     Py_SIZE(self) = 0;
2091     self->ob_item = NULL;
2092     self->allocated = -1; /* any operation will reset it to >= 0 */
2093 
2094     if (keyfunc != NULL) {
2095         for (i=0 ; i < saved_ob_size ; i++) {
2096             value = saved_ob_item[i];
2097             key = PyObject_CallFunctionObjArgs(keyfunc, value,
2098                                                NULL);
2099             if (key == NULL) {
2100                 for (i=i-1 ; i>=0 ; i--) {
2101                     kvpair = saved_ob_item[i];
2102                     value = sortwrapper_getvalue(kvpair);
2103                     saved_ob_item[i] = value;
2104                     Py_DECREF(kvpair);
2105                 }
2106                 goto dsu_fail;
2107             }
2108             kvpair = build_sortwrapper(key, value);
2109             if (kvpair == NULL)
2110                 goto dsu_fail;
2111             saved_ob_item[i] = kvpair;
2112         }
2113     }
2114 
2115     /* Reverse sort stability achieved by initially reversing the list,
2116     applying a stable forward sort, then reversing the final result. */
2117     if (reverse && saved_ob_size > 1)
2118         reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2119 
2120     merge_init(&ms, compare);
2121 
2122     nremaining = saved_ob_size;
2123     if (nremaining < 2)
2124         goto succeed;
2125 
2126     /* March over the array once, left to right, finding natural runs,
2127      * and extending short natural runs to minrun elements.
2128      */
2129     lo = saved_ob_item;
2130     hi = lo + nremaining;
2131     minrun = merge_compute_minrun(nremaining);
2132     do {
2133         int descending;
2134         Py_ssize_t n;
2135 
2136         /* Identify next run. */
2137         n = count_run(lo, hi, compare, &descending);
2138         if (n < 0)
2139             goto fail;
2140         if (descending)
2141             reverse_slice(lo, lo + n);
2142         /* If short, extend to min(minrun, nremaining). */
2143         if (n < minrun) {
2144             const Py_ssize_t force = nremaining <= minrun ?
2145                               nremaining : minrun;
2146             if (binarysort(lo, lo + force, lo + n, compare) < 0)
2147                 goto fail;
2148             n = force;
2149         }
2150         /* Push run onto pending-runs stack, and maybe merge. */
2151         assert(ms.n < MAX_MERGE_PENDING);
2152         ms.pending[ms.n].base = lo;
2153         ms.pending[ms.n].len = n;
2154         ++ms.n;
2155         if (merge_collapse(&ms) < 0)
2156             goto fail;
2157         /* Advance to find next run. */
2158         lo += n;
2159         nremaining -= n;
2160     } while (nremaining);
2161     assert(lo == hi);
2162 
2163     if (merge_force_collapse(&ms) < 0)
2164         goto fail;
2165     assert(ms.n == 1);
2166     assert(ms.pending[0].base == saved_ob_item);
2167     assert(ms.pending[0].len == saved_ob_size);
2168 
2169 succeed:
2170     result = Py_None;
2171 fail:
2172     if (keyfunc != NULL) {
2173         for (i=0 ; i < saved_ob_size ; i++) {
2174             kvpair = saved_ob_item[i];
2175             value = sortwrapper_getvalue(kvpair);
2176             saved_ob_item[i] = value;
2177             Py_DECREF(kvpair);
2178         }
2179     }
2180 
2181     if (self->allocated != -1 && result != NULL) {
2182         /* The user mucked with the list during the sort,
2183          * and we don't already have another error to report.
2184          */
2185         PyErr_SetString(PyExc_ValueError, "list modified during sort");
2186         result = NULL;
2187     }
2188 
2189     if (reverse && saved_ob_size > 1)
2190         reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2191 
2192     merge_freemem(&ms);
2193 
2194 dsu_fail:
2195     final_ob_item = self->ob_item;
2196     i = Py_SIZE(self);
2197     Py_SIZE(self) = saved_ob_size;
2198     self->ob_item = saved_ob_item;
2199     self->allocated = saved_allocated;
2200     if (final_ob_item != NULL) {
2201         /* we cannot use list_clear() for this because it does not
2202            guarantee that the list is really empty when it returns */
2203         while (--i >= 0) {
2204             Py_XDECREF(final_ob_item[i]);
2205         }
2206         PyMem_FREE(final_ob_item);
2207     }
2208     Py_XDECREF(compare);
2209     Py_XINCREF(result);
2210     return result;
2211 }
2212 #undef IFLT
2213 #undef ISLT
2214 
2215 int
PyList_Sort(PyObject * v)2216 PyList_Sort(PyObject *v)
2217 {
2218     if (v == NULL || !PyList_Check(v)) {
2219         PyErr_BadInternalCall();
2220         return -1;
2221     }
2222     v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2223     if (v == NULL)
2224         return -1;
2225     Py_DECREF(v);
2226     return 0;
2227 }
2228 
2229 static PyObject *
listreverse(PyListObject * self)2230 listreverse(PyListObject *self)
2231 {
2232     if (Py_SIZE(self) > 1)
2233         reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2234     Py_RETURN_NONE;
2235 }
2236 
2237 int
PyList_Reverse(PyObject * v)2238 PyList_Reverse(PyObject *v)
2239 {
2240     PyListObject *self = (PyListObject *)v;
2241 
2242     if (v == NULL || !PyList_Check(v)) {
2243         PyErr_BadInternalCall();
2244         return -1;
2245     }
2246     if (Py_SIZE(self) > 1)
2247         reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2248     return 0;
2249 }
2250 
2251 PyObject *
PyList_AsTuple(PyObject * v)2252 PyList_AsTuple(PyObject *v)
2253 {
2254     PyObject *w;
2255     PyObject **p, **q;
2256     Py_ssize_t n;
2257     if (v == NULL || !PyList_Check(v)) {
2258         PyErr_BadInternalCall();
2259         return NULL;
2260     }
2261     n = Py_SIZE(v);
2262     w = PyTuple_New(n);
2263     if (w == NULL)
2264         return NULL;
2265     p = ((PyTupleObject *)w)->ob_item;
2266     q = ((PyListObject *)v)->ob_item;
2267     while (--n >= 0) {
2268         Py_INCREF(*q);
2269         *p = *q;
2270         p++;
2271         q++;
2272     }
2273     return w;
2274 }
2275 
2276 static PyObject *
listindex(PyListObject * self,PyObject * args)2277 listindex(PyListObject *self, PyObject *args)
2278 {
2279     Py_ssize_t i, start=0, stop=Py_SIZE(self);
2280     PyObject *v, *format_tuple, *err_string;
2281     static PyObject *err_format = NULL;
2282 
2283     if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
2284                                 _PyEval_SliceIndexNotNone, &start,
2285                                 _PyEval_SliceIndexNotNone, &stop))
2286         return NULL;
2287     if (start < 0) {
2288         start += Py_SIZE(self);
2289         if (start < 0)
2290             start = 0;
2291     }
2292     if (stop < 0) {
2293         stop += Py_SIZE(self);
2294         if (stop < 0)
2295             stop = 0;
2296     }
2297     for (i = start; i < stop && i < Py_SIZE(self); i++) {
2298         int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2299         if (cmp > 0)
2300             return PyInt_FromSsize_t(i);
2301         else if (cmp < 0)
2302             return NULL;
2303     }
2304     if (err_format == NULL) {
2305         err_format = PyString_FromString("%r is not in list");
2306         if (err_format == NULL)
2307             return NULL;
2308     }
2309     format_tuple = PyTuple_Pack(1, v);
2310     if (format_tuple == NULL)
2311         return NULL;
2312     err_string = PyString_Format(err_format, format_tuple);
2313     Py_DECREF(format_tuple);
2314     if (err_string == NULL)
2315         return NULL;
2316     PyErr_SetObject(PyExc_ValueError, err_string);
2317     Py_DECREF(err_string);
2318     return NULL;
2319 }
2320 
2321 static PyObject *
listcount(PyListObject * self,PyObject * v)2322 listcount(PyListObject *self, PyObject *v)
2323 {
2324     Py_ssize_t count = 0;
2325     Py_ssize_t i;
2326 
2327     for (i = 0; i < Py_SIZE(self); i++) {
2328         int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2329         if (cmp > 0)
2330             count++;
2331         else if (cmp < 0)
2332             return NULL;
2333     }
2334     return PyInt_FromSsize_t(count);
2335 }
2336 
2337 static PyObject *
listremove(PyListObject * self,PyObject * v)2338 listremove(PyListObject *self, PyObject *v)
2339 {
2340     Py_ssize_t i;
2341 
2342     for (i = 0; i < Py_SIZE(self); i++) {
2343         int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
2344         if (cmp > 0) {
2345             if (list_ass_slice(self, i, i+1,
2346                                (PyObject *)NULL) == 0)
2347                 Py_RETURN_NONE;
2348             return NULL;
2349         }
2350         else if (cmp < 0)
2351             return NULL;
2352     }
2353     PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2354     return NULL;
2355 }
2356 
2357 static int
list_traverse(PyListObject * o,visitproc visit,void * arg)2358 list_traverse(PyListObject *o, visitproc visit, void *arg)
2359 {
2360     Py_ssize_t i;
2361 
2362     for (i = Py_SIZE(o); --i >= 0; )
2363         Py_VISIT(o->ob_item[i]);
2364     return 0;
2365 }
2366 
2367 static PyObject *
list_richcompare(PyObject * v,PyObject * w,int op)2368 list_richcompare(PyObject *v, PyObject *w, int op)
2369 {
2370     PyListObject *vl, *wl;
2371     Py_ssize_t i;
2372 
2373     if (!PyList_Check(v) || !PyList_Check(w)) {
2374         Py_INCREF(Py_NotImplemented);
2375         return Py_NotImplemented;
2376     }
2377 
2378     vl = (PyListObject *)v;
2379     wl = (PyListObject *)w;
2380 
2381     if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2382         /* Shortcut: if the lengths differ, the lists differ */
2383         PyObject *res;
2384         if (op == Py_EQ)
2385             res = Py_False;
2386         else
2387             res = Py_True;
2388         Py_INCREF(res);
2389         return res;
2390     }
2391 
2392     /* Search for the first index where items are different */
2393     for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2394         int k = PyObject_RichCompareBool(vl->ob_item[i],
2395                                          wl->ob_item[i], Py_EQ);
2396         if (k < 0)
2397             return NULL;
2398         if (!k)
2399             break;
2400     }
2401 
2402     if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2403         /* No more items to compare -- compare sizes */
2404         Py_ssize_t vs = Py_SIZE(vl);
2405         Py_ssize_t ws = Py_SIZE(wl);
2406         int cmp;
2407         PyObject *res;
2408         switch (op) {
2409         case Py_LT: cmp = vs <  ws; break;
2410         case Py_LE: cmp = vs <= ws; break;
2411         case Py_EQ: cmp = vs == ws; break;
2412         case Py_NE: cmp = vs != ws; break;
2413         case Py_GT: cmp = vs >  ws; break;
2414         case Py_GE: cmp = vs >= ws; break;
2415         default: return NULL; /* cannot happen */
2416         }
2417         if (cmp)
2418             res = Py_True;
2419         else
2420             res = Py_False;
2421         Py_INCREF(res);
2422         return res;
2423     }
2424 
2425     /* We have an item that differs -- shortcuts for EQ/NE */
2426     if (op == Py_EQ) {
2427         Py_INCREF(Py_False);
2428         return Py_False;
2429     }
2430     if (op == Py_NE) {
2431         Py_INCREF(Py_True);
2432         return Py_True;
2433     }
2434 
2435     /* Compare the final item again using the proper operator */
2436     return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2437 }
2438 
2439 static int
list_init(PyListObject * self,PyObject * args,PyObject * kw)2440 list_init(PyListObject *self, PyObject *args, PyObject *kw)
2441 {
2442     PyObject *arg = NULL;
2443     static char *kwlist[] = {"sequence", 0};
2444 
2445     if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
2446         return -1;
2447 
2448     /* Verify list invariants established by PyType_GenericAlloc() */
2449     assert(0 <= Py_SIZE(self));
2450     assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2451     assert(self->ob_item != NULL ||
2452            self->allocated == 0 || self->allocated == -1);
2453 
2454     /* Empty previous contents */
2455     if (self->ob_item != NULL) {
2456         (void)list_clear(self);
2457     }
2458     if (arg != NULL) {
2459         PyObject *rv = listextend(self, arg);
2460         if (rv == NULL)
2461             return -1;
2462         Py_DECREF(rv);
2463     }
2464     return 0;
2465 }
2466 
2467 static PyObject *
list_sizeof(PyListObject * self)2468 list_sizeof(PyListObject *self)
2469 {
2470     Py_ssize_t res;
2471 
2472     res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * sizeof(void*);
2473     return PyInt_FromSsize_t(res);
2474 }
2475 
2476 static PyObject *list_iter(PyObject *seq);
2477 static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
2478 
2479 PyDoc_STRVAR(getitem_doc,
2480 "x.__getitem__(y) <==> x[y]");
2481 PyDoc_STRVAR(reversed_doc,
2482 "L.__reversed__() -- return a reverse iterator over the list");
2483 PyDoc_STRVAR(sizeof_doc,
2484 "L.__sizeof__() -- size of L in memory, in bytes");
2485 PyDoc_STRVAR(append_doc,
2486 "L.append(object) -- append object to end");
2487 PyDoc_STRVAR(extend_doc,
2488 "L.extend(iterable) -- extend list by appending elements from the iterable");
2489 PyDoc_STRVAR(insert_doc,
2490 "L.insert(index, object) -- insert object before index");
2491 PyDoc_STRVAR(pop_doc,
2492 "L.pop([index]) -> item -- remove and return item at index (default last).\n"
2493 "Raises IndexError if list is empty or index is out of range.");
2494 PyDoc_STRVAR(remove_doc,
2495 "L.remove(value) -- remove first occurrence of value.\n"
2496 "Raises ValueError if the value is not present.");
2497 PyDoc_STRVAR(index_doc,
2498 "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2499 "Raises ValueError if the value is not present.");
2500 PyDoc_STRVAR(count_doc,
2501 "L.count(value) -> integer -- return number of occurrences of value");
2502 PyDoc_STRVAR(reverse_doc,
2503 "L.reverse() -- reverse *IN PLACE*");
2504 PyDoc_STRVAR(sort_doc,
2505 "L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2506 cmp(x, y) -> -1, 0, 1");
2507 
2508 static PyObject *list_subscript(PyListObject*, PyObject*);
2509 
2510 static PyMethodDef list_methods[] = {
2511     {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
2512     {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
2513     {"__sizeof__",  (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
2514     {"append",          (PyCFunction)listappend,  METH_O, append_doc},
2515     {"insert",          (PyCFunction)listinsert,  METH_VARARGS, insert_doc},
2516     {"extend",      (PyCFunction)listextend,  METH_O, extend_doc},
2517     {"pop",             (PyCFunction)listpop,     METH_VARARGS, pop_doc},
2518     {"remove",          (PyCFunction)listremove,  METH_O, remove_doc},
2519     {"index",           (PyCFunction)listindex,   METH_VARARGS, index_doc},
2520     {"count",           (PyCFunction)listcount,   METH_O, count_doc},
2521     {"reverse",         (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
2522     {"sort",            (PyCFunction)listsort,    METH_VARARGS | METH_KEYWORDS, sort_doc},
2523     {NULL,              NULL}           /* sentinel */
2524 };
2525 
2526 static PySequenceMethods list_as_sequence = {
2527     (lenfunc)list_length,                       /* sq_length */
2528     (binaryfunc)list_concat,                    /* sq_concat */
2529     (ssizeargfunc)list_repeat,                  /* sq_repeat */
2530     (ssizeargfunc)list_item,                    /* sq_item */
2531     (ssizessizeargfunc)list_slice,              /* sq_slice */
2532     (ssizeobjargproc)list_ass_item,             /* sq_ass_item */
2533     (ssizessizeobjargproc)list_ass_slice,       /* sq_ass_slice */
2534     (objobjproc)list_contains,                  /* sq_contains */
2535     (binaryfunc)list_inplace_concat,            /* sq_inplace_concat */
2536     (ssizeargfunc)list_inplace_repeat,          /* sq_inplace_repeat */
2537 };
2538 
2539 PyDoc_STRVAR(list_doc,
2540 "list() -> new empty list\n"
2541 "list(iterable) -> new list initialized from iterable's items");
2542 
2543 
2544 static PyObject *
list_subscript(PyListObject * self,PyObject * item)2545 list_subscript(PyListObject* self, PyObject* item)
2546 {
2547     if (PyIndex_Check(item)) {
2548         Py_ssize_t i;
2549         i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2550         if (i == -1 && PyErr_Occurred())
2551             return NULL;
2552         if (i < 0)
2553             i += PyList_GET_SIZE(self);
2554         return list_item(self, i);
2555     }
2556     else if (PySlice_Check(item)) {
2557         Py_ssize_t start, stop, step, slicelength, cur, i;
2558         PyObject* result;
2559         PyObject* it;
2560         PyObject **src, **dest;
2561 
2562         if (_PySlice_Unpack(item, &start, &stop, &step) < 0) {
2563             return NULL;
2564         }
2565         slicelength = _PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2566                                             step);
2567 
2568         if (slicelength <= 0) {
2569             return PyList_New(0);
2570         }
2571         else if (step == 1) {
2572             return list_slice(self, start, stop);
2573         }
2574         else {
2575             result = PyList_New(slicelength);
2576             if (!result) return NULL;
2577 
2578             src = self->ob_item;
2579             dest = ((PyListObject *)result)->ob_item;
2580             for (cur = start, i = 0; i < slicelength;
2581                  cur += step, i++) {
2582                 it = src[cur];
2583                 Py_INCREF(it);
2584                 dest[i] = it;
2585             }
2586 
2587             return result;
2588         }
2589     }
2590     else {
2591         PyErr_Format(PyExc_TypeError,
2592                      "list indices must be integers, not %.200s",
2593                      item->ob_type->tp_name);
2594         return NULL;
2595     }
2596 }
2597 
2598 static int
list_ass_subscript(PyListObject * self,PyObject * item,PyObject * value)2599 list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2600 {
2601     if (PyIndex_Check(item)) {
2602         Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2603         if (i == -1 && PyErr_Occurred())
2604             return -1;
2605         if (i < 0)
2606             i += PyList_GET_SIZE(self);
2607         return list_ass_item(self, i, value);
2608     }
2609     else if (PySlice_Check(item)) {
2610         Py_ssize_t start, stop, step, slicelength;
2611 
2612         if (_PySlice_Unpack(item, &start, &stop, &step) < 0) {
2613             return -1;
2614         }
2615         slicelength = _PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2616                                             step);
2617 
2618         if (step == 1)
2619             return list_ass_slice(self, start, stop, value);
2620 
2621         /* Make sure s[5:2] = [..] inserts at the right place:
2622            before 5, not before 2. */
2623         if ((step < 0 && start < stop) ||
2624             (step > 0 && start > stop))
2625             stop = start;
2626 
2627         if (value == NULL) {
2628             /* delete slice */
2629             PyObject **garbage;
2630             size_t cur;
2631             Py_ssize_t i;
2632 
2633             if (slicelength <= 0)
2634                 return 0;
2635 
2636             if (step < 0) {
2637                 stop = start + 1;
2638                 start = stop + step*(slicelength - 1) - 1;
2639                 step = -step;
2640             }
2641 
2642             assert((size_t)slicelength <=
2643                    PY_SIZE_MAX / sizeof(PyObject*));
2644 
2645             garbage = (PyObject**)
2646                 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2647             if (!garbage) {
2648                 PyErr_NoMemory();
2649                 return -1;
2650             }
2651 
2652             /* drawing pictures might help understand these for
2653                loops. Basically, we memmove the parts of the
2654                list that are *not* part of the slice: step-1
2655                items for each item that is part of the slice,
2656                and then tail end of the list that was not
2657                covered by the slice */
2658             for (cur = start, i = 0;
2659                  cur < (size_t)stop;
2660                  cur += step, i++) {
2661                 Py_ssize_t lim = step - 1;
2662 
2663                 garbage[i] = PyList_GET_ITEM(self, cur);
2664 
2665                 if (cur + step >= (size_t)Py_SIZE(self)) {
2666                     lim = Py_SIZE(self) - cur - 1;
2667                 }
2668 
2669                 memmove(self->ob_item + cur - i,
2670                     self->ob_item + cur + 1,
2671                     lim * sizeof(PyObject *));
2672             }
2673             cur = start + slicelength*step;
2674             if (cur < (size_t)Py_SIZE(self)) {
2675                 memmove(self->ob_item + cur - slicelength,
2676                     self->ob_item + cur,
2677                     (Py_SIZE(self) - cur) *
2678                      sizeof(PyObject *));
2679             }
2680 
2681             Py_SIZE(self) -= slicelength;
2682             list_resize(self, Py_SIZE(self));
2683 
2684             for (i = 0; i < slicelength; i++) {
2685                 Py_DECREF(garbage[i]);
2686             }
2687             PyMem_FREE(garbage);
2688 
2689             return 0;
2690         }
2691         else {
2692             /* assign slice */
2693             PyObject *ins, *seq;
2694             PyObject **garbage, **seqitems, **selfitems;
2695             Py_ssize_t cur, i;
2696 
2697             /* protect against a[::-1] = a */
2698             if (self == (PyListObject*)value) {
2699                 seq = list_slice((PyListObject*)value, 0,
2700                                    PyList_GET_SIZE(value));
2701             }
2702             else {
2703                 seq = PySequence_Fast(value,
2704                                       "must assign iterable "
2705                                       "to extended slice");
2706             }
2707             if (!seq)
2708                 return -1;
2709 
2710             if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2711                 PyErr_Format(PyExc_ValueError,
2712                     "attempt to assign sequence of "
2713                     "size %zd to extended slice of "
2714                     "size %zd",
2715                          PySequence_Fast_GET_SIZE(seq),
2716                          slicelength);
2717                 Py_DECREF(seq);
2718                 return -1;
2719             }
2720 
2721             if (!slicelength) {
2722                 Py_DECREF(seq);
2723                 return 0;
2724             }
2725 
2726             garbage = (PyObject**)
2727                 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2728             if (!garbage) {
2729                 Py_DECREF(seq);
2730                 PyErr_NoMemory();
2731                 return -1;
2732             }
2733 
2734             selfitems = self->ob_item;
2735             seqitems = PySequence_Fast_ITEMS(seq);
2736             for (cur = start, i = 0; i < slicelength;
2737                  cur += step, i++) {
2738                 garbage[i] = selfitems[cur];
2739                 ins = seqitems[i];
2740                 Py_INCREF(ins);
2741                 selfitems[cur] = ins;
2742             }
2743 
2744             for (i = 0; i < slicelength; i++) {
2745                 Py_DECREF(garbage[i]);
2746             }
2747 
2748             PyMem_FREE(garbage);
2749             Py_DECREF(seq);
2750 
2751             return 0;
2752         }
2753     }
2754     else {
2755         PyErr_Format(PyExc_TypeError,
2756                      "list indices must be integers, not %.200s",
2757                      item->ob_type->tp_name);
2758         return -1;
2759     }
2760 }
2761 
2762 static PyMappingMethods list_as_mapping = {
2763     (lenfunc)list_length,
2764     (binaryfunc)list_subscript,
2765     (objobjargproc)list_ass_subscript
2766 };
2767 
2768 PyTypeObject PyList_Type = {
2769     PyVarObject_HEAD_INIT(&PyType_Type, 0)
2770     "list",
2771     sizeof(PyListObject),
2772     0,
2773     (destructor)list_dealloc,                   /* tp_dealloc */
2774     (printfunc)list_print,                      /* tp_print */
2775     0,                                          /* tp_getattr */
2776     0,                                          /* tp_setattr */
2777     0,                                          /* tp_compare */
2778     (reprfunc)list_repr,                        /* tp_repr */
2779     0,                                          /* tp_as_number */
2780     &list_as_sequence,                          /* tp_as_sequence */
2781     &list_as_mapping,                           /* tp_as_mapping */
2782     (hashfunc)PyObject_HashNotImplemented,      /* tp_hash */
2783     0,                                          /* tp_call */
2784     0,                                          /* tp_str */
2785     PyObject_GenericGetAttr,                    /* tp_getattro */
2786     0,                                          /* tp_setattro */
2787     0,                                          /* tp_as_buffer */
2788     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2789         Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS,         /* tp_flags */
2790     list_doc,                                   /* tp_doc */
2791     (traverseproc)list_traverse,                /* tp_traverse */
2792     (inquiry)list_clear,                        /* tp_clear */
2793     list_richcompare,                           /* tp_richcompare */
2794     0,                                          /* tp_weaklistoffset */
2795     list_iter,                                  /* tp_iter */
2796     0,                                          /* tp_iternext */
2797     list_methods,                               /* tp_methods */
2798     0,                                          /* tp_members */
2799     0,                                          /* tp_getset */
2800     0,                                          /* tp_base */
2801     0,                                          /* tp_dict */
2802     0,                                          /* tp_descr_get */
2803     0,                                          /* tp_descr_set */
2804     0,                                          /* tp_dictoffset */
2805     (initproc)list_init,                        /* tp_init */
2806     PyType_GenericAlloc,                        /* tp_alloc */
2807     PyType_GenericNew,                          /* tp_new */
2808     PyObject_GC_Del,                            /* tp_free */
2809 };
2810 
2811 
2812 /*********************** List Iterator **************************/
2813 
2814 typedef struct {
2815     PyObject_HEAD
2816     long it_index;
2817     PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2818 } listiterobject;
2819 
2820 static PyObject *list_iter(PyObject *);
2821 static void listiter_dealloc(listiterobject *);
2822 static int listiter_traverse(listiterobject *, visitproc, void *);
2823 static PyObject *listiter_next(listiterobject *);
2824 static PyObject *listiter_len(listiterobject *);
2825 
2826 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2827 
2828 static PyMethodDef listiter_methods[] = {
2829     {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
2830     {NULL,              NULL}           /* sentinel */
2831 };
2832 
2833 PyTypeObject PyListIter_Type = {
2834     PyVarObject_HEAD_INIT(&PyType_Type, 0)
2835     "listiterator",                             /* tp_name */
2836     sizeof(listiterobject),                     /* tp_basicsize */
2837     0,                                          /* tp_itemsize */
2838     /* methods */
2839     (destructor)listiter_dealloc,               /* tp_dealloc */
2840     0,                                          /* tp_print */
2841     0,                                          /* tp_getattr */
2842     0,                                          /* tp_setattr */
2843     0,                                          /* tp_compare */
2844     0,                                          /* tp_repr */
2845     0,                                          /* tp_as_number */
2846     0,                                          /* tp_as_sequence */
2847     0,                                          /* tp_as_mapping */
2848     0,                                          /* tp_hash */
2849     0,                                          /* tp_call */
2850     0,                                          /* tp_str */
2851     PyObject_GenericGetAttr,                    /* tp_getattro */
2852     0,                                          /* tp_setattro */
2853     0,                                          /* tp_as_buffer */
2854     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2855     0,                                          /* tp_doc */
2856     (traverseproc)listiter_traverse,            /* tp_traverse */
2857     0,                                          /* tp_clear */
2858     0,                                          /* tp_richcompare */
2859     0,                                          /* tp_weaklistoffset */
2860     PyObject_SelfIter,                          /* tp_iter */
2861     (iternextfunc)listiter_next,                /* tp_iternext */
2862     listiter_methods,                           /* tp_methods */
2863     0,                                          /* tp_members */
2864 };
2865 
2866 
2867 static PyObject *
list_iter(PyObject * seq)2868 list_iter(PyObject *seq)
2869 {
2870     listiterobject *it;
2871 
2872     if (!PyList_Check(seq)) {
2873         PyErr_BadInternalCall();
2874         return NULL;
2875     }
2876     it = PyObject_GC_New(listiterobject, &PyListIter_Type);
2877     if (it == NULL)
2878         return NULL;
2879     it->it_index = 0;
2880     Py_INCREF(seq);
2881     it->it_seq = (PyListObject *)seq;
2882     _PyObject_GC_TRACK(it);
2883     return (PyObject *)it;
2884 }
2885 
2886 static void
listiter_dealloc(listiterobject * it)2887 listiter_dealloc(listiterobject *it)
2888 {
2889     _PyObject_GC_UNTRACK(it);
2890     Py_XDECREF(it->it_seq);
2891     PyObject_GC_Del(it);
2892 }
2893 
2894 static int
listiter_traverse(listiterobject * it,visitproc visit,void * arg)2895 listiter_traverse(listiterobject *it, visitproc visit, void *arg)
2896 {
2897     Py_VISIT(it->it_seq);
2898     return 0;
2899 }
2900 
2901 static PyObject *
listiter_next(listiterobject * it)2902 listiter_next(listiterobject *it)
2903 {
2904     PyListObject *seq;
2905     PyObject *item;
2906 
2907     assert(it != NULL);
2908     seq = it->it_seq;
2909     if (seq == NULL)
2910         return NULL;
2911     assert(PyList_Check(seq));
2912 
2913     if (it->it_index < PyList_GET_SIZE(seq)) {
2914         item = PyList_GET_ITEM(seq, it->it_index);
2915         ++it->it_index;
2916         Py_INCREF(item);
2917         return item;
2918     }
2919 
2920     it->it_seq = NULL;
2921     Py_DECREF(seq);
2922     return NULL;
2923 }
2924 
2925 static PyObject *
listiter_len(listiterobject * it)2926 listiter_len(listiterobject *it)
2927 {
2928     Py_ssize_t len;
2929     if (it->it_seq) {
2930         len = PyList_GET_SIZE(it->it_seq) - it->it_index;
2931         if (len >= 0)
2932             return PyInt_FromSsize_t(len);
2933     }
2934     return PyInt_FromLong(0);
2935 }
2936 /*********************** List Reverse Iterator **************************/
2937 
2938 typedef struct {
2939     PyObject_HEAD
2940     Py_ssize_t it_index;
2941     PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
2942 } listreviterobject;
2943 
2944 static PyObject *list_reversed(PyListObject *, PyObject *);
2945 static void listreviter_dealloc(listreviterobject *);
2946 static int listreviter_traverse(listreviterobject *, visitproc, void *);
2947 static PyObject *listreviter_next(listreviterobject *);
2948 static PyObject *listreviter_len(listreviterobject *);
2949 
2950 static PyMethodDef listreviter_methods[] = {
2951     {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
2952     {NULL,              NULL}           /* sentinel */
2953 };
2954 
2955 PyTypeObject PyListRevIter_Type = {
2956     PyVarObject_HEAD_INIT(&PyType_Type, 0)
2957     "listreverseiterator",                      /* tp_name */
2958     sizeof(listreviterobject),                  /* tp_basicsize */
2959     0,                                          /* tp_itemsize */
2960     /* methods */
2961     (destructor)listreviter_dealloc,            /* tp_dealloc */
2962     0,                                          /* tp_print */
2963     0,                                          /* tp_getattr */
2964     0,                                          /* tp_setattr */
2965     0,                                          /* tp_compare */
2966     0,                                          /* tp_repr */
2967     0,                                          /* tp_as_number */
2968     0,                                          /* tp_as_sequence */
2969     0,                                          /* tp_as_mapping */
2970     0,                                          /* tp_hash */
2971     0,                                          /* tp_call */
2972     0,                                          /* tp_str */
2973     PyObject_GenericGetAttr,                    /* tp_getattro */
2974     0,                                          /* tp_setattro */
2975     0,                                          /* tp_as_buffer */
2976     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2977     0,                                          /* tp_doc */
2978     (traverseproc)listreviter_traverse,         /* tp_traverse */
2979     0,                                          /* tp_clear */
2980     0,                                          /* tp_richcompare */
2981     0,                                          /* tp_weaklistoffset */
2982     PyObject_SelfIter,                          /* tp_iter */
2983     (iternextfunc)listreviter_next,             /* tp_iternext */
2984     listreviter_methods,                /* tp_methods */
2985     0,
2986 };
2987 
2988 static PyObject *
list_reversed(PyListObject * seq,PyObject * unused)2989 list_reversed(PyListObject *seq, PyObject *unused)
2990 {
2991     listreviterobject *it;
2992 
2993     it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
2994     if (it == NULL)
2995         return NULL;
2996     assert(PyList_Check(seq));
2997     it->it_index = PyList_GET_SIZE(seq) - 1;
2998     Py_INCREF(seq);
2999     it->it_seq = seq;
3000     PyObject_GC_Track(it);
3001     return (PyObject *)it;
3002 }
3003 
3004 static void
listreviter_dealloc(listreviterobject * it)3005 listreviter_dealloc(listreviterobject *it)
3006 {
3007     PyObject_GC_UnTrack(it);
3008     Py_XDECREF(it->it_seq);
3009     PyObject_GC_Del(it);
3010 }
3011 
3012 static int
listreviter_traverse(listreviterobject * it,visitproc visit,void * arg)3013 listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
3014 {
3015     Py_VISIT(it->it_seq);
3016     return 0;
3017 }
3018 
3019 static PyObject *
listreviter_next(listreviterobject * it)3020 listreviter_next(listreviterobject *it)
3021 {
3022     PyObject *item;
3023     Py_ssize_t index;
3024     PyListObject *seq;
3025 
3026     assert(it != NULL);
3027     seq = it->it_seq;
3028     if (seq == NULL) {
3029         return NULL;
3030     }
3031     assert(PyList_Check(seq));
3032 
3033     index = it->it_index;
3034     if (index>=0 && index < PyList_GET_SIZE(seq)) {
3035         item = PyList_GET_ITEM(seq, index);
3036         it->it_index--;
3037         Py_INCREF(item);
3038         return item;
3039     }
3040     it->it_index = -1;
3041     it->it_seq = NULL;
3042     Py_DECREF(seq);
3043     return NULL;
3044 }
3045 
3046 static PyObject *
listreviter_len(listreviterobject * it)3047 listreviter_len(listreviterobject *it)
3048 {
3049     Py_ssize_t len = it->it_index + 1;
3050     if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
3051         len = 0;
3052     return PyLong_FromSsize_t(len);
3053 }
3054