1 /* List object implementation */
2 
3 #include "Python.h"
4 #include "pycore_abstract.h"   // _PyIndex_Check()
5 #include "pycore_object.h"
6 #include "pycore_tupleobject.h"
7 #include "pycore_accu.h"
8 
9 #ifdef STDC_HEADERS
10 #include <stddef.h>
11 #else
12 #include <sys/types.h>          /* For size_t */
13 #endif
14 
15 /*[clinic input]
16 class list "PyListObject *" "&PyList_Type"
17 [clinic start generated code]*/
18 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=f9b222678f9f71e0]*/
19 
20 #include "clinic/listobject.c.h"
21 
22 /* Ensure ob_item has room for at least newsize elements, and set
23  * ob_size to newsize.  If newsize > ob_size on entry, the content
24  * of the new slots at exit is undefined heap trash; it's the caller's
25  * responsibility to overwrite them with sane values.
26  * The number of allocated elements may grow, shrink, or stay the same.
27  * Failure is impossible if newsize <= self.allocated on entry, although
28  * that partly relies on an assumption that the system realloc() never
29  * fails when passed a number of bytes <= the number of bytes last
30  * allocated (the C standard doesn't guarantee this, but it's hard to
31  * imagine a realloc implementation where it wouldn't be true).
32  * Note that self->ob_item may change, and even if newsize is less
33  * than ob_size on entry.
34  */
35 static int
list_resize(PyListObject * self,Py_ssize_t newsize)36 list_resize(PyListObject *self, Py_ssize_t newsize)
37 {
38     PyObject **items;
39     size_t new_allocated, num_allocated_bytes;
40     Py_ssize_t allocated = self->allocated;
41 
42     /* Bypass realloc() when a previous overallocation is large enough
43        to accommodate the newsize.  If the newsize falls lower than half
44        the allocated size, then proceed with the realloc() to shrink the list.
45     */
46     if (allocated >= newsize && newsize >= (allocated >> 1)) {
47         assert(self->ob_item != NULL || newsize == 0);
48         Py_SET_SIZE(self, newsize);
49         return 0;
50     }
51 
52     /* This over-allocates proportional to the list size, making room
53      * for additional growth.  The over-allocation is mild, but is
54      * enough to give linear-time amortized behavior over a long
55      * sequence of appends() in the presence of a poorly-performing
56      * system realloc().
57      * Add padding to make the allocated size multiple of 4.
58      * The growth pattern is:  0, 4, 8, 16, 24, 32, 40, 52, 64, 76, ...
59      * Note: new_allocated won't overflow because the largest possible value
60      *       is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t.
61      */
62     new_allocated = ((size_t)newsize + (newsize >> 3) + 6) & ~(size_t)3;
63     /* Do not overallocate if the new size is closer to overalocated size
64      * than to the old size.
65      */
66     if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize))
67         new_allocated = ((size_t)newsize + 3) & ~(size_t)3;
68 
69     if (newsize == 0)
70         new_allocated = 0;
71     num_allocated_bytes = new_allocated * sizeof(PyObject *);
72     items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes);
73     if (items == NULL) {
74         PyErr_NoMemory();
75         return -1;
76     }
77     self->ob_item = items;
78     Py_SET_SIZE(self, newsize);
79     self->allocated = new_allocated;
80     return 0;
81 }
82 
83 static int
list_preallocate_exact(PyListObject * self,Py_ssize_t size)84 list_preallocate_exact(PyListObject *self, Py_ssize_t size)
85 {
86     assert(self->ob_item == NULL);
87     assert(size > 0);
88 
89     PyObject **items = PyMem_New(PyObject*, size);
90     if (items == NULL) {
91         PyErr_NoMemory();
92         return -1;
93     }
94     self->ob_item = items;
95     self->allocated = size;
96     return 0;
97 }
98 
99 /* Empty list reuse scheme to save calls to malloc and free */
100 #ifndef PyList_MAXFREELIST
101 #  define PyList_MAXFREELIST 80
102 #endif
103 
104 static PyListObject *free_list[PyList_MAXFREELIST];
105 static int numfree = 0;
106 
107 void
_PyList_ClearFreeList(void)108 _PyList_ClearFreeList(void)
109 {
110     while (numfree) {
111         PyListObject *op = free_list[--numfree];
112         assert(PyList_CheckExact(op));
113         PyObject_GC_Del(op);
114     }
115 }
116 
117 void
_PyList_Fini(void)118 _PyList_Fini(void)
119 {
120     _PyList_ClearFreeList();
121 }
122 
123 /* Print summary info about the state of the optimized allocator */
124 void
_PyList_DebugMallocStats(FILE * out)125 _PyList_DebugMallocStats(FILE *out)
126 {
127     _PyDebugAllocatorStats(out,
128                            "free PyListObject",
129                            numfree, sizeof(PyListObject));
130 }
131 
132 PyObject *
PyList_New(Py_ssize_t size)133 PyList_New(Py_ssize_t size)
134 {
135     PyListObject *op;
136 
137     if (size < 0) {
138         PyErr_BadInternalCall();
139         return NULL;
140     }
141     if (numfree) {
142         numfree--;
143         op = free_list[numfree];
144         _Py_NewReference((PyObject *)op);
145     } else {
146         op = PyObject_GC_New(PyListObject, &PyList_Type);
147         if (op == NULL)
148             return NULL;
149     }
150     if (size <= 0)
151         op->ob_item = NULL;
152     else {
153         op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));
154         if (op->ob_item == NULL) {
155             Py_DECREF(op);
156             return PyErr_NoMemory();
157         }
158     }
159     Py_SET_SIZE(op, size);
160     op->allocated = size;
161     _PyObject_GC_TRACK(op);
162     return (PyObject *) op;
163 }
164 
165 static PyObject *
list_new_prealloc(Py_ssize_t size)166 list_new_prealloc(Py_ssize_t size)
167 {
168     PyListObject *op = (PyListObject *) PyList_New(0);
169     if (size == 0 || op == NULL) {
170         return (PyObject *) op;
171     }
172     assert(op->ob_item == NULL);
173     op->ob_item = PyMem_New(PyObject *, size);
174     if (op->ob_item == NULL) {
175         Py_DECREF(op);
176         return PyErr_NoMemory();
177     }
178     op->allocated = size;
179     return (PyObject *) op;
180 }
181 
182 Py_ssize_t
PyList_Size(PyObject * op)183 PyList_Size(PyObject *op)
184 {
185     if (!PyList_Check(op)) {
186         PyErr_BadInternalCall();
187         return -1;
188     }
189     else
190         return Py_SIZE(op);
191 }
192 
193 static inline int
valid_index(Py_ssize_t i,Py_ssize_t limit)194 valid_index(Py_ssize_t i, Py_ssize_t limit)
195 {
196     /* The cast to size_t lets us use just a single comparison
197        to check whether i is in the range: 0 <= i < limit.
198 
199        See:  Section 14.2 "Bounds Checking" in the Agner Fog
200        optimization manual found at:
201        https://www.agner.org/optimize/optimizing_cpp.pdf
202     */
203     return (size_t) i < (size_t) limit;
204 }
205 
206 static PyObject *indexerr = NULL;
207 
208 PyObject *
PyList_GetItem(PyObject * op,Py_ssize_t i)209 PyList_GetItem(PyObject *op, Py_ssize_t i)
210 {
211     if (!PyList_Check(op)) {
212         PyErr_BadInternalCall();
213         return NULL;
214     }
215     if (!valid_index(i, Py_SIZE(op))) {
216         if (indexerr == NULL) {
217             indexerr = PyUnicode_FromString(
218                 "list index out of range");
219             if (indexerr == NULL)
220                 return NULL;
221         }
222         PyErr_SetObject(PyExc_IndexError, indexerr);
223         return NULL;
224     }
225     return ((PyListObject *)op) -> ob_item[i];
226 }
227 
228 int
PyList_SetItem(PyObject * op,Py_ssize_t i,PyObject * newitem)229 PyList_SetItem(PyObject *op, Py_ssize_t i,
230                PyObject *newitem)
231 {
232     PyObject **p;
233     if (!PyList_Check(op)) {
234         Py_XDECREF(newitem);
235         PyErr_BadInternalCall();
236         return -1;
237     }
238     if (!valid_index(i, Py_SIZE(op))) {
239         Py_XDECREF(newitem);
240         PyErr_SetString(PyExc_IndexError,
241                         "list assignment index out of range");
242         return -1;
243     }
244     p = ((PyListObject *)op) -> ob_item + i;
245     Py_XSETREF(*p, newitem);
246     return 0;
247 }
248 
249 static int
ins1(PyListObject * self,Py_ssize_t where,PyObject * v)250 ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
251 {
252     Py_ssize_t i, n = Py_SIZE(self);
253     PyObject **items;
254     if (v == NULL) {
255         PyErr_BadInternalCall();
256         return -1;
257     }
258     if (n == PY_SSIZE_T_MAX) {
259         PyErr_SetString(PyExc_OverflowError,
260             "cannot add more objects to list");
261         return -1;
262     }
263 
264     if (list_resize(self, n+1) < 0)
265         return -1;
266 
267     if (where < 0) {
268         where += n;
269         if (where < 0)
270             where = 0;
271     }
272     if (where > n)
273         where = n;
274     items = self->ob_item;
275     for (i = n; --i >= where; )
276         items[i+1] = items[i];
277     Py_INCREF(v);
278     items[where] = v;
279     return 0;
280 }
281 
282 int
PyList_Insert(PyObject * op,Py_ssize_t where,PyObject * newitem)283 PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
284 {
285     if (!PyList_Check(op)) {
286         PyErr_BadInternalCall();
287         return -1;
288     }
289     return ins1((PyListObject *)op, where, newitem);
290 }
291 
292 static int
app1(PyListObject * self,PyObject * v)293 app1(PyListObject *self, PyObject *v)
294 {
295     Py_ssize_t n = PyList_GET_SIZE(self);
296 
297     assert (v != NULL);
298     if (n == PY_SSIZE_T_MAX) {
299         PyErr_SetString(PyExc_OverflowError,
300             "cannot add more objects to list");
301         return -1;
302     }
303 
304     if (list_resize(self, n+1) < 0)
305         return -1;
306 
307     Py_INCREF(v);
308     PyList_SET_ITEM(self, n, v);
309     return 0;
310 }
311 
312 int
PyList_Append(PyObject * op,PyObject * newitem)313 PyList_Append(PyObject *op, PyObject *newitem)
314 {
315     if (PyList_Check(op) && (newitem != NULL))
316         return app1((PyListObject *)op, newitem);
317     PyErr_BadInternalCall();
318     return -1;
319 }
320 
321 /* Methods */
322 
323 static void
list_dealloc(PyListObject * op)324 list_dealloc(PyListObject *op)
325 {
326     Py_ssize_t i;
327     PyObject_GC_UnTrack(op);
328     Py_TRASHCAN_BEGIN(op, list_dealloc)
329     if (op->ob_item != NULL) {
330         /* Do it backwards, for Christian Tismer.
331            There's a simple test case where somehow this reduces
332            thrashing when a *very* large list is created and
333            immediately deleted. */
334         i = Py_SIZE(op);
335         while (--i >= 0) {
336             Py_XDECREF(op->ob_item[i]);
337         }
338         PyMem_FREE(op->ob_item);
339     }
340     if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
341         free_list[numfree++] = op;
342     else
343         Py_TYPE(op)->tp_free((PyObject *)op);
344     Py_TRASHCAN_END
345 }
346 
347 static PyObject *
list_repr(PyListObject * v)348 list_repr(PyListObject *v)
349 {
350     Py_ssize_t i;
351     PyObject *s;
352     _PyUnicodeWriter writer;
353 
354     if (Py_SIZE(v) == 0) {
355         return PyUnicode_FromString("[]");
356     }
357 
358     i = Py_ReprEnter((PyObject*)v);
359     if (i != 0) {
360         return i > 0 ? PyUnicode_FromString("[...]") : NULL;
361     }
362 
363     _PyUnicodeWriter_Init(&writer);
364     writer.overallocate = 1;
365     /* "[" + "1" + ", 2" * (len - 1) + "]" */
366     writer.min_length = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1;
367 
368     if (_PyUnicodeWriter_WriteChar(&writer, '[') < 0)
369         goto error;
370 
371     /* Do repr() on each element.  Note that this may mutate the list,
372        so must refetch the list size on each iteration. */
373     for (i = 0; i < Py_SIZE(v); ++i) {
374         if (i > 0) {
375             if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
376                 goto error;
377         }
378 
379         s = PyObject_Repr(v->ob_item[i]);
380         if (s == NULL)
381             goto error;
382 
383         if (_PyUnicodeWriter_WriteStr(&writer, s) < 0) {
384             Py_DECREF(s);
385             goto error;
386         }
387         Py_DECREF(s);
388     }
389 
390     writer.overallocate = 0;
391     if (_PyUnicodeWriter_WriteChar(&writer, ']') < 0)
392         goto error;
393 
394     Py_ReprLeave((PyObject *)v);
395     return _PyUnicodeWriter_Finish(&writer);
396 
397 error:
398     _PyUnicodeWriter_Dealloc(&writer);
399     Py_ReprLeave((PyObject *)v);
400     return NULL;
401 }
402 
403 static Py_ssize_t
list_length(PyListObject * a)404 list_length(PyListObject *a)
405 {
406     return Py_SIZE(a);
407 }
408 
409 static int
list_contains(PyListObject * a,PyObject * el)410 list_contains(PyListObject *a, PyObject *el)
411 {
412     PyObject *item;
413     Py_ssize_t i;
414     int cmp;
415 
416     for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) {
417         item = PyList_GET_ITEM(a, i);
418         Py_INCREF(item);
419         cmp = PyObject_RichCompareBool(item, el, Py_EQ);
420         Py_DECREF(item);
421     }
422     return cmp;
423 }
424 
425 static PyObject *
list_item(PyListObject * a,Py_ssize_t i)426 list_item(PyListObject *a, Py_ssize_t i)
427 {
428     if (!valid_index(i, Py_SIZE(a))) {
429         if (indexerr == NULL) {
430             indexerr = PyUnicode_FromString(
431                 "list index out of range");
432             if (indexerr == NULL)
433                 return NULL;
434         }
435         PyErr_SetObject(PyExc_IndexError, indexerr);
436         return NULL;
437     }
438     Py_INCREF(a->ob_item[i]);
439     return a->ob_item[i];
440 }
441 
442 static PyObject *
list_slice(PyListObject * a,Py_ssize_t ilow,Py_ssize_t ihigh)443 list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
444 {
445     PyListObject *np;
446     PyObject **src, **dest;
447     Py_ssize_t i, len;
448     len = ihigh - ilow;
449     np = (PyListObject *) list_new_prealloc(len);
450     if (np == NULL)
451         return NULL;
452 
453     src = a->ob_item + ilow;
454     dest = np->ob_item;
455     for (i = 0; i < len; i++) {
456         PyObject *v = src[i];
457         Py_INCREF(v);
458         dest[i] = v;
459     }
460     Py_SET_SIZE(np, len);
461     return (PyObject *)np;
462 }
463 
464 PyObject *
PyList_GetSlice(PyObject * a,Py_ssize_t ilow,Py_ssize_t ihigh)465 PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
466 {
467     if (!PyList_Check(a)) {
468         PyErr_BadInternalCall();
469         return NULL;
470     }
471     if (ilow < 0) {
472         ilow = 0;
473     }
474     else if (ilow > Py_SIZE(a)) {
475         ilow = Py_SIZE(a);
476     }
477     if (ihigh < ilow) {
478         ihigh = ilow;
479     }
480     else if (ihigh > Py_SIZE(a)) {
481         ihigh = Py_SIZE(a);
482     }
483     return list_slice((PyListObject *)a, ilow, ihigh);
484 }
485 
486 static PyObject *
list_concat(PyListObject * a,PyObject * bb)487 list_concat(PyListObject *a, PyObject *bb)
488 {
489     Py_ssize_t size;
490     Py_ssize_t i;
491     PyObject **src, **dest;
492     PyListObject *np;
493     if (!PyList_Check(bb)) {
494         PyErr_Format(PyExc_TypeError,
495                   "can only concatenate list (not \"%.200s\") to list",
496                   Py_TYPE(bb)->tp_name);
497         return NULL;
498     }
499 #define b ((PyListObject *)bb)
500     if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b))
501         return PyErr_NoMemory();
502     size = Py_SIZE(a) + Py_SIZE(b);
503     np = (PyListObject *) list_new_prealloc(size);
504     if (np == NULL) {
505         return NULL;
506     }
507     src = a->ob_item;
508     dest = np->ob_item;
509     for (i = 0; i < Py_SIZE(a); i++) {
510         PyObject *v = src[i];
511         Py_INCREF(v);
512         dest[i] = v;
513     }
514     src = b->ob_item;
515     dest = np->ob_item + Py_SIZE(a);
516     for (i = 0; i < Py_SIZE(b); i++) {
517         PyObject *v = src[i];
518         Py_INCREF(v);
519         dest[i] = v;
520     }
521     Py_SET_SIZE(np, size);
522     return (PyObject *)np;
523 #undef b
524 }
525 
526 static PyObject *
list_repeat(PyListObject * a,Py_ssize_t n)527 list_repeat(PyListObject *a, Py_ssize_t n)
528 {
529     Py_ssize_t i, j;
530     Py_ssize_t size;
531     PyListObject *np;
532     PyObject **p, **items;
533     PyObject *elem;
534     if (n < 0)
535         n = 0;
536     if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
537         return PyErr_NoMemory();
538     size = Py_SIZE(a) * n;
539     if (size == 0)
540         return PyList_New(0);
541     np = (PyListObject *) list_new_prealloc(size);
542     if (np == NULL)
543         return NULL;
544 
545     if (Py_SIZE(a) == 1) {
546         items = np->ob_item;
547         elem = a->ob_item[0];
548         for (i = 0; i < n; i++) {
549             items[i] = elem;
550             Py_INCREF(elem);
551         }
552     }
553     else {
554         p = np->ob_item;
555         items = a->ob_item;
556         for (i = 0; i < n; i++) {
557             for (j = 0; j < Py_SIZE(a); j++) {
558                 *p = items[j];
559                 Py_INCREF(*p);
560                 p++;
561             }
562         }
563     }
564     Py_SET_SIZE(np, size);
565     return (PyObject *) np;
566 }
567 
568 static int
_list_clear(PyListObject * a)569 _list_clear(PyListObject *a)
570 {
571     Py_ssize_t i;
572     PyObject **item = a->ob_item;
573     if (item != NULL) {
574         /* Because XDECREF can recursively invoke operations on
575            this list, we make it empty first. */
576         i = Py_SIZE(a);
577         Py_SET_SIZE(a, 0);
578         a->ob_item = NULL;
579         a->allocated = 0;
580         while (--i >= 0) {
581             Py_XDECREF(item[i]);
582         }
583         PyMem_FREE(item);
584     }
585     /* Never fails; the return value can be ignored.
586        Note that there is no guarantee that the list is actually empty
587        at this point, because XDECREF may have populated it again! */
588     return 0;
589 }
590 
591 /* a[ilow:ihigh] = v if v != NULL.
592  * del a[ilow:ihigh] if v == NULL.
593  *
594  * Special speed gimmick:  when v is NULL and ihigh - ilow <= 8, it's
595  * guaranteed the call cannot fail.
596  */
597 static int
list_ass_slice(PyListObject * a,Py_ssize_t ilow,Py_ssize_t ihigh,PyObject * v)598 list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
599 {
600     /* Because [X]DECREF can recursively invoke list operations on
601        this list, we must postpone all [X]DECREF activity until
602        after the list is back in its canonical shape.  Therefore
603        we must allocate an additional array, 'recycle', into which
604        we temporarily copy the items that are deleted from the
605        list. :-( */
606     PyObject *recycle_on_stack[8];
607     PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
608     PyObject **item;
609     PyObject **vitem = NULL;
610     PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
611     Py_ssize_t n; /* # of elements in replacement list */
612     Py_ssize_t norig; /* # of elements in list getting replaced */
613     Py_ssize_t d; /* Change in size */
614     Py_ssize_t k;
615     size_t s;
616     int result = -1;            /* guilty until proved innocent */
617 #define b ((PyListObject *)v)
618     if (v == NULL)
619         n = 0;
620     else {
621         if (a == b) {
622             /* Special case "a[i:j] = a" -- copy b first */
623             v = list_slice(b, 0, Py_SIZE(b));
624             if (v == NULL)
625                 return result;
626             result = list_ass_slice(a, ilow, ihigh, v);
627             Py_DECREF(v);
628             return result;
629         }
630         v_as_SF = PySequence_Fast(v, "can only assign an iterable");
631         if(v_as_SF == NULL)
632             goto Error;
633         n = PySequence_Fast_GET_SIZE(v_as_SF);
634         vitem = PySequence_Fast_ITEMS(v_as_SF);
635     }
636     if (ilow < 0)
637         ilow = 0;
638     else if (ilow > Py_SIZE(a))
639         ilow = Py_SIZE(a);
640 
641     if (ihigh < ilow)
642         ihigh = ilow;
643     else if (ihigh > Py_SIZE(a))
644         ihigh = Py_SIZE(a);
645 
646     norig = ihigh - ilow;
647     assert(norig >= 0);
648     d = n - norig;
649     if (Py_SIZE(a) + d == 0) {
650         Py_XDECREF(v_as_SF);
651         return _list_clear(a);
652     }
653     item = a->ob_item;
654     /* recycle the items that we are about to remove */
655     s = norig * sizeof(PyObject *);
656     /* If norig == 0, item might be NULL, in which case we may not memcpy from it. */
657     if (s) {
658         if (s > sizeof(recycle_on_stack)) {
659             recycle = (PyObject **)PyMem_MALLOC(s);
660             if (recycle == NULL) {
661                 PyErr_NoMemory();
662                 goto Error;
663             }
664         }
665         memcpy(recycle, &item[ilow], s);
666     }
667 
668     if (d < 0) { /* Delete -d items */
669         Py_ssize_t tail;
670         tail = (Py_SIZE(a) - ihigh) * sizeof(PyObject *);
671         memmove(&item[ihigh+d], &item[ihigh], tail);
672         if (list_resize(a, Py_SIZE(a) + d) < 0) {
673             memmove(&item[ihigh], &item[ihigh+d], tail);
674             memcpy(&item[ilow], recycle, s);
675             goto Error;
676         }
677         item = a->ob_item;
678     }
679     else if (d > 0) { /* Insert d items */
680         k = Py_SIZE(a);
681         if (list_resize(a, k+d) < 0)
682             goto Error;
683         item = a->ob_item;
684         memmove(&item[ihigh+d], &item[ihigh],
685             (k - ihigh)*sizeof(PyObject *));
686     }
687     for (k = 0; k < n; k++, ilow++) {
688         PyObject *w = vitem[k];
689         Py_XINCREF(w);
690         item[ilow] = w;
691     }
692     for (k = norig - 1; k >= 0; --k)
693         Py_XDECREF(recycle[k]);
694     result = 0;
695  Error:
696     if (recycle != recycle_on_stack)
697         PyMem_FREE(recycle);
698     Py_XDECREF(v_as_SF);
699     return result;
700 #undef b
701 }
702 
703 int
PyList_SetSlice(PyObject * a,Py_ssize_t ilow,Py_ssize_t ihigh,PyObject * v)704 PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
705 {
706     if (!PyList_Check(a)) {
707         PyErr_BadInternalCall();
708         return -1;
709     }
710     return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
711 }
712 
713 static PyObject *
list_inplace_repeat(PyListObject * self,Py_ssize_t n)714 list_inplace_repeat(PyListObject *self, Py_ssize_t n)
715 {
716     PyObject **items;
717     Py_ssize_t size, i, j, p;
718 
719 
720     size = PyList_GET_SIZE(self);
721     if (size == 0 || n == 1) {
722         Py_INCREF(self);
723         return (PyObject *)self;
724     }
725 
726     if (n < 1) {
727         (void)_list_clear(self);
728         Py_INCREF(self);
729         return (PyObject *)self;
730     }
731 
732     if (size > PY_SSIZE_T_MAX / n) {
733         return PyErr_NoMemory();
734     }
735 
736     if (list_resize(self, size*n) < 0)
737         return NULL;
738 
739     p = size;
740     items = self->ob_item;
741     for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
742         for (j = 0; j < size; j++) {
743             PyObject *o = items[j];
744             Py_INCREF(o);
745             items[p++] = o;
746         }
747     }
748     Py_INCREF(self);
749     return (PyObject *)self;
750 }
751 
752 static int
list_ass_item(PyListObject * a,Py_ssize_t i,PyObject * v)753 list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
754 {
755     if (!valid_index(i, Py_SIZE(a))) {
756         PyErr_SetString(PyExc_IndexError,
757                         "list assignment index out of range");
758         return -1;
759     }
760     if (v == NULL)
761         return list_ass_slice(a, i, i+1, v);
762     Py_INCREF(v);
763     Py_SETREF(a->ob_item[i], v);
764     return 0;
765 }
766 
767 /*[clinic input]
768 list.insert
769 
770     index: Py_ssize_t
771     object: object
772     /
773 
774 Insert object before index.
775 [clinic start generated code]*/
776 
777 static PyObject *
list_insert_impl(PyListObject * self,Py_ssize_t index,PyObject * object)778 list_insert_impl(PyListObject *self, Py_ssize_t index, PyObject *object)
779 /*[clinic end generated code: output=7f35e32f60c8cb78 input=858514cf894c7eab]*/
780 {
781     if (ins1(self, index, object) == 0)
782         Py_RETURN_NONE;
783     return NULL;
784 }
785 
786 /*[clinic input]
787 list.clear
788 
789 Remove all items from list.
790 [clinic start generated code]*/
791 
792 static PyObject *
list_clear_impl(PyListObject * self)793 list_clear_impl(PyListObject *self)
794 /*[clinic end generated code: output=67a1896c01f74362 input=ca3c1646856742f6]*/
795 {
796     _list_clear(self);
797     Py_RETURN_NONE;
798 }
799 
800 /*[clinic input]
801 list.copy
802 
803 Return a shallow copy of the list.
804 [clinic start generated code]*/
805 
806 static PyObject *
list_copy_impl(PyListObject * self)807 list_copy_impl(PyListObject *self)
808 /*[clinic end generated code: output=ec6b72d6209d418e input=6453ab159e84771f]*/
809 {
810     return list_slice(self, 0, Py_SIZE(self));
811 }
812 
813 /*[clinic input]
814 list.append
815 
816      object: object
817      /
818 
819 Append object to the end of the list.
820 [clinic start generated code]*/
821 
822 static PyObject *
list_append(PyListObject * self,PyObject * object)823 list_append(PyListObject *self, PyObject *object)
824 /*[clinic end generated code: output=7c096003a29c0eae input=43a3fe48a7066e91]*/
825 {
826     if (app1(self, object) == 0)
827         Py_RETURN_NONE;
828     return NULL;
829 }
830 
831 /*[clinic input]
832 list.extend
833 
834      iterable: object
835      /
836 
837 Extend list by appending elements from the iterable.
838 [clinic start generated code]*/
839 
840 static PyObject *
list_extend(PyListObject * self,PyObject * iterable)841 list_extend(PyListObject *self, PyObject *iterable)
842 /*[clinic end generated code: output=630fb3bca0c8e789 input=9ec5ba3a81be3a4d]*/
843 {
844     PyObject *it;      /* iter(v) */
845     Py_ssize_t m;                  /* size of self */
846     Py_ssize_t n;                  /* guess for size of iterable */
847     Py_ssize_t mn;                 /* m + n */
848     Py_ssize_t i;
849     PyObject *(*iternext)(PyObject *);
850 
851     /* Special cases:
852        1) lists and tuples which can use PySequence_Fast ops
853        2) extending self to self requires making a copy first
854     */
855     if (PyList_CheckExact(iterable) || PyTuple_CheckExact(iterable) ||
856                 (PyObject *)self == iterable) {
857         PyObject **src, **dest;
858         iterable = PySequence_Fast(iterable, "argument must be iterable");
859         if (!iterable)
860             return NULL;
861         n = PySequence_Fast_GET_SIZE(iterable);
862         if (n == 0) {
863             /* short circuit when iterable is empty */
864             Py_DECREF(iterable);
865             Py_RETURN_NONE;
866         }
867         m = Py_SIZE(self);
868         /* It should not be possible to allocate a list large enough to cause
869         an overflow on any relevant platform */
870         assert(m < PY_SSIZE_T_MAX - n);
871         if (list_resize(self, m + n) < 0) {
872             Py_DECREF(iterable);
873             return NULL;
874         }
875         /* note that we may still have self == iterable here for the
876          * situation a.extend(a), but the following code works
877          * in that case too.  Just make sure to resize self
878          * before calling PySequence_Fast_ITEMS.
879          */
880         /* populate the end of self with iterable's items */
881         src = PySequence_Fast_ITEMS(iterable);
882         dest = self->ob_item + m;
883         for (i = 0; i < n; i++) {
884             PyObject *o = src[i];
885             Py_INCREF(o);
886             dest[i] = o;
887         }
888         Py_DECREF(iterable);
889         Py_RETURN_NONE;
890     }
891 
892     it = PyObject_GetIter(iterable);
893     if (it == NULL)
894         return NULL;
895     iternext = *Py_TYPE(it)->tp_iternext;
896 
897     /* Guess a result list size. */
898     n = PyObject_LengthHint(iterable, 8);
899     if (n < 0) {
900         Py_DECREF(it);
901         return NULL;
902     }
903     m = Py_SIZE(self);
904     if (m > PY_SSIZE_T_MAX - n) {
905         /* m + n overflowed; on the chance that n lied, and there really
906          * is enough room, ignore it.  If n was telling the truth, we'll
907          * eventually run out of memory during the loop.
908          */
909     }
910     else {
911         mn = m + n;
912         /* Make room. */
913         if (list_resize(self, mn) < 0)
914             goto error;
915         /* Make the list sane again. */
916         Py_SET_SIZE(self, m);
917     }
918 
919     /* Run iterator to exhaustion. */
920     for (;;) {
921         PyObject *item = iternext(it);
922         if (item == NULL) {
923             if (PyErr_Occurred()) {
924                 if (PyErr_ExceptionMatches(PyExc_StopIteration))
925                     PyErr_Clear();
926                 else
927                     goto error;
928             }
929             break;
930         }
931         if (Py_SIZE(self) < self->allocated) {
932             /* steals ref */
933             PyList_SET_ITEM(self, Py_SIZE(self), item);
934             Py_SET_SIZE(self, Py_SIZE(self) + 1);
935         }
936         else {
937             int status = app1(self, item);
938             Py_DECREF(item);  /* append creates a new ref */
939             if (status < 0)
940                 goto error;
941         }
942     }
943 
944     /* Cut back result list if initial guess was too large. */
945     if (Py_SIZE(self) < self->allocated) {
946         if (list_resize(self, Py_SIZE(self)) < 0)
947             goto error;
948     }
949 
950     Py_DECREF(it);
951     Py_RETURN_NONE;
952 
953   error:
954     Py_DECREF(it);
955     return NULL;
956 }
957 
958 PyObject *
_PyList_Extend(PyListObject * self,PyObject * iterable)959 _PyList_Extend(PyListObject *self, PyObject *iterable)
960 {
961     return list_extend(self, iterable);
962 }
963 
964 static PyObject *
list_inplace_concat(PyListObject * self,PyObject * other)965 list_inplace_concat(PyListObject *self, PyObject *other)
966 {
967     PyObject *result;
968 
969     result = list_extend(self, other);
970     if (result == NULL)
971         return result;
972     Py_DECREF(result);
973     Py_INCREF(self);
974     return (PyObject *)self;
975 }
976 
977 /*[clinic input]
978 list.pop
979 
980     index: Py_ssize_t = -1
981     /
982 
983 Remove and return item at index (default last).
984 
985 Raises IndexError if list is empty or index is out of range.
986 [clinic start generated code]*/
987 
988 static PyObject *
list_pop_impl(PyListObject * self,Py_ssize_t index)989 list_pop_impl(PyListObject *self, Py_ssize_t index)
990 /*[clinic end generated code: output=6bd69dcb3f17eca8 input=b83675976f329e6f]*/
991 {
992     PyObject *v;
993     int status;
994 
995     if (Py_SIZE(self) == 0) {
996         /* Special-case most common failure cause */
997         PyErr_SetString(PyExc_IndexError, "pop from empty list");
998         return NULL;
999     }
1000     if (index < 0)
1001         index += Py_SIZE(self);
1002     if (!valid_index(index, Py_SIZE(self))) {
1003         PyErr_SetString(PyExc_IndexError, "pop index out of range");
1004         return NULL;
1005     }
1006     v = self->ob_item[index];
1007     if (index == Py_SIZE(self) - 1) {
1008         status = list_resize(self, Py_SIZE(self) - 1);
1009         if (status >= 0)
1010             return v; /* and v now owns the reference the list had */
1011         else
1012             return NULL;
1013     }
1014     Py_INCREF(v);
1015     status = list_ass_slice(self, index, index+1, (PyObject *)NULL);
1016     if (status < 0) {
1017         Py_DECREF(v);
1018         return NULL;
1019     }
1020     return v;
1021 }
1022 
1023 /* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
1024 static void
reverse_slice(PyObject ** lo,PyObject ** hi)1025 reverse_slice(PyObject **lo, PyObject **hi)
1026 {
1027     assert(lo && hi);
1028 
1029     --hi;
1030     while (lo < hi) {
1031         PyObject *t = *lo;
1032         *lo = *hi;
1033         *hi = t;
1034         ++lo;
1035         --hi;
1036     }
1037 }
1038 
1039 /* Lots of code for an adaptive, stable, natural mergesort.  There are many
1040  * pieces to this algorithm; read listsort.txt for overviews and details.
1041  */
1042 
1043 /* A sortslice contains a pointer to an array of keys and a pointer to
1044  * an array of corresponding values.  In other words, keys[i]
1045  * corresponds with values[i].  If values == NULL, then the keys are
1046  * also the values.
1047  *
1048  * Several convenience routines are provided here, so that keys and
1049  * values are always moved in sync.
1050  */
1051 
1052 typedef struct {
1053     PyObject **keys;
1054     PyObject **values;
1055 } sortslice;
1056 
1057 Py_LOCAL_INLINE(void)
sortslice_copy(sortslice * s1,Py_ssize_t i,sortslice * s2,Py_ssize_t j)1058 sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
1059 {
1060     s1->keys[i] = s2->keys[j];
1061     if (s1->values != NULL)
1062         s1->values[i] = s2->values[j];
1063 }
1064 
1065 Py_LOCAL_INLINE(void)
sortslice_copy_incr(sortslice * dst,sortslice * src)1066 sortslice_copy_incr(sortslice *dst, sortslice *src)
1067 {
1068     *dst->keys++ = *src->keys++;
1069     if (dst->values != NULL)
1070         *dst->values++ = *src->values++;
1071 }
1072 
1073 Py_LOCAL_INLINE(void)
sortslice_copy_decr(sortslice * dst,sortslice * src)1074 sortslice_copy_decr(sortslice *dst, sortslice *src)
1075 {
1076     *dst->keys-- = *src->keys--;
1077     if (dst->values != NULL)
1078         *dst->values-- = *src->values--;
1079 }
1080 
1081 
1082 Py_LOCAL_INLINE(void)
sortslice_memcpy(sortslice * s1,Py_ssize_t i,sortslice * s2,Py_ssize_t j,Py_ssize_t n)1083 sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
1084                  Py_ssize_t n)
1085 {
1086     memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1087     if (s1->values != NULL)
1088         memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1089 }
1090 
1091 Py_LOCAL_INLINE(void)
sortslice_memmove(sortslice * s1,Py_ssize_t i,sortslice * s2,Py_ssize_t j,Py_ssize_t n)1092 sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
1093                   Py_ssize_t n)
1094 {
1095     memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1096     if (s1->values != NULL)
1097         memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1098 }
1099 
1100 Py_LOCAL_INLINE(void)
sortslice_advance(sortslice * slice,Py_ssize_t n)1101 sortslice_advance(sortslice *slice, Py_ssize_t n)
1102 {
1103     slice->keys += n;
1104     if (slice->values != NULL)
1105         slice->values += n;
1106 }
1107 
1108 /* Comparison function: ms->key_compare, which is set at run-time in
1109  * listsort_impl to optimize for various special cases.
1110  * Returns -1 on error, 1 if x < y, 0 if x >= y.
1111  */
1112 
1113 #define ISLT(X, Y) (*(ms->key_compare))(X, Y, ms)
1114 
1115 /* Compare X to Y via "<".  Goto "fail" if the comparison raises an
1116    error.  Else "k" is set to true iff X<Y, and an "if (k)" block is
1117    started.  It makes more sense in context <wink>.  X and Y are PyObject*s.
1118 */
1119 #define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail;  \
1120            if (k)
1121 
1122 /* The maximum number of entries in a MergeState's pending-runs stack.
1123  * This is enough to sort arrays of size up to about
1124  *     32 * phi ** MAX_MERGE_PENDING
1125  * where phi ~= 1.618.  85 is ridiculouslylarge enough, good for an array
1126  * with 2**64 elements.
1127  */
1128 #define MAX_MERGE_PENDING 85
1129 
1130 /* When we get into galloping mode, we stay there until both runs win less
1131  * often than MIN_GALLOP consecutive times.  See listsort.txt for more info.
1132  */
1133 #define MIN_GALLOP 7
1134 
1135 /* Avoid malloc for small temp arrays. */
1136 #define MERGESTATE_TEMP_SIZE 256
1137 
1138 /* One MergeState exists on the stack per invocation of mergesort.  It's just
1139  * a convenient way to pass state around among the helper functions.
1140  */
1141 struct s_slice {
1142     sortslice base;
1143     Py_ssize_t len;
1144 };
1145 
1146 typedef struct s_MergeState MergeState;
1147 struct s_MergeState {
1148     /* This controls when we get *into* galloping mode.  It's initialized
1149      * to MIN_GALLOP.  merge_lo and merge_hi tend to nudge it higher for
1150      * random data, and lower for highly structured data.
1151      */
1152     Py_ssize_t min_gallop;
1153 
1154     /* 'a' is temp storage to help with merges.  It contains room for
1155      * alloced entries.
1156      */
1157     sortslice a;        /* may point to temparray below */
1158     Py_ssize_t alloced;
1159 
1160     /* A stack of n pending runs yet to be merged.  Run #i starts at
1161      * address base[i] and extends for len[i] elements.  It's always
1162      * true (so long as the indices are in bounds) that
1163      *
1164      *     pending[i].base + pending[i].len == pending[i+1].base
1165      *
1166      * so we could cut the storage for this, but it's a minor amount,
1167      * and keeping all the info explicit simplifies the code.
1168      */
1169     int n;
1170     struct s_slice pending[MAX_MERGE_PENDING];
1171 
1172     /* 'a' points to this when possible, rather than muck with malloc. */
1173     PyObject *temparray[MERGESTATE_TEMP_SIZE];
1174 
1175     /* This is the function we will use to compare two keys,
1176      * even when none of our special cases apply and we have to use
1177      * safe_object_compare. */
1178     int (*key_compare)(PyObject *, PyObject *, MergeState *);
1179 
1180     /* This function is used by unsafe_object_compare to optimize comparisons
1181      * when we know our list is type-homogeneous but we can't assume anything else.
1182      * In the pre-sort check it is set equal to Py_TYPE(key)->tp_richcompare */
1183     PyObject *(*key_richcompare)(PyObject *, PyObject *, int);
1184 
1185     /* This function is used by unsafe_tuple_compare to compare the first elements
1186      * of tuples. It may be set to safe_object_compare, but the idea is that hopefully
1187      * we can assume more, and use one of the special-case compares. */
1188     int (*tuple_elem_compare)(PyObject *, PyObject *, MergeState *);
1189 };
1190 
1191 /* binarysort is the best method for sorting small arrays: it does
1192    few compares, but can do data movement quadratic in the number of
1193    elements.
1194    [lo, hi) is a contiguous slice of a list, and is sorted via
1195    binary insertion.  This sort is stable.
1196    On entry, must have lo <= start <= hi, and that [lo, start) is already
1197    sorted (pass start == lo if you don't know!).
1198    If islt() complains return -1, else 0.
1199    Even in case of error, the output slice will be some permutation of
1200    the input (nothing is lost or duplicated).
1201 */
1202 static int
binarysort(MergeState * ms,sortslice lo,PyObject ** hi,PyObject ** start)1203 binarysort(MergeState *ms, sortslice lo, PyObject **hi, PyObject **start)
1204 {
1205     Py_ssize_t k;
1206     PyObject **l, **p, **r;
1207     PyObject *pivot;
1208 
1209     assert(lo.keys <= start && start <= hi);
1210     /* assert [lo, start) is sorted */
1211     if (lo.keys == start)
1212         ++start;
1213     for (; start < hi; ++start) {
1214         /* set l to where *start belongs */
1215         l = lo.keys;
1216         r = start;
1217         pivot = *r;
1218         /* Invariants:
1219          * pivot >= all in [lo, l).
1220          * pivot  < all in [r, start).
1221          * The second is vacuously true at the start.
1222          */
1223         assert(l < r);
1224         do {
1225             p = l + ((r - l) >> 1);
1226             IFLT(pivot, *p)
1227                 r = p;
1228             else
1229                 l = p+1;
1230         } while (l < r);
1231         assert(l == r);
1232         /* The invariants still hold, so pivot >= all in [lo, l) and
1233            pivot < all in [l, start), so pivot belongs at l.  Note
1234            that if there are elements equal to pivot, l points to the
1235            first slot after them -- that's why this sort is stable.
1236            Slide over to make room.
1237            Caution: using memmove is much slower under MSVC 5;
1238            we're not usually moving many slots. */
1239         for (p = start; p > l; --p)
1240             *p = *(p-1);
1241         *l = pivot;
1242         if (lo.values != NULL) {
1243             Py_ssize_t offset = lo.values - lo.keys;
1244             p = start + offset;
1245             pivot = *p;
1246             l += offset;
1247             for (p = start + offset; p > l; --p)
1248                 *p = *(p-1);
1249             *l = pivot;
1250         }
1251     }
1252     return 0;
1253 
1254  fail:
1255     return -1;
1256 }
1257 
1258 /*
1259 Return the length of the run beginning at lo, in the slice [lo, hi).  lo < hi
1260 is required on entry.  "A run" is the longest ascending sequence, with
1261 
1262     lo[0] <= lo[1] <= lo[2] <= ...
1263 
1264 or the longest descending sequence, with
1265 
1266     lo[0] > lo[1] > lo[2] > ...
1267 
1268 Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1269 For its intended use in a stable mergesort, the strictness of the defn of
1270 "descending" is needed so that the caller can safely reverse a descending
1271 sequence without violating stability (strict > ensures there are no equal
1272 elements to get out of order).
1273 
1274 Returns -1 in case of error.
1275 */
1276 static Py_ssize_t
count_run(MergeState * ms,PyObject ** lo,PyObject ** hi,int * descending)1277 count_run(MergeState *ms, PyObject **lo, PyObject **hi, int *descending)
1278 {
1279     Py_ssize_t k;
1280     Py_ssize_t n;
1281 
1282     assert(lo < hi);
1283     *descending = 0;
1284     ++lo;
1285     if (lo == hi)
1286         return 1;
1287 
1288     n = 2;
1289     IFLT(*lo, *(lo-1)) {
1290         *descending = 1;
1291         for (lo = lo+1; lo < hi; ++lo, ++n) {
1292             IFLT(*lo, *(lo-1))
1293                 ;
1294             else
1295                 break;
1296         }
1297     }
1298     else {
1299         for (lo = lo+1; lo < hi; ++lo, ++n) {
1300             IFLT(*lo, *(lo-1))
1301                 break;
1302         }
1303     }
1304 
1305     return n;
1306 fail:
1307     return -1;
1308 }
1309 
1310 /*
1311 Locate the proper position of key in a sorted vector; if the vector contains
1312 an element equal to key, return the position immediately to the left of
1313 the leftmost equal element.  [gallop_right() does the same except returns
1314 the position to the right of the rightmost equal element (if any).]
1315 
1316 "a" is a sorted vector with n elements, starting at a[0].  n must be > 0.
1317 
1318 "hint" is an index at which to begin the search, 0 <= hint < n.  The closer
1319 hint is to the final result, the faster this runs.
1320 
1321 The return value is the int k in 0..n such that
1322 
1323     a[k-1] < key <= a[k]
1324 
1325 pretending that *(a-1) is minus infinity and a[n] is plus infinity.  IOW,
1326 key belongs at index k; or, IOW, the first k elements of a should precede
1327 key, and the last n-k should follow key.
1328 
1329 Returns -1 on error.  See listsort.txt for info on the method.
1330 */
1331 static Py_ssize_t
gallop_left(MergeState * ms,PyObject * key,PyObject ** a,Py_ssize_t n,Py_ssize_t hint)1332 gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
1333 {
1334     Py_ssize_t ofs;
1335     Py_ssize_t lastofs;
1336     Py_ssize_t k;
1337 
1338     assert(key && a && n > 0 && hint >= 0 && hint < n);
1339 
1340     a += hint;
1341     lastofs = 0;
1342     ofs = 1;
1343     IFLT(*a, key) {
1344         /* a[hint] < key -- gallop right, until
1345          * a[hint + lastofs] < key <= a[hint + ofs]
1346          */
1347         const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
1348         while (ofs < maxofs) {
1349             IFLT(a[ofs], key) {
1350                 lastofs = ofs;
1351                 assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
1352                 ofs = (ofs << 1) + 1;
1353             }
1354             else                /* key <= a[hint + ofs] */
1355                 break;
1356         }
1357         if (ofs > maxofs)
1358             ofs = maxofs;
1359         /* Translate back to offsets relative to &a[0]. */
1360         lastofs += hint;
1361         ofs += hint;
1362     }
1363     else {
1364         /* key <= a[hint] -- gallop left, until
1365          * a[hint - ofs] < key <= a[hint - lastofs]
1366          */
1367         const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
1368         while (ofs < maxofs) {
1369             IFLT(*(a-ofs), key)
1370                 break;
1371             /* key <= a[hint - ofs] */
1372             lastofs = ofs;
1373             assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
1374             ofs = (ofs << 1) + 1;
1375         }
1376         if (ofs > maxofs)
1377             ofs = maxofs;
1378         /* Translate back to positive offsets relative to &a[0]. */
1379         k = lastofs;
1380         lastofs = hint - ofs;
1381         ofs = hint - k;
1382     }
1383     a -= hint;
1384 
1385     assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1386     /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1387      * right of lastofs but no farther right than ofs.  Do a binary
1388      * search, with invariant a[lastofs-1] < key <= a[ofs].
1389      */
1390     ++lastofs;
1391     while (lastofs < ofs) {
1392         Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
1393 
1394         IFLT(a[m], key)
1395             lastofs = m+1;              /* a[m] < key */
1396         else
1397             ofs = m;                    /* key <= a[m] */
1398     }
1399     assert(lastofs == ofs);             /* so a[ofs-1] < key <= a[ofs] */
1400     return ofs;
1401 
1402 fail:
1403     return -1;
1404 }
1405 
1406 /*
1407 Exactly like gallop_left(), except that if key already exists in a[0:n],
1408 finds the position immediately to the right of the rightmost equal value.
1409 
1410 The return value is the int k in 0..n such that
1411 
1412     a[k-1] <= key < a[k]
1413 
1414 or -1 if error.
1415 
1416 The code duplication is massive, but this is enough different given that
1417 we're sticking to "<" comparisons that it's much harder to follow if
1418 written as one routine with yet another "left or right?" flag.
1419 */
1420 static Py_ssize_t
gallop_right(MergeState * ms,PyObject * key,PyObject ** a,Py_ssize_t n,Py_ssize_t hint)1421 gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
1422 {
1423     Py_ssize_t ofs;
1424     Py_ssize_t lastofs;
1425     Py_ssize_t k;
1426 
1427     assert(key && a && n > 0 && hint >= 0 && hint < n);
1428 
1429     a += hint;
1430     lastofs = 0;
1431     ofs = 1;
1432     IFLT(key, *a) {
1433         /* key < a[hint] -- gallop left, until
1434          * a[hint - ofs] <= key < a[hint - lastofs]
1435          */
1436         const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
1437         while (ofs < maxofs) {
1438             IFLT(key, *(a-ofs)) {
1439                 lastofs = ofs;
1440                 assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
1441                 ofs = (ofs << 1) + 1;
1442             }
1443             else                /* a[hint - ofs] <= key */
1444                 break;
1445         }
1446         if (ofs > maxofs)
1447             ofs = maxofs;
1448         /* Translate back to positive offsets relative to &a[0]. */
1449         k = lastofs;
1450         lastofs = hint - ofs;
1451         ofs = hint - k;
1452     }
1453     else {
1454         /* a[hint] <= key -- gallop right, until
1455          * a[hint + lastofs] <= key < a[hint + ofs]
1456         */
1457         const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
1458         while (ofs < maxofs) {
1459             IFLT(key, a[ofs])
1460                 break;
1461             /* a[hint + ofs] <= key */
1462             lastofs = ofs;
1463             assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
1464             ofs = (ofs << 1) + 1;
1465         }
1466         if (ofs > maxofs)
1467             ofs = maxofs;
1468         /* Translate back to offsets relative to &a[0]. */
1469         lastofs += hint;
1470         ofs += hint;
1471     }
1472     a -= hint;
1473 
1474     assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
1475     /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1476      * right of lastofs but no farther right than ofs.  Do a binary
1477      * search, with invariant a[lastofs-1] <= key < a[ofs].
1478      */
1479     ++lastofs;
1480     while (lastofs < ofs) {
1481         Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
1482 
1483         IFLT(key, a[m])
1484             ofs = m;                    /* key < a[m] */
1485         else
1486             lastofs = m+1;              /* a[m] <= key */
1487     }
1488     assert(lastofs == ofs);             /* so a[ofs-1] <= key < a[ofs] */
1489     return ofs;
1490 
1491 fail:
1492     return -1;
1493 }
1494 
1495 /* Conceptually a MergeState's constructor. */
1496 static void
merge_init(MergeState * ms,Py_ssize_t list_size,int has_keyfunc)1497 merge_init(MergeState *ms, Py_ssize_t list_size, int has_keyfunc)
1498 {
1499     assert(ms != NULL);
1500     if (has_keyfunc) {
1501         /* The temporary space for merging will need at most half the list
1502          * size rounded up.  Use the minimum possible space so we can use the
1503          * rest of temparray for other things.  In particular, if there is
1504          * enough extra space, listsort() will use it to store the keys.
1505          */
1506         ms->alloced = (list_size + 1) / 2;
1507 
1508         /* ms->alloced describes how many keys will be stored at
1509            ms->temparray, but we also need to store the values.  Hence,
1510            ms->alloced is capped at half of MERGESTATE_TEMP_SIZE. */
1511         if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
1512             ms->alloced = MERGESTATE_TEMP_SIZE / 2;
1513         ms->a.values = &ms->temparray[ms->alloced];
1514     }
1515     else {
1516         ms->alloced = MERGESTATE_TEMP_SIZE;
1517         ms->a.values = NULL;
1518     }
1519     ms->a.keys = ms->temparray;
1520     ms->n = 0;
1521     ms->min_gallop = MIN_GALLOP;
1522 }
1523 
1524 /* Free all the temp memory owned by the MergeState.  This must be called
1525  * when you're done with a MergeState, and may be called before then if
1526  * you want to free the temp memory early.
1527  */
1528 static void
merge_freemem(MergeState * ms)1529 merge_freemem(MergeState *ms)
1530 {
1531     assert(ms != NULL);
1532     if (ms->a.keys != ms->temparray)
1533         PyMem_Free(ms->a.keys);
1534 }
1535 
1536 /* Ensure enough temp memory for 'need' array slots is available.
1537  * Returns 0 on success and -1 if the memory can't be gotten.
1538  */
1539 static int
merge_getmem(MergeState * ms,Py_ssize_t need)1540 merge_getmem(MergeState *ms, Py_ssize_t need)
1541 {
1542     int multiplier;
1543 
1544     assert(ms != NULL);
1545     if (need <= ms->alloced)
1546         return 0;
1547 
1548     multiplier = ms->a.values != NULL ? 2 : 1;
1549 
1550     /* Don't realloc!  That can cost cycles to copy the old data, but
1551      * we don't care what's in the block.
1552      */
1553     merge_freemem(ms);
1554     if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject *) / multiplier) {
1555         PyErr_NoMemory();
1556         return -1;
1557     }
1558     ms->a.keys = (PyObject **)PyMem_Malloc(multiplier * need
1559                                           * sizeof(PyObject *));
1560     if (ms->a.keys != NULL) {
1561         ms->alloced = need;
1562         if (ms->a.values != NULL)
1563             ms->a.values = &ms->a.keys[need];
1564         return 0;
1565     }
1566     PyErr_NoMemory();
1567     return -1;
1568 }
1569 #define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 :   \
1570                                 merge_getmem(MS, NEED))
1571 
1572 /* Merge the na elements starting at ssa with the nb elements starting at
1573  * ssb.keys = ssa.keys + na in a stable way, in-place.  na and nb must be > 0.
1574  * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1575  * should have na <= nb.  See listsort.txt for more info.  Return 0 if
1576  * successful, -1 if error.
1577  */
1578 static Py_ssize_t
merge_lo(MergeState * ms,sortslice ssa,Py_ssize_t na,sortslice ssb,Py_ssize_t nb)1579 merge_lo(MergeState *ms, sortslice ssa, Py_ssize_t na,
1580          sortslice ssb, Py_ssize_t nb)
1581 {
1582     Py_ssize_t k;
1583     sortslice dest;
1584     int result = -1;            /* guilty until proved innocent */
1585     Py_ssize_t min_gallop;
1586 
1587     assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1588     assert(ssa.keys + na == ssb.keys);
1589     if (MERGE_GETMEM(ms, na) < 0)
1590         return -1;
1591     sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
1592     dest = ssa;
1593     ssa = ms->a;
1594 
1595     sortslice_copy_incr(&dest, &ssb);
1596     --nb;
1597     if (nb == 0)
1598         goto Succeed;
1599     if (na == 1)
1600         goto CopyB;
1601 
1602     min_gallop = ms->min_gallop;
1603     for (;;) {
1604         Py_ssize_t acount = 0;          /* # of times A won in a row */
1605         Py_ssize_t bcount = 0;          /* # of times B won in a row */
1606 
1607         /* Do the straightforward thing until (if ever) one run
1608          * appears to win consistently.
1609          */
1610         for (;;) {
1611             assert(na > 1 && nb > 0);
1612             k = ISLT(ssb.keys[0], ssa.keys[0]);
1613             if (k) {
1614                 if (k < 0)
1615                     goto Fail;
1616                 sortslice_copy_incr(&dest, &ssb);
1617                 ++bcount;
1618                 acount = 0;
1619                 --nb;
1620                 if (nb == 0)
1621                     goto Succeed;
1622                 if (bcount >= min_gallop)
1623                     break;
1624             }
1625             else {
1626                 sortslice_copy_incr(&dest, &ssa);
1627                 ++acount;
1628                 bcount = 0;
1629                 --na;
1630                 if (na == 1)
1631                     goto CopyB;
1632                 if (acount >= min_gallop)
1633                     break;
1634             }
1635         }
1636 
1637         /* One run is winning so consistently that galloping may
1638          * be a huge win.  So try that, and continue galloping until
1639          * (if ever) neither run appears to be winning consistently
1640          * anymore.
1641          */
1642         ++min_gallop;
1643         do {
1644             assert(na > 1 && nb > 0);
1645             min_gallop -= min_gallop > 1;
1646             ms->min_gallop = min_gallop;
1647             k = gallop_right(ms, ssb.keys[0], ssa.keys, na, 0);
1648             acount = k;
1649             if (k) {
1650                 if (k < 0)
1651                     goto Fail;
1652                 sortslice_memcpy(&dest, 0, &ssa, 0, k);
1653                 sortslice_advance(&dest, k);
1654                 sortslice_advance(&ssa, k);
1655                 na -= k;
1656                 if (na == 1)
1657                     goto CopyB;
1658                 /* na==0 is impossible now if the comparison
1659                  * function is consistent, but we can't assume
1660                  * that it is.
1661                  */
1662                 if (na == 0)
1663                     goto Succeed;
1664             }
1665             sortslice_copy_incr(&dest, &ssb);
1666             --nb;
1667             if (nb == 0)
1668                 goto Succeed;
1669 
1670             k = gallop_left(ms, ssa.keys[0], ssb.keys, nb, 0);
1671             bcount = k;
1672             if (k) {
1673                 if (k < 0)
1674                     goto Fail;
1675                 sortslice_memmove(&dest, 0, &ssb, 0, k);
1676                 sortslice_advance(&dest, k);
1677                 sortslice_advance(&ssb, k);
1678                 nb -= k;
1679                 if (nb == 0)
1680                     goto Succeed;
1681             }
1682             sortslice_copy_incr(&dest, &ssa);
1683             --na;
1684             if (na == 1)
1685                 goto CopyB;
1686         } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1687         ++min_gallop;           /* penalize it for leaving galloping mode */
1688         ms->min_gallop = min_gallop;
1689     }
1690 Succeed:
1691     result = 0;
1692 Fail:
1693     if (na)
1694         sortslice_memcpy(&dest, 0, &ssa, 0, na);
1695     return result;
1696 CopyB:
1697     assert(na == 1 && nb > 0);
1698     /* The last element of ssa belongs at the end of the merge. */
1699     sortslice_memmove(&dest, 0, &ssb, 0, nb);
1700     sortslice_copy(&dest, nb, &ssa, 0);
1701     return 0;
1702 }
1703 
1704 /* Merge the na elements starting at pa with the nb elements starting at
1705  * ssb.keys = ssa.keys + na in a stable way, in-place.  na and nb must be > 0.
1706  * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
1707  * should have na >= nb.  See listsort.txt for more info.  Return 0 if
1708  * successful, -1 if error.
1709  */
1710 static Py_ssize_t
merge_hi(MergeState * ms,sortslice ssa,Py_ssize_t na,sortslice ssb,Py_ssize_t nb)1711 merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
1712          sortslice ssb, Py_ssize_t nb)
1713 {
1714     Py_ssize_t k;
1715     sortslice dest, basea, baseb;
1716     int result = -1;            /* guilty until proved innocent */
1717     Py_ssize_t min_gallop;
1718 
1719     assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
1720     assert(ssa.keys + na == ssb.keys);
1721     if (MERGE_GETMEM(ms, nb) < 0)
1722         return -1;
1723     dest = ssb;
1724     sortslice_advance(&dest, nb-1);
1725     sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
1726     basea = ssa;
1727     baseb = ms->a;
1728     ssb.keys = ms->a.keys + nb - 1;
1729     if (ssb.values != NULL)
1730         ssb.values = ms->a.values + nb - 1;
1731     sortslice_advance(&ssa, na - 1);
1732 
1733     sortslice_copy_decr(&dest, &ssa);
1734     --na;
1735     if (na == 0)
1736         goto Succeed;
1737     if (nb == 1)
1738         goto CopyA;
1739 
1740     min_gallop = ms->min_gallop;
1741     for (;;) {
1742         Py_ssize_t acount = 0;          /* # of times A won in a row */
1743         Py_ssize_t bcount = 0;          /* # of times B won in a row */
1744 
1745         /* Do the straightforward thing until (if ever) one run
1746          * appears to win consistently.
1747          */
1748         for (;;) {
1749             assert(na > 0 && nb > 1);
1750             k = ISLT(ssb.keys[0], ssa.keys[0]);
1751             if (k) {
1752                 if (k < 0)
1753                     goto Fail;
1754                 sortslice_copy_decr(&dest, &ssa);
1755                 ++acount;
1756                 bcount = 0;
1757                 --na;
1758                 if (na == 0)
1759                     goto Succeed;
1760                 if (acount >= min_gallop)
1761                     break;
1762             }
1763             else {
1764                 sortslice_copy_decr(&dest, &ssb);
1765                 ++bcount;
1766                 acount = 0;
1767                 --nb;
1768                 if (nb == 1)
1769                     goto CopyA;
1770                 if (bcount >= min_gallop)
1771                     break;
1772             }
1773         }
1774 
1775         /* One run is winning so consistently that galloping may
1776          * be a huge win.  So try that, and continue galloping until
1777          * (if ever) neither run appears to be winning consistently
1778          * anymore.
1779          */
1780         ++min_gallop;
1781         do {
1782             assert(na > 0 && nb > 1);
1783             min_gallop -= min_gallop > 1;
1784             ms->min_gallop = min_gallop;
1785             k = gallop_right(ms, ssb.keys[0], basea.keys, na, na-1);
1786             if (k < 0)
1787                 goto Fail;
1788             k = na - k;
1789             acount = k;
1790             if (k) {
1791                 sortslice_advance(&dest, -k);
1792                 sortslice_advance(&ssa, -k);
1793                 sortslice_memmove(&dest, 1, &ssa, 1, k);
1794                 na -= k;
1795                 if (na == 0)
1796                     goto Succeed;
1797             }
1798             sortslice_copy_decr(&dest, &ssb);
1799             --nb;
1800             if (nb == 1)
1801                 goto CopyA;
1802 
1803             k = gallop_left(ms, ssa.keys[0], baseb.keys, nb, nb-1);
1804             if (k < 0)
1805                 goto Fail;
1806             k = nb - k;
1807             bcount = k;
1808             if (k) {
1809                 sortslice_advance(&dest, -k);
1810                 sortslice_advance(&ssb, -k);
1811                 sortslice_memcpy(&dest, 1, &ssb, 1, k);
1812                 nb -= k;
1813                 if (nb == 1)
1814                     goto CopyA;
1815                 /* nb==0 is impossible now if the comparison
1816                  * function is consistent, but we can't assume
1817                  * that it is.
1818                  */
1819                 if (nb == 0)
1820                     goto Succeed;
1821             }
1822             sortslice_copy_decr(&dest, &ssa);
1823             --na;
1824             if (na == 0)
1825                 goto Succeed;
1826         } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
1827         ++min_gallop;           /* penalize it for leaving galloping mode */
1828         ms->min_gallop = min_gallop;
1829     }
1830 Succeed:
1831     result = 0;
1832 Fail:
1833     if (nb)
1834         sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
1835     return result;
1836 CopyA:
1837     assert(nb == 1 && na > 0);
1838     /* The first element of ssb belongs at the front of the merge. */
1839     sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
1840     sortslice_advance(&dest, -na);
1841     sortslice_advance(&ssa, -na);
1842     sortslice_copy(&dest, 0, &ssb, 0);
1843     return 0;
1844 }
1845 
1846 /* Merge the two runs at stack indices i and i+1.
1847  * Returns 0 on success, -1 on error.
1848  */
1849 static Py_ssize_t
merge_at(MergeState * ms,Py_ssize_t i)1850 merge_at(MergeState *ms, Py_ssize_t i)
1851 {
1852     sortslice ssa, ssb;
1853     Py_ssize_t na, nb;
1854     Py_ssize_t k;
1855 
1856     assert(ms != NULL);
1857     assert(ms->n >= 2);
1858     assert(i >= 0);
1859     assert(i == ms->n - 2 || i == ms->n - 3);
1860 
1861     ssa = ms->pending[i].base;
1862     na = ms->pending[i].len;
1863     ssb = ms->pending[i+1].base;
1864     nb = ms->pending[i+1].len;
1865     assert(na > 0 && nb > 0);
1866     assert(ssa.keys + na == ssb.keys);
1867 
1868     /* Record the length of the combined runs; if i is the 3rd-last
1869      * run now, also slide over the last run (which isn't involved
1870      * in this merge).  The current run i+1 goes away in any case.
1871      */
1872     ms->pending[i].len = na + nb;
1873     if (i == ms->n - 3)
1874         ms->pending[i+1] = ms->pending[i+2];
1875     --ms->n;
1876 
1877     /* Where does b start in a?  Elements in a before that can be
1878      * ignored (already in place).
1879      */
1880     k = gallop_right(ms, *ssb.keys, ssa.keys, na, 0);
1881     if (k < 0)
1882         return -1;
1883     sortslice_advance(&ssa, k);
1884     na -= k;
1885     if (na == 0)
1886         return 0;
1887 
1888     /* Where does a end in b?  Elements in b after that can be
1889      * ignored (already in place).
1890      */
1891     nb = gallop_left(ms, ssa.keys[na-1], ssb.keys, nb, nb-1);
1892     if (nb <= 0)
1893         return nb;
1894 
1895     /* Merge what remains of the runs, using a temp array with
1896      * min(na, nb) elements.
1897      */
1898     if (na <= nb)
1899         return merge_lo(ms, ssa, na, ssb, nb);
1900     else
1901         return merge_hi(ms, ssa, na, ssb, nb);
1902 }
1903 
1904 /* Examine the stack of runs waiting to be merged, merging adjacent runs
1905  * until the stack invariants are re-established:
1906  *
1907  * 1. len[-3] > len[-2] + len[-1]
1908  * 2. len[-2] > len[-1]
1909  *
1910  * See listsort.txt for more info.
1911  *
1912  * Returns 0 on success, -1 on error.
1913  */
1914 static int
merge_collapse(MergeState * ms)1915 merge_collapse(MergeState *ms)
1916 {
1917     struct s_slice *p = ms->pending;
1918 
1919     assert(ms);
1920     while (ms->n > 1) {
1921         Py_ssize_t n = ms->n - 2;
1922         if ((n > 0 && p[n-1].len <= p[n].len + p[n+1].len) ||
1923             (n > 1 && p[n-2].len <= p[n-1].len + p[n].len)) {
1924             if (p[n-1].len < p[n+1].len)
1925                 --n;
1926             if (merge_at(ms, n) < 0)
1927                 return -1;
1928         }
1929         else if (p[n].len <= p[n+1].len) {
1930             if (merge_at(ms, n) < 0)
1931                 return -1;
1932         }
1933         else
1934             break;
1935     }
1936     return 0;
1937 }
1938 
1939 /* Regardless of invariants, merge all runs on the stack until only one
1940  * remains.  This is used at the end of the mergesort.
1941  *
1942  * Returns 0 on success, -1 on error.
1943  */
1944 static int
merge_force_collapse(MergeState * ms)1945 merge_force_collapse(MergeState *ms)
1946 {
1947     struct s_slice *p = ms->pending;
1948 
1949     assert(ms);
1950     while (ms->n > 1) {
1951         Py_ssize_t n = ms->n - 2;
1952         if (n > 0 && p[n-1].len < p[n+1].len)
1953             --n;
1954         if (merge_at(ms, n) < 0)
1955             return -1;
1956     }
1957     return 0;
1958 }
1959 
1960 /* Compute a good value for the minimum run length; natural runs shorter
1961  * than this are boosted artificially via binary insertion.
1962  *
1963  * If n < 64, return n (it's too small to bother with fancy stuff).
1964  * Else if n is an exact power of 2, return 32.
1965  * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1966  * strictly less than, an exact power of 2.
1967  *
1968  * See listsort.txt for more info.
1969  */
1970 static Py_ssize_t
merge_compute_minrun(Py_ssize_t n)1971 merge_compute_minrun(Py_ssize_t n)
1972 {
1973     Py_ssize_t r = 0;           /* becomes 1 if any 1 bits are shifted off */
1974 
1975     assert(n >= 0);
1976     while (n >= 64) {
1977         r |= n & 1;
1978         n >>= 1;
1979     }
1980     return n + r;
1981 }
1982 
1983 static void
reverse_sortslice(sortslice * s,Py_ssize_t n)1984 reverse_sortslice(sortslice *s, Py_ssize_t n)
1985 {
1986     reverse_slice(s->keys, &s->keys[n]);
1987     if (s->values != NULL)
1988         reverse_slice(s->values, &s->values[n]);
1989 }
1990 
1991 /* Here we define custom comparison functions to optimize for the cases one commonly
1992  * encounters in practice: homogeneous lists, often of one of the basic types. */
1993 
1994 /* This struct holds the comparison function and helper functions
1995  * selected in the pre-sort check. */
1996 
1997 /* These are the special case compare functions.
1998  * ms->key_compare will always point to one of these: */
1999 
2000 /* Heterogeneous compare: default, always safe to fall back on. */
2001 static int
safe_object_compare(PyObject * v,PyObject * w,MergeState * ms)2002 safe_object_compare(PyObject *v, PyObject *w, MergeState *ms)
2003 {
2004     /* No assumptions necessary! */
2005     return PyObject_RichCompareBool(v, w, Py_LT);
2006 }
2007 
2008 /* Homogeneous compare: safe for any two compareable objects of the same type.
2009  * (ms->key_richcompare is set to ob_type->tp_richcompare in the
2010  *  pre-sort check.)
2011  */
2012 static int
unsafe_object_compare(PyObject * v,PyObject * w,MergeState * ms)2013 unsafe_object_compare(PyObject *v, PyObject *w, MergeState *ms)
2014 {
2015     PyObject *res_obj; int res;
2016 
2017     /* No assumptions, because we check first: */
2018     if (Py_TYPE(v)->tp_richcompare != ms->key_richcompare)
2019         return PyObject_RichCompareBool(v, w, Py_LT);
2020 
2021     assert(ms->key_richcompare != NULL);
2022     res_obj = (*(ms->key_richcompare))(v, w, Py_LT);
2023 
2024     if (res_obj == Py_NotImplemented) {
2025         Py_DECREF(res_obj);
2026         return PyObject_RichCompareBool(v, w, Py_LT);
2027     }
2028     if (res_obj == NULL)
2029         return -1;
2030 
2031     if (PyBool_Check(res_obj)) {
2032         res = (res_obj == Py_True);
2033     }
2034     else {
2035         res = PyObject_IsTrue(res_obj);
2036     }
2037     Py_DECREF(res_obj);
2038 
2039     /* Note that we can't assert
2040      *     res == PyObject_RichCompareBool(v, w, Py_LT);
2041      * because of evil compare functions like this:
2042      *     lambda a, b:  int(random.random() * 3) - 1)
2043      * (which is actually in test_sort.py) */
2044     return res;
2045 }
2046 
2047 /* Latin string compare: safe for any two latin (one byte per char) strings. */
2048 static int
unsafe_latin_compare(PyObject * v,PyObject * w,MergeState * ms)2049 unsafe_latin_compare(PyObject *v, PyObject *w, MergeState *ms)
2050 {
2051     Py_ssize_t len;
2052     int res;
2053 
2054     /* Modified from Objects/unicodeobject.c:unicode_compare, assuming: */
2055     assert(Py_IS_TYPE(v, &PyUnicode_Type));
2056     assert(Py_IS_TYPE(w, &PyUnicode_Type));
2057     assert(PyUnicode_KIND(v) == PyUnicode_KIND(w));
2058     assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND);
2059 
2060     len = Py_MIN(PyUnicode_GET_LENGTH(v), PyUnicode_GET_LENGTH(w));
2061     res = memcmp(PyUnicode_DATA(v), PyUnicode_DATA(w), len);
2062 
2063     res = (res != 0 ?
2064            res < 0 :
2065            PyUnicode_GET_LENGTH(v) < PyUnicode_GET_LENGTH(w));
2066 
2067     assert(res == PyObject_RichCompareBool(v, w, Py_LT));;
2068     return res;
2069 }
2070 
2071 /* Bounded int compare: compare any two longs that fit in a single machine word. */
2072 static int
unsafe_long_compare(PyObject * v,PyObject * w,MergeState * ms)2073 unsafe_long_compare(PyObject *v, PyObject *w, MergeState *ms)
2074 {
2075     PyLongObject *vl, *wl; sdigit v0, w0; int res;
2076 
2077     /* Modified from Objects/longobject.c:long_compare, assuming: */
2078     assert(Py_IS_TYPE(v, &PyLong_Type));
2079     assert(Py_IS_TYPE(w, &PyLong_Type));
2080     assert(Py_ABS(Py_SIZE(v)) <= 1);
2081     assert(Py_ABS(Py_SIZE(w)) <= 1);
2082 
2083     vl = (PyLongObject*)v;
2084     wl = (PyLongObject*)w;
2085 
2086     v0 = Py_SIZE(vl) == 0 ? 0 : (sdigit)vl->ob_digit[0];
2087     w0 = Py_SIZE(wl) == 0 ? 0 : (sdigit)wl->ob_digit[0];
2088 
2089     if (Py_SIZE(vl) < 0)
2090         v0 = -v0;
2091     if (Py_SIZE(wl) < 0)
2092         w0 = -w0;
2093 
2094     res = v0 < w0;
2095     assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2096     return res;
2097 }
2098 
2099 /* Float compare: compare any two floats. */
2100 static int
unsafe_float_compare(PyObject * v,PyObject * w,MergeState * ms)2101 unsafe_float_compare(PyObject *v, PyObject *w, MergeState *ms)
2102 {
2103     int res;
2104 
2105     /* Modified from Objects/floatobject.c:float_richcompare, assuming: */
2106     assert(Py_IS_TYPE(v, &PyFloat_Type));
2107     assert(Py_IS_TYPE(w, &PyFloat_Type));
2108 
2109     res = PyFloat_AS_DOUBLE(v) < PyFloat_AS_DOUBLE(w);
2110     assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2111     return res;
2112 }
2113 
2114 /* Tuple compare: compare *any* two tuples, using
2115  * ms->tuple_elem_compare to compare the first elements, which is set
2116  * using the same pre-sort check as we use for ms->key_compare,
2117  * but run on the list [x[0] for x in L]. This allows us to optimize compares
2118  * on two levels (as long as [x[0] for x in L] is type-homogeneous.) The idea is
2119  * that most tuple compares don't involve x[1:]. */
2120 static int
unsafe_tuple_compare(PyObject * v,PyObject * w,MergeState * ms)2121 unsafe_tuple_compare(PyObject *v, PyObject *w, MergeState *ms)
2122 {
2123     PyTupleObject *vt, *wt;
2124     Py_ssize_t i, vlen, wlen;
2125     int k;
2126 
2127     /* Modified from Objects/tupleobject.c:tuplerichcompare, assuming: */
2128     assert(Py_IS_TYPE(v, &PyTuple_Type));
2129     assert(Py_IS_TYPE(w, &PyTuple_Type));
2130     assert(Py_SIZE(v) > 0);
2131     assert(Py_SIZE(w) > 0);
2132 
2133     vt = (PyTupleObject *)v;
2134     wt = (PyTupleObject *)w;
2135 
2136     vlen = Py_SIZE(vt);
2137     wlen = Py_SIZE(wt);
2138 
2139     for (i = 0; i < vlen && i < wlen; i++) {
2140         k = PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_EQ);
2141         if (k < 0)
2142             return -1;
2143         if (!k)
2144             break;
2145     }
2146 
2147     if (i >= vlen || i >= wlen)
2148         return vlen < wlen;
2149 
2150     if (i == 0)
2151         return ms->tuple_elem_compare(vt->ob_item[i], wt->ob_item[i], ms);
2152     else
2153         return PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_LT);
2154 }
2155 
2156 /* An adaptive, stable, natural mergesort.  See listsort.txt.
2157  * Returns Py_None on success, NULL on error.  Even in case of error, the
2158  * list will be some permutation of its input state (nothing is lost or
2159  * duplicated).
2160  */
2161 /*[clinic input]
2162 list.sort
2163 
2164     *
2165     key as keyfunc: object = None
2166     reverse: bool(accept={int}) = False
2167 
2168 Sort the list in ascending order and return None.
2169 
2170 The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
2171 order of two equal elements is maintained).
2172 
2173 If a key function is given, apply it once to each list item and sort them,
2174 ascending or descending, according to their function values.
2175 
2176 The reverse flag can be set to sort in descending order.
2177 [clinic start generated code]*/
2178 
2179 static PyObject *
list_sort_impl(PyListObject * self,PyObject * keyfunc,int reverse)2180 list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
2181 /*[clinic end generated code: output=57b9f9c5e23fbe42 input=cb56cd179a713060]*/
2182 {
2183     MergeState ms;
2184     Py_ssize_t nremaining;
2185     Py_ssize_t minrun;
2186     sortslice lo;
2187     Py_ssize_t saved_ob_size, saved_allocated;
2188     PyObject **saved_ob_item;
2189     PyObject **final_ob_item;
2190     PyObject *result = NULL;            /* guilty until proved innocent */
2191     Py_ssize_t i;
2192     PyObject **keys;
2193 
2194     assert(self != NULL);
2195     assert(PyList_Check(self));
2196     if (keyfunc == Py_None)
2197         keyfunc = NULL;
2198 
2199     /* The list is temporarily made empty, so that mutations performed
2200      * by comparison functions can't affect the slice of memory we're
2201      * sorting (allowing mutations during sorting is a core-dump
2202      * factory, since ob_item may change).
2203      */
2204     saved_ob_size = Py_SIZE(self);
2205     saved_ob_item = self->ob_item;
2206     saved_allocated = self->allocated;
2207     Py_SET_SIZE(self, 0);
2208     self->ob_item = NULL;
2209     self->allocated = -1; /* any operation will reset it to >= 0 */
2210 
2211     if (keyfunc == NULL) {
2212         keys = NULL;
2213         lo.keys = saved_ob_item;
2214         lo.values = NULL;
2215     }
2216     else {
2217         if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
2218             /* Leverage stack space we allocated but won't otherwise use */
2219             keys = &ms.temparray[saved_ob_size+1];
2220         else {
2221             keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size);
2222             if (keys == NULL) {
2223                 PyErr_NoMemory();
2224                 goto keyfunc_fail;
2225             }
2226         }
2227 
2228         for (i = 0; i < saved_ob_size ; i++) {
2229             keys[i] = PyObject_CallOneArg(keyfunc, saved_ob_item[i]);
2230             if (keys[i] == NULL) {
2231                 for (i=i-1 ; i>=0 ; i--)
2232                     Py_DECREF(keys[i]);
2233                 if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
2234                     PyMem_FREE(keys);
2235                 goto keyfunc_fail;
2236             }
2237         }
2238 
2239         lo.keys = keys;
2240         lo.values = saved_ob_item;
2241     }
2242 
2243 
2244     /* The pre-sort check: here's where we decide which compare function to use.
2245      * How much optimization is safe? We test for homogeneity with respect to
2246      * several properties that are expensive to check at compare-time, and
2247      * set ms appropriately. */
2248     if (saved_ob_size > 1) {
2249         /* Assume the first element is representative of the whole list. */
2250         int keys_are_in_tuples = (Py_IS_TYPE(lo.keys[0], &PyTuple_Type) &&
2251                                   Py_SIZE(lo.keys[0]) > 0);
2252 
2253         PyTypeObject* key_type = (keys_are_in_tuples ?
2254                                   Py_TYPE(PyTuple_GET_ITEM(lo.keys[0], 0)) :
2255                                   Py_TYPE(lo.keys[0]));
2256 
2257         int keys_are_all_same_type = 1;
2258         int strings_are_latin = 1;
2259         int ints_are_bounded = 1;
2260 
2261         /* Prove that assumption by checking every key. */
2262         for (i=0; i < saved_ob_size; i++) {
2263 
2264             if (keys_are_in_tuples &&
2265                 !(Py_IS_TYPE(lo.keys[i], &PyTuple_Type) && Py_SIZE(lo.keys[i]) != 0)) {
2266                 keys_are_in_tuples = 0;
2267                 keys_are_all_same_type = 0;
2268                 break;
2269             }
2270 
2271             /* Note: for lists of tuples, key is the first element of the tuple
2272              * lo.keys[i], not lo.keys[i] itself! We verify type-homogeneity
2273              * for lists of tuples in the if-statement directly above. */
2274             PyObject *key = (keys_are_in_tuples ?
2275                              PyTuple_GET_ITEM(lo.keys[i], 0) :
2276                              lo.keys[i]);
2277 
2278             if (!Py_IS_TYPE(key, key_type)) {
2279                 keys_are_all_same_type = 0;
2280                 /* If keys are in tuple we must loop over the whole list to make
2281                    sure all items are tuples */
2282                 if (!keys_are_in_tuples) {
2283                     break;
2284                 }
2285             }
2286 
2287             if (keys_are_all_same_type) {
2288                 if (key_type == &PyLong_Type &&
2289                     ints_are_bounded &&
2290                     Py_ABS(Py_SIZE(key)) > 1) {
2291 
2292                     ints_are_bounded = 0;
2293                 }
2294                 else if (key_type == &PyUnicode_Type &&
2295                          strings_are_latin &&
2296                          PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) {
2297 
2298                         strings_are_latin = 0;
2299                     }
2300                 }
2301             }
2302 
2303         /* Choose the best compare, given what we now know about the keys. */
2304         if (keys_are_all_same_type) {
2305 
2306             if (key_type == &PyUnicode_Type && strings_are_latin) {
2307                 ms.key_compare = unsafe_latin_compare;
2308             }
2309             else if (key_type == &PyLong_Type && ints_are_bounded) {
2310                 ms.key_compare = unsafe_long_compare;
2311             }
2312             else if (key_type == &PyFloat_Type) {
2313                 ms.key_compare = unsafe_float_compare;
2314             }
2315             else if ((ms.key_richcompare = key_type->tp_richcompare) != NULL) {
2316                 ms.key_compare = unsafe_object_compare;
2317             }
2318             else {
2319                 ms.key_compare = safe_object_compare;
2320             }
2321         }
2322         else {
2323             ms.key_compare = safe_object_compare;
2324         }
2325 
2326         if (keys_are_in_tuples) {
2327             /* Make sure we're not dealing with tuples of tuples
2328              * (remember: here, key_type refers list [key[0] for key in keys]) */
2329             if (key_type == &PyTuple_Type) {
2330                 ms.tuple_elem_compare = safe_object_compare;
2331             }
2332             else {
2333                 ms.tuple_elem_compare = ms.key_compare;
2334             }
2335 
2336             ms.key_compare = unsafe_tuple_compare;
2337         }
2338     }
2339     /* End of pre-sort check: ms is now set properly! */
2340 
2341     merge_init(&ms, saved_ob_size, keys != NULL);
2342 
2343     nremaining = saved_ob_size;
2344     if (nremaining < 2)
2345         goto succeed;
2346 
2347     /* Reverse sort stability achieved by initially reversing the list,
2348     applying a stable forward sort, then reversing the final result. */
2349     if (reverse) {
2350         if (keys != NULL)
2351             reverse_slice(&keys[0], &keys[saved_ob_size]);
2352         reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
2353     }
2354 
2355     /* March over the array once, left to right, finding natural runs,
2356      * and extending short natural runs to minrun elements.
2357      */
2358     minrun = merge_compute_minrun(nremaining);
2359     do {
2360         int descending;
2361         Py_ssize_t n;
2362 
2363         /* Identify next run. */
2364         n = count_run(&ms, lo.keys, lo.keys + nremaining, &descending);
2365         if (n < 0)
2366             goto fail;
2367         if (descending)
2368             reverse_sortslice(&lo, n);
2369         /* If short, extend to min(minrun, nremaining). */
2370         if (n < minrun) {
2371             const Py_ssize_t force = nremaining <= minrun ?
2372                               nremaining : minrun;
2373             if (binarysort(&ms, lo, lo.keys + force, lo.keys + n) < 0)
2374                 goto fail;
2375             n = force;
2376         }
2377         /* Push run onto pending-runs stack, and maybe merge. */
2378         assert(ms.n < MAX_MERGE_PENDING);
2379         ms.pending[ms.n].base = lo;
2380         ms.pending[ms.n].len = n;
2381         ++ms.n;
2382         if (merge_collapse(&ms) < 0)
2383             goto fail;
2384         /* Advance to find next run. */
2385         sortslice_advance(&lo, n);
2386         nremaining -= n;
2387     } while (nremaining);
2388 
2389     if (merge_force_collapse(&ms) < 0)
2390         goto fail;
2391     assert(ms.n == 1);
2392     assert(keys == NULL
2393            ? ms.pending[0].base.keys == saved_ob_item
2394            : ms.pending[0].base.keys == &keys[0]);
2395     assert(ms.pending[0].len == saved_ob_size);
2396     lo = ms.pending[0].base;
2397 
2398 succeed:
2399     result = Py_None;
2400 fail:
2401     if (keys != NULL) {
2402         for (i = 0; i < saved_ob_size; i++)
2403             Py_DECREF(keys[i]);
2404         if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
2405             PyMem_FREE(keys);
2406     }
2407 
2408     if (self->allocated != -1 && result != NULL) {
2409         /* The user mucked with the list during the sort,
2410          * and we don't already have another error to report.
2411          */
2412         PyErr_SetString(PyExc_ValueError, "list modified during sort");
2413         result = NULL;
2414     }
2415 
2416     if (reverse && saved_ob_size > 1)
2417         reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
2418 
2419     merge_freemem(&ms);
2420 
2421 keyfunc_fail:
2422     final_ob_item = self->ob_item;
2423     i = Py_SIZE(self);
2424     Py_SET_SIZE(self, saved_ob_size);
2425     self->ob_item = saved_ob_item;
2426     self->allocated = saved_allocated;
2427     if (final_ob_item != NULL) {
2428         /* we cannot use _list_clear() for this because it does not
2429            guarantee that the list is really empty when it returns */
2430         while (--i >= 0) {
2431             Py_XDECREF(final_ob_item[i]);
2432         }
2433         PyMem_FREE(final_ob_item);
2434     }
2435     Py_XINCREF(result);
2436     return result;
2437 }
2438 #undef IFLT
2439 #undef ISLT
2440 
2441 int
PyList_Sort(PyObject * v)2442 PyList_Sort(PyObject *v)
2443 {
2444     if (v == NULL || !PyList_Check(v)) {
2445         PyErr_BadInternalCall();
2446         return -1;
2447     }
2448     v = list_sort_impl((PyListObject *)v, NULL, 0);
2449     if (v == NULL)
2450         return -1;
2451     Py_DECREF(v);
2452     return 0;
2453 }
2454 
2455 /*[clinic input]
2456 list.reverse
2457 
2458 Reverse *IN PLACE*.
2459 [clinic start generated code]*/
2460 
2461 static PyObject *
list_reverse_impl(PyListObject * self)2462 list_reverse_impl(PyListObject *self)
2463 /*[clinic end generated code: output=482544fc451abea9 input=eefd4c3ae1bc9887]*/
2464 {
2465     if (Py_SIZE(self) > 1)
2466         reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2467     Py_RETURN_NONE;
2468 }
2469 
2470 int
PyList_Reverse(PyObject * v)2471 PyList_Reverse(PyObject *v)
2472 {
2473     PyListObject *self = (PyListObject *)v;
2474 
2475     if (v == NULL || !PyList_Check(v)) {
2476         PyErr_BadInternalCall();
2477         return -1;
2478     }
2479     if (Py_SIZE(self) > 1)
2480         reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
2481     return 0;
2482 }
2483 
2484 PyObject *
PyList_AsTuple(PyObject * v)2485 PyList_AsTuple(PyObject *v)
2486 {
2487     if (v == NULL || !PyList_Check(v)) {
2488         PyErr_BadInternalCall();
2489         return NULL;
2490     }
2491     return _PyTuple_FromArray(((PyListObject *)v)->ob_item, Py_SIZE(v));
2492 }
2493 
2494 /*[clinic input]
2495 list.index
2496 
2497     value: object
2498     start: slice_index(accept={int}) = 0
2499     stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
2500     /
2501 
2502 Return first index of value.
2503 
2504 Raises ValueError if the value is not present.
2505 [clinic start generated code]*/
2506 
2507 static PyObject *
list_index_impl(PyListObject * self,PyObject * value,Py_ssize_t start,Py_ssize_t stop)2508 list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start,
2509                 Py_ssize_t stop)
2510 /*[clinic end generated code: output=ec51b88787e4e481 input=40ec5826303a0eb1]*/
2511 {
2512     Py_ssize_t i;
2513 
2514     if (start < 0) {
2515         start += Py_SIZE(self);
2516         if (start < 0)
2517             start = 0;
2518     }
2519     if (stop < 0) {
2520         stop += Py_SIZE(self);
2521         if (stop < 0)
2522             stop = 0;
2523     }
2524     for (i = start; i < stop && i < Py_SIZE(self); i++) {
2525         PyObject *obj = self->ob_item[i];
2526         Py_INCREF(obj);
2527         int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
2528         Py_DECREF(obj);
2529         if (cmp > 0)
2530             return PyLong_FromSsize_t(i);
2531         else if (cmp < 0)
2532             return NULL;
2533     }
2534     PyErr_Format(PyExc_ValueError, "%R is not in list", value);
2535     return NULL;
2536 }
2537 
2538 /*[clinic input]
2539 list.count
2540 
2541      value: object
2542      /
2543 
2544 Return number of occurrences of value.
2545 [clinic start generated code]*/
2546 
2547 static PyObject *
list_count(PyListObject * self,PyObject * value)2548 list_count(PyListObject *self, PyObject *value)
2549 /*[clinic end generated code: output=b1f5d284205ae714 input=3bdc3a5e6f749565]*/
2550 {
2551     Py_ssize_t count = 0;
2552     Py_ssize_t i;
2553 
2554     for (i = 0; i < Py_SIZE(self); i++) {
2555         PyObject *obj = self->ob_item[i];
2556         if (obj == value) {
2557            count++;
2558            continue;
2559         }
2560         Py_INCREF(obj);
2561         int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
2562         Py_DECREF(obj);
2563         if (cmp > 0)
2564             count++;
2565         else if (cmp < 0)
2566             return NULL;
2567     }
2568     return PyLong_FromSsize_t(count);
2569 }
2570 
2571 /*[clinic input]
2572 list.remove
2573 
2574      value: object
2575      /
2576 
2577 Remove first occurrence of value.
2578 
2579 Raises ValueError if the value is not present.
2580 [clinic start generated code]*/
2581 
2582 static PyObject *
list_remove(PyListObject * self,PyObject * value)2583 list_remove(PyListObject *self, PyObject *value)
2584 /*[clinic end generated code: output=f087e1951a5e30d1 input=2dc2ba5bb2fb1f82]*/
2585 {
2586     Py_ssize_t i;
2587 
2588     for (i = 0; i < Py_SIZE(self); i++) {
2589         PyObject *obj = self->ob_item[i];
2590         Py_INCREF(obj);
2591         int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
2592         Py_DECREF(obj);
2593         if (cmp > 0) {
2594             if (list_ass_slice(self, i, i+1,
2595                                (PyObject *)NULL) == 0)
2596                 Py_RETURN_NONE;
2597             return NULL;
2598         }
2599         else if (cmp < 0)
2600             return NULL;
2601     }
2602     PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
2603     return NULL;
2604 }
2605 
2606 static int
list_traverse(PyListObject * o,visitproc visit,void * arg)2607 list_traverse(PyListObject *o, visitproc visit, void *arg)
2608 {
2609     Py_ssize_t i;
2610 
2611     for (i = Py_SIZE(o); --i >= 0; )
2612         Py_VISIT(o->ob_item[i]);
2613     return 0;
2614 }
2615 
2616 static PyObject *
list_richcompare(PyObject * v,PyObject * w,int op)2617 list_richcompare(PyObject *v, PyObject *w, int op)
2618 {
2619     PyListObject *vl, *wl;
2620     Py_ssize_t i;
2621 
2622     if (!PyList_Check(v) || !PyList_Check(w))
2623         Py_RETURN_NOTIMPLEMENTED;
2624 
2625     vl = (PyListObject *)v;
2626     wl = (PyListObject *)w;
2627 
2628     if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
2629         /* Shortcut: if the lengths differ, the lists differ */
2630         if (op == Py_EQ)
2631             Py_RETURN_FALSE;
2632         else
2633             Py_RETURN_TRUE;
2634     }
2635 
2636     /* Search for the first index where items are different */
2637     for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
2638         PyObject *vitem = vl->ob_item[i];
2639         PyObject *witem = wl->ob_item[i];
2640         if (vitem == witem) {
2641             continue;
2642         }
2643 
2644         Py_INCREF(vitem);
2645         Py_INCREF(witem);
2646         int k = PyObject_RichCompareBool(vitem, witem, Py_EQ);
2647         Py_DECREF(vitem);
2648         Py_DECREF(witem);
2649         if (k < 0)
2650             return NULL;
2651         if (!k)
2652             break;
2653     }
2654 
2655     if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
2656         /* No more items to compare -- compare sizes */
2657         Py_RETURN_RICHCOMPARE(Py_SIZE(vl), Py_SIZE(wl), op);
2658     }
2659 
2660     /* We have an item that differs -- shortcuts for EQ/NE */
2661     if (op == Py_EQ) {
2662         Py_RETURN_FALSE;
2663     }
2664     if (op == Py_NE) {
2665         Py_RETURN_TRUE;
2666     }
2667 
2668     /* Compare the final item again using the proper operator */
2669     return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
2670 }
2671 
2672 /*[clinic input]
2673 list.__init__
2674 
2675     iterable: object(c_default="NULL") = ()
2676     /
2677 
2678 Built-in mutable sequence.
2679 
2680 If no argument is given, the constructor creates a new empty list.
2681 The argument must be an iterable if specified.
2682 [clinic start generated code]*/
2683 
2684 static int
list___init___impl(PyListObject * self,PyObject * iterable)2685 list___init___impl(PyListObject *self, PyObject *iterable)
2686 /*[clinic end generated code: output=0f3c21379d01de48 input=b3f3fe7206af8f6b]*/
2687 {
2688     /* Verify list invariants established by PyType_GenericAlloc() */
2689     assert(0 <= Py_SIZE(self));
2690     assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
2691     assert(self->ob_item != NULL ||
2692            self->allocated == 0 || self->allocated == -1);
2693 
2694     /* Empty previous contents */
2695     if (self->ob_item != NULL) {
2696         (void)_list_clear(self);
2697     }
2698     if (iterable != NULL) {
2699         if (_PyObject_HasLen(iterable)) {
2700             Py_ssize_t iter_len = PyObject_Size(iterable);
2701             if (iter_len == -1) {
2702                 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
2703                     return -1;
2704                 }
2705                 PyErr_Clear();
2706             }
2707             if (iter_len > 0 && self->ob_item == NULL
2708                 && list_preallocate_exact(self, iter_len)) {
2709                 return -1;
2710             }
2711         }
2712         PyObject *rv = list_extend(self, iterable);
2713         if (rv == NULL)
2714             return -1;
2715         Py_DECREF(rv);
2716     }
2717     return 0;
2718 }
2719 
2720 static PyObject *
list_vectorcall(PyObject * type,PyObject * const * args,size_t nargsf,PyObject * kwnames)2721 list_vectorcall(PyObject *type, PyObject * const*args,
2722                 size_t nargsf, PyObject *kwnames)
2723 {
2724     if (!_PyArg_NoKwnames("list", kwnames)) {
2725         return NULL;
2726     }
2727     Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
2728     if (!_PyArg_CheckPositional("list", nargs, 0, 1)) {
2729         return NULL;
2730     }
2731 
2732     assert(PyType_Check(type));
2733     PyObject *list = PyType_GenericAlloc((PyTypeObject *)type, 0);
2734     if (list == NULL) {
2735         return NULL;
2736     }
2737     if (nargs) {
2738         if (list___init___impl((PyListObject *)list, args[0])) {
2739             Py_DECREF(list);
2740             return NULL;
2741         }
2742     }
2743     return list;
2744 }
2745 
2746 
2747 /*[clinic input]
2748 list.__sizeof__
2749 
2750 Return the size of the list in memory, in bytes.
2751 [clinic start generated code]*/
2752 
2753 static PyObject *
list___sizeof___impl(PyListObject * self)2754 list___sizeof___impl(PyListObject *self)
2755 /*[clinic end generated code: output=3417541f95f9a53e input=b8030a5d5ce8a187]*/
2756 {
2757     Py_ssize_t res;
2758 
2759     res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * sizeof(void*);
2760     return PyLong_FromSsize_t(res);
2761 }
2762 
2763 static PyObject *list_iter(PyObject *seq);
2764 static PyObject *list_subscript(PyListObject*, PyObject*);
2765 
2766 static PyMethodDef list_methods[] = {
2767     {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, "x.__getitem__(y) <==> x[y]"},
2768     LIST___REVERSED___METHODDEF
2769     LIST___SIZEOF___METHODDEF
2770     LIST_CLEAR_METHODDEF
2771     LIST_COPY_METHODDEF
2772     LIST_APPEND_METHODDEF
2773     LIST_INSERT_METHODDEF
2774     LIST_EXTEND_METHODDEF
2775     LIST_POP_METHODDEF
2776     LIST_REMOVE_METHODDEF
2777     LIST_INDEX_METHODDEF
2778     LIST_COUNT_METHODDEF
2779     LIST_REVERSE_METHODDEF
2780     LIST_SORT_METHODDEF
2781     {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
2782     {NULL,              NULL}           /* sentinel */
2783 };
2784 
2785 static PySequenceMethods list_as_sequence = {
2786     (lenfunc)list_length,                       /* sq_length */
2787     (binaryfunc)list_concat,                    /* sq_concat */
2788     (ssizeargfunc)list_repeat,                  /* sq_repeat */
2789     (ssizeargfunc)list_item,                    /* sq_item */
2790     0,                                          /* sq_slice */
2791     (ssizeobjargproc)list_ass_item,             /* sq_ass_item */
2792     0,                                          /* sq_ass_slice */
2793     (objobjproc)list_contains,                  /* sq_contains */
2794     (binaryfunc)list_inplace_concat,            /* sq_inplace_concat */
2795     (ssizeargfunc)list_inplace_repeat,          /* sq_inplace_repeat */
2796 };
2797 
2798 static PyObject *
list_subscript(PyListObject * self,PyObject * item)2799 list_subscript(PyListObject* self, PyObject* item)
2800 {
2801     if (_PyIndex_Check(item)) {
2802         Py_ssize_t i;
2803         i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2804         if (i == -1 && PyErr_Occurred())
2805             return NULL;
2806         if (i < 0)
2807             i += PyList_GET_SIZE(self);
2808         return list_item(self, i);
2809     }
2810     else if (PySlice_Check(item)) {
2811         Py_ssize_t start, stop, step, slicelength, i;
2812         size_t cur;
2813         PyObject* result;
2814         PyObject* it;
2815         PyObject **src, **dest;
2816 
2817         if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2818             return NULL;
2819         }
2820         slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2821                                             step);
2822 
2823         if (slicelength <= 0) {
2824             return PyList_New(0);
2825         }
2826         else if (step == 1) {
2827             return list_slice(self, start, stop);
2828         }
2829         else {
2830             result = list_new_prealloc(slicelength);
2831             if (!result) return NULL;
2832 
2833             src = self->ob_item;
2834             dest = ((PyListObject *)result)->ob_item;
2835             for (cur = start, i = 0; i < slicelength;
2836                  cur += (size_t)step, i++) {
2837                 it = src[cur];
2838                 Py_INCREF(it);
2839                 dest[i] = it;
2840             }
2841             Py_SET_SIZE(result, slicelength);
2842             return result;
2843         }
2844     }
2845     else {
2846         PyErr_Format(PyExc_TypeError,
2847                      "list indices must be integers or slices, not %.200s",
2848                      Py_TYPE(item)->tp_name);
2849         return NULL;
2850     }
2851 }
2852 
2853 static int
list_ass_subscript(PyListObject * self,PyObject * item,PyObject * value)2854 list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2855 {
2856     if (_PyIndex_Check(item)) {
2857         Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2858         if (i == -1 && PyErr_Occurred())
2859             return -1;
2860         if (i < 0)
2861             i += PyList_GET_SIZE(self);
2862         return list_ass_item(self, i, value);
2863     }
2864     else if (PySlice_Check(item)) {
2865         Py_ssize_t start, stop, step, slicelength;
2866 
2867         if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2868             return -1;
2869         }
2870         slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2871                                             step);
2872 
2873         if (step == 1)
2874             return list_ass_slice(self, start, stop, value);
2875 
2876         /* Make sure s[5:2] = [..] inserts at the right place:
2877            before 5, not before 2. */
2878         if ((step < 0 && start < stop) ||
2879             (step > 0 && start > stop))
2880             stop = start;
2881 
2882         if (value == NULL) {
2883             /* delete slice */
2884             PyObject **garbage;
2885             size_t cur;
2886             Py_ssize_t i;
2887             int res;
2888 
2889             if (slicelength <= 0)
2890                 return 0;
2891 
2892             if (step < 0) {
2893                 stop = start + 1;
2894                 start = stop + step*(slicelength - 1) - 1;
2895                 step = -step;
2896             }
2897 
2898             garbage = (PyObject**)
2899                 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2900             if (!garbage) {
2901                 PyErr_NoMemory();
2902                 return -1;
2903             }
2904 
2905             /* drawing pictures might help understand these for
2906                loops. Basically, we memmove the parts of the
2907                list that are *not* part of the slice: step-1
2908                items for each item that is part of the slice,
2909                and then tail end of the list that was not
2910                covered by the slice */
2911             for (cur = start, i = 0;
2912                  cur < (size_t)stop;
2913                  cur += step, i++) {
2914                 Py_ssize_t lim = step - 1;
2915 
2916                 garbage[i] = PyList_GET_ITEM(self, cur);
2917 
2918                 if (cur + step >= (size_t)Py_SIZE(self)) {
2919                     lim = Py_SIZE(self) - cur - 1;
2920                 }
2921 
2922                 memmove(self->ob_item + cur - i,
2923                     self->ob_item + cur + 1,
2924                     lim * sizeof(PyObject *));
2925             }
2926             cur = start + (size_t)slicelength * step;
2927             if (cur < (size_t)Py_SIZE(self)) {
2928                 memmove(self->ob_item + cur - slicelength,
2929                     self->ob_item + cur,
2930                     (Py_SIZE(self) - cur) *
2931                      sizeof(PyObject *));
2932             }
2933 
2934             Py_SET_SIZE(self, Py_SIZE(self) - slicelength);
2935             res = list_resize(self, Py_SIZE(self));
2936 
2937             for (i = 0; i < slicelength; i++) {
2938                 Py_DECREF(garbage[i]);
2939             }
2940             PyMem_FREE(garbage);
2941 
2942             return res;
2943         }
2944         else {
2945             /* assign slice */
2946             PyObject *ins, *seq;
2947             PyObject **garbage, **seqitems, **selfitems;
2948             Py_ssize_t i;
2949             size_t cur;
2950 
2951             /* protect against a[::-1] = a */
2952             if (self == (PyListObject*)value) {
2953                 seq = list_slice((PyListObject*)value, 0,
2954                                    PyList_GET_SIZE(value));
2955             }
2956             else {
2957                 seq = PySequence_Fast(value,
2958                                       "must assign iterable "
2959                                       "to extended slice");
2960             }
2961             if (!seq)
2962                 return -1;
2963 
2964             if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2965                 PyErr_Format(PyExc_ValueError,
2966                     "attempt to assign sequence of "
2967                     "size %zd to extended slice of "
2968                     "size %zd",
2969                          PySequence_Fast_GET_SIZE(seq),
2970                          slicelength);
2971                 Py_DECREF(seq);
2972                 return -1;
2973             }
2974 
2975             if (!slicelength) {
2976                 Py_DECREF(seq);
2977                 return 0;
2978             }
2979 
2980             garbage = (PyObject**)
2981                 PyMem_MALLOC(slicelength*sizeof(PyObject*));
2982             if (!garbage) {
2983                 Py_DECREF(seq);
2984                 PyErr_NoMemory();
2985                 return -1;
2986             }
2987 
2988             selfitems = self->ob_item;
2989             seqitems = PySequence_Fast_ITEMS(seq);
2990             for (cur = start, i = 0; i < slicelength;
2991                  cur += (size_t)step, i++) {
2992                 garbage[i] = selfitems[cur];
2993                 ins = seqitems[i];
2994                 Py_INCREF(ins);
2995                 selfitems[cur] = ins;
2996             }
2997 
2998             for (i = 0; i < slicelength; i++) {
2999                 Py_DECREF(garbage[i]);
3000             }
3001 
3002             PyMem_FREE(garbage);
3003             Py_DECREF(seq);
3004 
3005             return 0;
3006         }
3007     }
3008     else {
3009         PyErr_Format(PyExc_TypeError,
3010                      "list indices must be integers or slices, not %.200s",
3011                      Py_TYPE(item)->tp_name);
3012         return -1;
3013     }
3014 }
3015 
3016 static PyMappingMethods list_as_mapping = {
3017     (lenfunc)list_length,
3018     (binaryfunc)list_subscript,
3019     (objobjargproc)list_ass_subscript
3020 };
3021 
3022 PyTypeObject PyList_Type = {
3023     PyVarObject_HEAD_INIT(&PyType_Type, 0)
3024     "list",
3025     sizeof(PyListObject),
3026     0,
3027     (destructor)list_dealloc,                   /* tp_dealloc */
3028     0,                                          /* tp_vectorcall_offset */
3029     0,                                          /* tp_getattr */
3030     0,                                          /* tp_setattr */
3031     0,                                          /* tp_as_async */
3032     (reprfunc)list_repr,                        /* tp_repr */
3033     0,                                          /* tp_as_number */
3034     &list_as_sequence,                          /* tp_as_sequence */
3035     &list_as_mapping,                           /* tp_as_mapping */
3036     PyObject_HashNotImplemented,                /* tp_hash */
3037     0,                                          /* tp_call */
3038     0,                                          /* tp_str */
3039     PyObject_GenericGetAttr,                    /* tp_getattro */
3040     0,                                          /* tp_setattro */
3041     0,                                          /* tp_as_buffer */
3042     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3043         Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
3044     list___init____doc__,                       /* tp_doc */
3045     (traverseproc)list_traverse,                /* tp_traverse */
3046     (inquiry)_list_clear,                       /* tp_clear */
3047     list_richcompare,                           /* tp_richcompare */
3048     0,                                          /* tp_weaklistoffset */
3049     list_iter,                                  /* tp_iter */
3050     0,                                          /* tp_iternext */
3051     list_methods,                               /* tp_methods */
3052     0,                                          /* tp_members */
3053     0,                                          /* tp_getset */
3054     0,                                          /* tp_base */
3055     0,                                          /* tp_dict */
3056     0,                                          /* tp_descr_get */
3057     0,                                          /* tp_descr_set */
3058     0,                                          /* tp_dictoffset */
3059     (initproc)list___init__,                    /* tp_init */
3060     PyType_GenericAlloc,                        /* tp_alloc */
3061     PyType_GenericNew,                          /* tp_new */
3062     PyObject_GC_Del,                            /* tp_free */
3063     .tp_vectorcall = list_vectorcall,
3064 };
3065 
3066 /*********************** List Iterator **************************/
3067 
3068 typedef struct {
3069     PyObject_HEAD
3070     Py_ssize_t it_index;
3071     PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
3072 } listiterobject;
3073 
3074 static void listiter_dealloc(listiterobject *);
3075 static int listiter_traverse(listiterobject *, visitproc, void *);
3076 static PyObject *listiter_next(listiterobject *);
3077 static PyObject *listiter_len(listiterobject *, PyObject *);
3078 static PyObject *listiter_reduce_general(void *_it, int forward);
3079 static PyObject *listiter_reduce(listiterobject *, PyObject *);
3080 static PyObject *listiter_setstate(listiterobject *, PyObject *state);
3081 
3082 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
3083 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3084 PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3085 
3086 static PyMethodDef listiter_methods[] = {
3087     {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
3088     {"__reduce__", (PyCFunction)listiter_reduce, METH_NOARGS, reduce_doc},
3089     {"__setstate__", (PyCFunction)listiter_setstate, METH_O, setstate_doc},
3090     {NULL,              NULL}           /* sentinel */
3091 };
3092 
3093 PyTypeObject PyListIter_Type = {
3094     PyVarObject_HEAD_INIT(&PyType_Type, 0)
3095     "list_iterator",                            /* tp_name */
3096     sizeof(listiterobject),                     /* tp_basicsize */
3097     0,                                          /* tp_itemsize */
3098     /* methods */
3099     (destructor)listiter_dealloc,               /* tp_dealloc */
3100     0,                                          /* tp_vectorcall_offset */
3101     0,                                          /* tp_getattr */
3102     0,                                          /* tp_setattr */
3103     0,                                          /* tp_as_async */
3104     0,                                          /* tp_repr */
3105     0,                                          /* tp_as_number */
3106     0,                                          /* tp_as_sequence */
3107     0,                                          /* tp_as_mapping */
3108     0,                                          /* tp_hash */
3109     0,                                          /* tp_call */
3110     0,                                          /* tp_str */
3111     PyObject_GenericGetAttr,                    /* tp_getattro */
3112     0,                                          /* tp_setattro */
3113     0,                                          /* tp_as_buffer */
3114     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3115     0,                                          /* tp_doc */
3116     (traverseproc)listiter_traverse,            /* tp_traverse */
3117     0,                                          /* tp_clear */
3118     0,                                          /* tp_richcompare */
3119     0,                                          /* tp_weaklistoffset */
3120     PyObject_SelfIter,                          /* tp_iter */
3121     (iternextfunc)listiter_next,                /* tp_iternext */
3122     listiter_methods,                           /* tp_methods */
3123     0,                                          /* tp_members */
3124 };
3125 
3126 
3127 static PyObject *
list_iter(PyObject * seq)3128 list_iter(PyObject *seq)
3129 {
3130     listiterobject *it;
3131 
3132     if (!PyList_Check(seq)) {
3133         PyErr_BadInternalCall();
3134         return NULL;
3135     }
3136     it = PyObject_GC_New(listiterobject, &PyListIter_Type);
3137     if (it == NULL)
3138         return NULL;
3139     it->it_index = 0;
3140     Py_INCREF(seq);
3141     it->it_seq = (PyListObject *)seq;
3142     _PyObject_GC_TRACK(it);
3143     return (PyObject *)it;
3144 }
3145 
3146 static void
listiter_dealloc(listiterobject * it)3147 listiter_dealloc(listiterobject *it)
3148 {
3149     _PyObject_GC_UNTRACK(it);
3150     Py_XDECREF(it->it_seq);
3151     PyObject_GC_Del(it);
3152 }
3153 
3154 static int
listiter_traverse(listiterobject * it,visitproc visit,void * arg)3155 listiter_traverse(listiterobject *it, visitproc visit, void *arg)
3156 {
3157     Py_VISIT(it->it_seq);
3158     return 0;
3159 }
3160 
3161 static PyObject *
listiter_next(listiterobject * it)3162 listiter_next(listiterobject *it)
3163 {
3164     PyListObject *seq;
3165     PyObject *item;
3166 
3167     assert(it != NULL);
3168     seq = it->it_seq;
3169     if (seq == NULL)
3170         return NULL;
3171     assert(PyList_Check(seq));
3172 
3173     if (it->it_index < PyList_GET_SIZE(seq)) {
3174         item = PyList_GET_ITEM(seq, it->it_index);
3175         ++it->it_index;
3176         Py_INCREF(item);
3177         return item;
3178     }
3179 
3180     it->it_seq = NULL;
3181     Py_DECREF(seq);
3182     return NULL;
3183 }
3184 
3185 static PyObject *
listiter_len(listiterobject * it,PyObject * Py_UNUSED (ignored))3186 listiter_len(listiterobject *it, PyObject *Py_UNUSED(ignored))
3187 {
3188     Py_ssize_t len;
3189     if (it->it_seq) {
3190         len = PyList_GET_SIZE(it->it_seq) - it->it_index;
3191         if (len >= 0)
3192             return PyLong_FromSsize_t(len);
3193     }
3194     return PyLong_FromLong(0);
3195 }
3196 
3197 static PyObject *
listiter_reduce(listiterobject * it,PyObject * Py_UNUSED (ignored))3198 listiter_reduce(listiterobject *it, PyObject *Py_UNUSED(ignored))
3199 {
3200     return listiter_reduce_general(it, 1);
3201 }
3202 
3203 static PyObject *
listiter_setstate(listiterobject * it,PyObject * state)3204 listiter_setstate(listiterobject *it, PyObject *state)
3205 {
3206     Py_ssize_t index = PyLong_AsSsize_t(state);
3207     if (index == -1 && PyErr_Occurred())
3208         return NULL;
3209     if (it->it_seq != NULL) {
3210         if (index < 0)
3211             index = 0;
3212         else if (index > PyList_GET_SIZE(it->it_seq))
3213             index = PyList_GET_SIZE(it->it_seq); /* iterator exhausted */
3214         it->it_index = index;
3215     }
3216     Py_RETURN_NONE;
3217 }
3218 
3219 /*********************** List Reverse Iterator **************************/
3220 
3221 typedef struct {
3222     PyObject_HEAD
3223     Py_ssize_t it_index;
3224     PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
3225 } listreviterobject;
3226 
3227 static void listreviter_dealloc(listreviterobject *);
3228 static int listreviter_traverse(listreviterobject *, visitproc, void *);
3229 static PyObject *listreviter_next(listreviterobject *);
3230 static PyObject *listreviter_len(listreviterobject *, PyObject *);
3231 static PyObject *listreviter_reduce(listreviterobject *, PyObject *);
3232 static PyObject *listreviter_setstate(listreviterobject *, PyObject *);
3233 
3234 static PyMethodDef listreviter_methods[] = {
3235     {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
3236     {"__reduce__", (PyCFunction)listreviter_reduce, METH_NOARGS, reduce_doc},
3237     {"__setstate__", (PyCFunction)listreviter_setstate, METH_O, setstate_doc},
3238     {NULL,              NULL}           /* sentinel */
3239 };
3240 
3241 PyTypeObject PyListRevIter_Type = {
3242     PyVarObject_HEAD_INIT(&PyType_Type, 0)
3243     "list_reverseiterator",                     /* tp_name */
3244     sizeof(listreviterobject),                  /* tp_basicsize */
3245     0,                                          /* tp_itemsize */
3246     /* methods */
3247     (destructor)listreviter_dealloc,            /* tp_dealloc */
3248     0,                                          /* tp_vectorcall_offset */
3249     0,                                          /* tp_getattr */
3250     0,                                          /* tp_setattr */
3251     0,                                          /* tp_as_async */
3252     0,                                          /* tp_repr */
3253     0,                                          /* tp_as_number */
3254     0,                                          /* tp_as_sequence */
3255     0,                                          /* tp_as_mapping */
3256     0,                                          /* tp_hash */
3257     0,                                          /* tp_call */
3258     0,                                          /* tp_str */
3259     PyObject_GenericGetAttr,                    /* tp_getattro */
3260     0,                                          /* tp_setattro */
3261     0,                                          /* tp_as_buffer */
3262     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3263     0,                                          /* tp_doc */
3264     (traverseproc)listreviter_traverse,         /* tp_traverse */
3265     0,                                          /* tp_clear */
3266     0,                                          /* tp_richcompare */
3267     0,                                          /* tp_weaklistoffset */
3268     PyObject_SelfIter,                          /* tp_iter */
3269     (iternextfunc)listreviter_next,             /* tp_iternext */
3270     listreviter_methods,                /* tp_methods */
3271     0,
3272 };
3273 
3274 /*[clinic input]
3275 list.__reversed__
3276 
3277 Return a reverse iterator over the list.
3278 [clinic start generated code]*/
3279 
3280 static PyObject *
list___reversed___impl(PyListObject * self)3281 list___reversed___impl(PyListObject *self)
3282 /*[clinic end generated code: output=b166f073208c888c input=eadb6e17f8a6a280]*/
3283 {
3284     listreviterobject *it;
3285 
3286     it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
3287     if (it == NULL)
3288         return NULL;
3289     assert(PyList_Check(self));
3290     it->it_index = PyList_GET_SIZE(self) - 1;
3291     Py_INCREF(self);
3292     it->it_seq = self;
3293     PyObject_GC_Track(it);
3294     return (PyObject *)it;
3295 }
3296 
3297 static void
listreviter_dealloc(listreviterobject * it)3298 listreviter_dealloc(listreviterobject *it)
3299 {
3300     PyObject_GC_UnTrack(it);
3301     Py_XDECREF(it->it_seq);
3302     PyObject_GC_Del(it);
3303 }
3304 
3305 static int
listreviter_traverse(listreviterobject * it,visitproc visit,void * arg)3306 listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
3307 {
3308     Py_VISIT(it->it_seq);
3309     return 0;
3310 }
3311 
3312 static PyObject *
listreviter_next(listreviterobject * it)3313 listreviter_next(listreviterobject *it)
3314 {
3315     PyObject *item;
3316     Py_ssize_t index;
3317     PyListObject *seq;
3318 
3319     assert(it != NULL);
3320     seq = it->it_seq;
3321     if (seq == NULL) {
3322         return NULL;
3323     }
3324     assert(PyList_Check(seq));
3325 
3326     index = it->it_index;
3327     if (index>=0 && index < PyList_GET_SIZE(seq)) {
3328         item = PyList_GET_ITEM(seq, index);
3329         it->it_index--;
3330         Py_INCREF(item);
3331         return item;
3332     }
3333     it->it_index = -1;
3334     it->it_seq = NULL;
3335     Py_DECREF(seq);
3336     return NULL;
3337 }
3338 
3339 static PyObject *
listreviter_len(listreviterobject * it,PyObject * Py_UNUSED (ignored))3340 listreviter_len(listreviterobject *it, PyObject *Py_UNUSED(ignored))
3341 {
3342     Py_ssize_t len = it->it_index + 1;
3343     if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
3344         len = 0;
3345     return PyLong_FromSsize_t(len);
3346 }
3347 
3348 static PyObject *
listreviter_reduce(listreviterobject * it,PyObject * Py_UNUSED (ignored))3349 listreviter_reduce(listreviterobject *it, PyObject *Py_UNUSED(ignored))
3350 {
3351     return listiter_reduce_general(it, 0);
3352 }
3353 
3354 static PyObject *
listreviter_setstate(listreviterobject * it,PyObject * state)3355 listreviter_setstate(listreviterobject *it, PyObject *state)
3356 {
3357     Py_ssize_t index = PyLong_AsSsize_t(state);
3358     if (index == -1 && PyErr_Occurred())
3359         return NULL;
3360     if (it->it_seq != NULL) {
3361         if (index < -1)
3362             index = -1;
3363         else if (index > PyList_GET_SIZE(it->it_seq) - 1)
3364             index = PyList_GET_SIZE(it->it_seq) - 1;
3365         it->it_index = index;
3366     }
3367     Py_RETURN_NONE;
3368 }
3369 
3370 /* common pickling support */
3371 
3372 static PyObject *
listiter_reduce_general(void * _it,int forward)3373 listiter_reduce_general(void *_it, int forward)
3374 {
3375     _Py_IDENTIFIER(iter);
3376     _Py_IDENTIFIER(reversed);
3377     PyObject *list;
3378 
3379     /* the objects are not the same, index is of different types! */
3380     if (forward) {
3381         listiterobject *it = (listiterobject *)_it;
3382         if (it->it_seq)
3383             return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter),
3384                                  it->it_seq, it->it_index);
3385     } else {
3386         listreviterobject *it = (listreviterobject *)_it;
3387         if (it->it_seq)
3388             return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_reversed),
3389                                  it->it_seq, it->it_index);
3390     }
3391     /* empty iterator, create an empty list */
3392     list = PyList_New(0);
3393     if (list == NULL)
3394         return NULL;
3395     return Py_BuildValue("N(N)", _PyEval_GetBuiltinId(&PyId_iter), list);
3396 }
3397