LCOV - code coverage report
Current view: top level - Objects - listobject.c (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 1371 1484 92.4 %
Date: 2022-07-20 13:12:14 Functions: 96 96 100.0 %
Branches: 813 935 87.0 %

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

Generated by: LCOV version 1.14