Coverage Report

Created: 2026-03-08 06:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Objects/listobject.c
Line
Count
Source
1
/* List object implementation */
2
3
#include "Python.h"
4
#include "pycore_abstract.h"      // _PyIndex_Check()
5
#include "pycore_ceval.h"         // _PyEval_GetBuiltin()
6
#include "pycore_critical_section.h"  // _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED()
7
#include "pycore_dict.h"          // _PyDictViewObject
8
#include "pycore_freelist.h"      // _Py_FREELIST_FREE(), _Py_FREELIST_POP()
9
#include "pycore_interp.h"        // PyInterpreterState.list
10
#include "pycore_list.h"          // struct _Py_list_freelist, _PyListIterObject
11
#include "pycore_long.h"          // _PyLong_DigitCount
12
#include "pycore_modsupport.h"    // _PyArg_NoKwnames()
13
#include "pycore_object.h"        // _PyObject_GC_TRACK(), _PyDebugAllocatorStats()
14
#include "pycore_pyatomic_ft_wrappers.h"
15
#include "pycore_setobject.h"     // _PySet_NextEntry()
16
#include "pycore_stackref.h"      // _Py_TryIncrefCompareStackRef()
17
#include "pycore_tuple.h"         // _PyTuple_FromArraySteal()
18
#include "pycore_typeobject.h"    // _Py_TYPE_VERSION_LIST
19
#include <stddef.h>
20
21
/*[clinic input]
22
class list "PyListObject *" "&PyList_Type"
23
[clinic start generated code]*/
24
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f9b222678f9f71e0]*/
25
26
#include "clinic/listobject.c.h"
27
28
_Py_DECLARE_STR(list_err, "list index out of range");
29
30
#ifdef Py_GIL_DISABLED
31
typedef struct {
32
    Py_ssize_t allocated;
33
    PyObject *ob_item[];
34
} _PyListArray;
35
36
static _PyListArray *
37
list_allocate_array(size_t capacity)
38
{
39
    if (capacity > PY_SSIZE_T_MAX/sizeof(PyObject*) - 1) {
40
        return NULL;
41
    }
42
    _PyListArray *array = PyMem_Malloc(sizeof(_PyListArray) + capacity * sizeof(PyObject *));
43
    if (array == NULL) {
44
        return NULL;
45
    }
46
    array->allocated = capacity;
47
    return array;
48
}
49
50
static Py_ssize_t
51
list_capacity(PyObject **items)
52
{
53
    _PyListArray *array = _Py_CONTAINER_OF(items, _PyListArray, ob_item);
54
    return array->allocated;
55
}
56
#endif
57
58
static void
59
free_list_items(PyObject** items, bool use_qsbr)
60
161M
{
61
#ifdef Py_GIL_DISABLED
62
    _PyListArray *array = _Py_CONTAINER_OF(items, _PyListArray, ob_item);
63
    if (use_qsbr) {
64
        size_t size = sizeof(_PyListArray) + array->allocated * sizeof(PyObject *);
65
        _PyMem_FreeDelayed(array, size);
66
    }
67
    else {
68
        PyMem_Free(array);
69
    }
70
#else
71
161M
    PyMem_Free(items);
72
161M
#endif
73
161M
}
74
75
static void
76
ensure_shared_on_resize(PyListObject *self)
77
119M
{
78
#ifdef Py_GIL_DISABLED
79
    // We can't use _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED here because
80
    // the `CALL_LIST_APPEND` bytecode handler may lock the list without
81
    // a critical section.
82
    assert(Py_REFCNT(self) == 1 || PyMutex_IsLocked(&_PyObject_CAST(self)->ob_mutex));
83
84
    // Ensure that the list array is freed using QSBR if we are not the
85
    // owning thread.
86
    if (!_Py_IsOwnedByCurrentThread((PyObject *)self) &&
87
        !_PyObject_GC_IS_SHARED(self))
88
    {
89
        _PyObject_GC_SET_SHARED(self);
90
    }
91
#endif
92
119M
}
93
94
/* Ensure ob_item has room for at least newsize elements, and set
95
 * ob_size to newsize.  If newsize > ob_size on entry, the content
96
 * of the new slots at exit is undefined heap trash; it's the caller's
97
 * responsibility to overwrite them with sane values.
98
 * The number of allocated elements may grow, shrink, or stay the same.
99
 * Failure is impossible if newsize <= self.allocated on entry.
100
 * Note that self->ob_item may change, and even if newsize is less
101
 * than ob_size on entry.
102
 */
103
static int
104
list_resize(PyListObject *self, Py_ssize_t newsize)
105
140M
{
106
140M
    size_t new_allocated, target_bytes;
107
140M
    Py_ssize_t allocated = self->allocated;
108
109
    /* Bypass realloc() when a previous overallocation is large enough
110
       to accommodate the newsize.  If the newsize falls lower than half
111
       the allocated size, then proceed with the realloc() to shrink the list.
112
    */
113
140M
    if (allocated >= newsize && newsize >= (allocated >> 1)) {
114
20.3M
        assert(self->ob_item != NULL || newsize == 0);
115
20.3M
        Py_SET_SIZE(self, newsize);
116
20.3M
        return 0;
117
20.3M
    }
118
119
    /* This over-allocates proportional to the list size, making room
120
     * for additional growth.  The over-allocation is mild, but is
121
     * enough to give linear-time amortized behavior over a long
122
     * sequence of appends() in the presence of a poorly-performing
123
     * system realloc().
124
     * Add padding to make the allocated size multiple of 4.
125
     * The growth pattern is:  0, 4, 8, 16, 24, 32, 40, 52, 64, 76, ...
126
     * Note: new_allocated won't overflow because the largest possible value
127
     *       is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t.
128
     */
129
119M
    new_allocated = ((size_t)newsize + (newsize >> 3) + 6) & ~(size_t)3;
130
    /* Do not overallocate if the new size is closer to overallocated size
131
     * than to the old size.
132
     */
133
119M
    if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize))
134
253k
        new_allocated = ((size_t)newsize + 3) & ~(size_t)3;
135
136
119M
    if (newsize == 0)
137
18.9k
        new_allocated = 0;
138
139
119M
    ensure_shared_on_resize(self);
140
141
#ifdef Py_GIL_DISABLED
142
    _PyListArray *array = list_allocate_array(new_allocated);
143
    if (array == NULL) {
144
        if (newsize < allocated) {
145
            // Never fail when shrinking allocations
146
            Py_SET_SIZE(self, newsize);
147
            return 0;
148
        }
149
        PyErr_NoMemory();
150
        return -1;
151
    }
152
    PyObject **old_items = self->ob_item;
153
    if (self->ob_item) {
154
        if (new_allocated < (size_t)allocated) {
155
            target_bytes = new_allocated * sizeof(PyObject*);
156
        }
157
        else {
158
            target_bytes = allocated * sizeof(PyObject*);
159
        }
160
        memcpy(array->ob_item, self->ob_item, target_bytes);
161
    }
162
    if (new_allocated > (size_t)allocated) {
163
        memset(array->ob_item + allocated, 0, sizeof(PyObject *) * (new_allocated - allocated));
164
    }
165
     _Py_atomic_store_ptr_release(&self->ob_item, &array->ob_item);
166
    self->allocated = new_allocated;
167
    Py_SET_SIZE(self, newsize);
168
    if (old_items != NULL) {
169
        free_list_items(old_items, _PyObject_GC_IS_SHARED(self));
170
    }
171
#else
172
119M
    PyObject **items;
173
119M
    if (new_allocated <= (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {
174
119M
        target_bytes = new_allocated * sizeof(PyObject *);
175
119M
        items = (PyObject **)PyMem_Realloc(self->ob_item, target_bytes);
176
119M
    }
177
0
    else {
178
        // integer overflow
179
0
        items = NULL;
180
0
    }
181
119M
    if (items == NULL) {
182
0
        if (newsize < allocated) {
183
            // Never fail when shrinking allocations
184
0
            Py_SET_SIZE(self, newsize);
185
0
            return 0;
186
0
        }
187
0
        PyErr_NoMemory();
188
0
        return -1;
189
0
    }
190
119M
    self->ob_item = items;
191
119M
    Py_SET_SIZE(self, newsize);
192
119M
    self->allocated = new_allocated;
193
119M
#endif
194
119M
    return 0;
195
119M
}
196
197
static int
198
list_preallocate_exact(PyListObject *self, Py_ssize_t size)
199
6.71M
{
200
6.71M
    PyObject **items;
201
6.71M
    assert(self->ob_item == NULL);
202
6.71M
    assert(size > 0);
203
204
    /* Since the Python memory allocator has granularity of 16 bytes on 64-bit
205
     * platforms (8 on 32-bit), there is no benefit of allocating space for
206
     * the odd number of items, and there is no drawback of rounding the
207
     * allocated size up to the nearest even number.
208
     */
209
6.71M
    size = (size + 1) & ~(size_t)1;
210
#ifdef Py_GIL_DISABLED
211
    _PyListArray *array = list_allocate_array(size);
212
    if (array == NULL) {
213
        PyErr_NoMemory();
214
        return -1;
215
    }
216
    items = array->ob_item;
217
    memset(items, 0, size * sizeof(PyObject *));
218
#else
219
6.71M
    items = PyMem_New(PyObject*, size);
220
6.71M
    if (items == NULL) {
221
0
        PyErr_NoMemory();
222
0
        return -1;
223
0
    }
224
6.71M
#endif
225
6.71M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, items);
226
6.71M
    self->allocated = size;
227
6.71M
    return 0;
228
6.71M
}
229
230
/* Print summary info about the state of the optimized allocator */
231
void
232
_PyList_DebugMallocStats(FILE *out)
233
0
{
234
0
    _PyDebugAllocatorStats(out,
235
0
                           "free PyListObject",
236
0
                            _Py_FREELIST_SIZE(lists),
237
0
                           sizeof(PyListObject));
238
0
}
239
240
PyObject *
241
PyList_New(Py_ssize_t size)
242
311M
{
243
311M
    if (size < 0) {
244
0
        PyErr_BadInternalCall();
245
0
        return NULL;
246
0
    }
247
248
311M
    PyListObject *op = _Py_FREELIST_POP(PyListObject, lists);
249
311M
    if (op == NULL) {
250
51.5M
        op = PyObject_GC_New(PyListObject, &PyList_Type);
251
51.5M
        if (op == NULL) {
252
0
            return NULL;
253
0
        }
254
51.5M
    }
255
311M
    if (size <= 0) {
256
253M
        op->ob_item = NULL;
257
253M
    }
258
57.4M
    else {
259
#ifdef Py_GIL_DISABLED
260
        _PyListArray *array = list_allocate_array(size);
261
        if (array == NULL) {
262
            Py_DECREF(op);
263
            return PyErr_NoMemory();
264
        }
265
        memset(&array->ob_item, 0, size * sizeof(PyObject *));
266
        op->ob_item = array->ob_item;
267
#else
268
57.4M
        op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));
269
57.4M
#endif
270
57.4M
        if (op->ob_item == NULL) {
271
0
            Py_DECREF(op);
272
0
            return PyErr_NoMemory();
273
0
        }
274
57.4M
    }
275
311M
    Py_SET_SIZE(op, size);
276
311M
    op->allocated = size;
277
311M
    _PyObject_GC_TRACK(op);
278
311M
    return (PyObject *) op;
279
311M
}
280
281
static PyObject *
282
list_new_prealloc(Py_ssize_t size)
283
18.2M
{
284
18.2M
    assert(size > 0);
285
18.2M
    PyListObject *op = (PyListObject *) PyList_New(0);
286
18.2M
    if (op == NULL) {
287
0
        return NULL;
288
0
    }
289
18.2M
    assert(op->ob_item == NULL);
290
#ifdef Py_GIL_DISABLED
291
    _PyListArray *array = list_allocate_array(size);
292
    if (array == NULL) {
293
        Py_DECREF(op);
294
        return PyErr_NoMemory();
295
    }
296
    op->ob_item = array->ob_item;
297
#else
298
18.2M
    op->ob_item = PyMem_New(PyObject *, size);
299
18.2M
    if (op->ob_item == NULL) {
300
0
        Py_DECREF(op);
301
0
        return PyErr_NoMemory();
302
0
    }
303
18.2M
#endif
304
18.2M
    op->allocated = size;
305
18.2M
    return (PyObject *) op;
306
18.2M
}
307
308
Py_ssize_t
309
PyList_Size(PyObject *op)
310
86.0k
{
311
86.0k
    if (!PyList_Check(op)) {
312
0
        PyErr_BadInternalCall();
313
0
        return -1;
314
0
    }
315
86.0k
    else {
316
86.0k
        return PyList_GET_SIZE(op);
317
86.0k
    }
318
86.0k
}
319
320
static inline int
321
valid_index(Py_ssize_t i, Py_ssize_t limit)
322
269M
{
323
    /* The cast to size_t lets us use just a single comparison
324
       to check whether i is in the range: 0 <= i < limit.
325
326
       See:  Section 14.2 "Bounds Checking" in the Agner Fog
327
       optimization manual found at:
328
       https://www.agner.org/optimize/optimizing_cpp.pdf
329
    */
330
269M
    return (size_t) i < (size_t) limit;
331
269M
}
332
333
#ifdef Py_GIL_DISABLED
334
335
static PyObject *
336
list_item_impl(PyListObject *self, Py_ssize_t idx)
337
{
338
    PyObject *item = NULL;
339
    Py_BEGIN_CRITICAL_SECTION(self);
340
    if (!_PyObject_GC_IS_SHARED(self)) {
341
        _PyObject_GC_SET_SHARED(self);
342
    }
343
    Py_ssize_t size = Py_SIZE(self);
344
    if (!valid_index(idx, size)) {
345
        goto exit;
346
    }
347
    item = _Py_NewRefWithLock(self->ob_item[idx]);
348
exit:
349
    Py_END_CRITICAL_SECTION();
350
    return item;
351
}
352
353
static inline PyObject*
354
list_get_item_ref(PyListObject *op, Py_ssize_t i)
355
{
356
    if (!_Py_IsOwnedByCurrentThread((PyObject *)op) && !_PyObject_GC_IS_SHARED(op)) {
357
        return list_item_impl(op, i);
358
    }
359
    // Need atomic operation for the getting size.
360
    Py_ssize_t size = PyList_GET_SIZE(op);
361
    if (!valid_index(i, size)) {
362
        return NULL;
363
    }
364
    PyObject **ob_item = _Py_atomic_load_ptr(&op->ob_item);
365
    if (ob_item == NULL) {
366
        return NULL;
367
    }
368
    Py_ssize_t cap = list_capacity(ob_item);
369
    assert(cap != -1);
370
    if (!valid_index(i, cap)) {
371
        return NULL;
372
    }
373
    PyObject *item = _Py_TryXGetRef(&ob_item[i]);
374
    if (item == NULL) {
375
        return list_item_impl(op, i);
376
    }
377
    return item;
378
}
379
#else
380
static inline PyObject*
381
list_get_item_ref(PyListObject *op, Py_ssize_t i)
382
184M
{
383
184M
    if (!valid_index(i, Py_SIZE(op))) {
384
32.9M
        return NULL;
385
32.9M
    }
386
151M
    return Py_NewRef(PyList_GET_ITEM(op, i));
387
184M
}
388
#endif
389
390
PyObject *
391
PyList_GetItem(PyObject *op, Py_ssize_t i)
392
132
{
393
132
    if (!PyList_Check(op)) {
394
0
        PyErr_BadInternalCall();
395
0
        return NULL;
396
0
    }
397
132
    if (!valid_index(i, Py_SIZE(op))) {
398
0
        _Py_DECLARE_STR(list_err, "list index out of range");
399
0
        PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
400
0
        return NULL;
401
0
    }
402
132
    return ((PyListObject *)op) -> ob_item[i];
403
132
}
404
405
PyObject *
406
PyList_GetItemRef(PyObject *op, Py_ssize_t i)
407
80.6k
{
408
80.6k
    if (!PyList_Check(op)) {
409
0
        PyErr_SetString(PyExc_TypeError, "expected a list");
410
0
        return NULL;
411
0
    }
412
80.6k
    PyObject *item = list_get_item_ref((PyListObject *)op, i);
413
80.6k
    if (item == NULL) {
414
0
        _Py_DECLARE_STR(list_err, "list index out of range");
415
0
        PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
416
0
        return NULL;
417
0
    }
418
80.6k
    return item;
419
80.6k
}
420
421
PyObject *
422
_PyList_GetItemRef(PyListObject *list, Py_ssize_t i)
423
1.50M
{
424
1.50M
    return list_get_item_ref(list, i);
425
1.50M
}
426
427
#ifdef Py_GIL_DISABLED
428
int
429
_PyList_GetItemRefNoLock(PyListObject *list, Py_ssize_t i, _PyStackRef *result)
430
{
431
    assert(_Py_IsOwnedByCurrentThread((PyObject *)list) ||
432
           _PyObject_GC_IS_SHARED(list));
433
    if (!valid_index(i, PyList_GET_SIZE(list))) {
434
        return 0;
435
    }
436
    PyObject **ob_item = _Py_atomic_load_ptr(&list->ob_item);
437
    if (ob_item == NULL) {
438
        return 0;
439
    }
440
    Py_ssize_t cap = list_capacity(ob_item);
441
    assert(cap != -1);
442
    if (!valid_index(i, cap)) {
443
        return 0;
444
    }
445
    PyObject *obj = _Py_atomic_load_ptr(&ob_item[i]);
446
    if (obj == NULL || !_Py_TryIncrefCompareStackRef(&ob_item[i], obj, result)) {
447
        return -1;
448
    }
449
    return 1;
450
}
451
#endif
452
453
int
454
PyList_SetItem(PyObject *op, Py_ssize_t i,
455
               PyObject *newitem)
456
6.47M
{
457
6.47M
    if (!PyList_Check(op)) {
458
0
        Py_XDECREF(newitem);
459
0
        PyErr_BadInternalCall();
460
0
        return -1;
461
0
    }
462
6.47M
    int ret;
463
6.47M
    PyListObject *self = ((PyListObject *)op);
464
6.47M
    Py_BEGIN_CRITICAL_SECTION(self);
465
6.47M
    if (!valid_index(i, Py_SIZE(self))) {
466
0
        Py_XDECREF(newitem);
467
0
        PyErr_SetString(PyExc_IndexError,
468
0
                        "list assignment index out of range");
469
0
        ret = -1;
470
0
        goto end;
471
0
    }
472
6.47M
    PyObject *tmp = self->ob_item[i];
473
6.47M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[i], newitem);
474
6.47M
    Py_XDECREF(tmp);
475
6.47M
    ret = 0;
476
6.47M
end:;
477
6.47M
    Py_END_CRITICAL_SECTION();
478
6.47M
    return ret;
479
6.47M
}
480
481
static int
482
ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
483
1.92k
{
484
1.92k
    Py_ssize_t i, n = Py_SIZE(self);
485
1.92k
    PyObject **items;
486
1.92k
    if (v == NULL) {
487
0
        PyErr_BadInternalCall();
488
0
        return -1;
489
0
    }
490
491
1.92k
    assert((size_t)n + 1 < PY_SSIZE_T_MAX);
492
1.92k
    if (list_resize(self, n+1) < 0)
493
0
        return -1;
494
495
1.92k
    if (where < 0) {
496
0
        where += n;
497
0
        if (where < 0)
498
0
            where = 0;
499
0
    }
500
1.92k
    if (where > n)
501
0
        where = n;
502
1.92k
    items = self->ob_item;
503
13.2k
    for (i = n; --i >= where; )
504
11.3k
        FT_ATOMIC_STORE_PTR_RELEASE(items[i+1], items[i]);
505
1.92k
    FT_ATOMIC_STORE_PTR_RELEASE(items[where], Py_NewRef(v));
506
1.92k
    return 0;
507
1.92k
}
508
509
int
510
PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
511
39
{
512
39
    if (!PyList_Check(op)) {
513
0
        PyErr_BadInternalCall();
514
0
        return -1;
515
0
    }
516
39
    PyListObject *self = (PyListObject *)op;
517
39
    int err;
518
39
    Py_BEGIN_CRITICAL_SECTION(self);
519
39
    err = ins1(self, where, newitem);
520
39
    Py_END_CRITICAL_SECTION();
521
39
    return err;
522
39
}
523
524
/* internal, used by _PyList_AppendTakeRef */
525
int
526
_PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem)
527
87.0M
{
528
87.0M
    Py_ssize_t len = Py_SIZE(self);
529
87.0M
    assert(self->allocated == -1 || self->allocated == len);
530
87.0M
    if (list_resize(self, len + 1) < 0) {
531
0
        Py_DECREF(newitem);
532
0
        return -1;
533
0
    }
534
87.0M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[len], newitem);
535
87.0M
    return 0;
536
87.0M
}
537
538
int
539
PyList_Append(PyObject *op, PyObject *newitem)
540
206M
{
541
206M
    if (PyList_Check(op) && (newitem != NULL)) {
542
206M
        int ret;
543
206M
        Py_BEGIN_CRITICAL_SECTION(op);
544
206M
        ret = _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
545
206M
        Py_END_CRITICAL_SECTION();
546
206M
        return ret;
547
206M
    }
548
0
    PyErr_BadInternalCall();
549
0
    return -1;
550
206M
}
551
552
/* Methods */
553
554
static void
555
list_dealloc(PyObject *self)
556
331M
{
557
331M
    PyListObject *op = (PyListObject *)self;
558
331M
    Py_ssize_t i;
559
331M
    PyObject_GC_UnTrack(op);
560
331M
    if (op->ob_item != NULL) {
561
        /* Do it backwards, for Christian Tismer.
562
           There's a simple test case where somehow this reduces
563
           thrashing when a *very* large list is created and
564
           immediately deleted. */
565
143M
        i = Py_SIZE(op);
566
1.82G
        while (--i >= 0) {
567
1.68G
            Py_XDECREF(op->ob_item[i]);
568
1.68G
        }
569
143M
        free_list_items(op->ob_item, false);
570
143M
        op->ob_item = NULL;
571
143M
    }
572
331M
    if (PyList_CheckExact(op)) {
573
321M
        _Py_FREELIST_FREE(lists, op, PyObject_GC_Del);
574
321M
    }
575
10.5M
    else {
576
10.5M
        PyObject_GC_Del(op);
577
10.5M
    }
578
331M
}
579
580
static PyObject *
581
list_repr_impl(PyListObject *v)
582
3.61M
{
583
3.61M
    int res = Py_ReprEnter((PyObject*)v);
584
3.61M
    if (res != 0) {
585
0
        return (res > 0 ? PyUnicode_FromString("[...]") : NULL);
586
0
    }
587
588
    /* "[" + "1" + ", 2" * (len - 1) + "]" */
589
3.61M
    Py_ssize_t prealloc = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1;
590
3.61M
    PyUnicodeWriter *writer = PyUnicodeWriter_Create(prealloc);
591
3.61M
    PyObject *item = NULL;
592
3.61M
    if (writer == NULL) {
593
0
        goto error;
594
0
    }
595
596
3.61M
    if (PyUnicodeWriter_WriteChar(writer, '[') < 0) {
597
0
        goto error;
598
0
    }
599
600
    /* Do repr() on each element.  Note that this may mutate the list,
601
       so must refetch the list size on each iteration. */
602
10.6M
    for (Py_ssize_t i = 0; i < Py_SIZE(v); ++i) {
603
        /* Hold a strong reference since repr(item) can mutate the list */
604
6.99M
        item = Py_NewRef(v->ob_item[i]);
605
606
6.99M
        if (i > 0) {
607
3.37M
            if (PyUnicodeWriter_WriteChar(writer, ',') < 0) {
608
0
                goto error;
609
0
            }
610
3.37M
            if (PyUnicodeWriter_WriteChar(writer, ' ') < 0) {
611
0
                goto error;
612
0
            }
613
3.37M
        }
614
615
6.99M
        if (PyUnicodeWriter_WriteRepr(writer, item) < 0) {
616
0
            goto error;
617
0
        }
618
6.99M
        Py_CLEAR(item);
619
6.99M
    }
620
621
3.61M
    if (PyUnicodeWriter_WriteChar(writer, ']') < 0) {
622
0
        goto error;
623
0
    }
624
625
3.61M
    Py_ReprLeave((PyObject *)v);
626
3.61M
    return PyUnicodeWriter_Finish(writer);
627
628
0
error:
629
0
    Py_XDECREF(item);
630
0
    PyUnicodeWriter_Discard(writer);
631
0
    Py_ReprLeave((PyObject *)v);
632
0
    return NULL;
633
3.61M
}
634
635
static PyObject *
636
list_repr(PyObject *self)
637
3.62M
{
638
3.62M
    if (PyList_GET_SIZE(self) == 0) {
639
4.27k
        return PyUnicode_FromString("[]");
640
4.27k
    }
641
3.61M
    PyListObject *v = (PyListObject *)self;
642
3.61M
    PyObject *ret = NULL;
643
3.61M
    Py_BEGIN_CRITICAL_SECTION(v);
644
3.61M
    ret = list_repr_impl(v);
645
3.61M
    Py_END_CRITICAL_SECTION();
646
3.61M
    return ret;
647
3.62M
}
648
649
static Py_ssize_t
650
list_length(PyObject *a)
651
78.1M
{
652
78.1M
    return PyList_GET_SIZE(a);
653
78.1M
}
654
655
static int
656
list_contains(PyObject *aa, PyObject *el)
657
11.6k
{
658
659
71.1k
    for (Py_ssize_t i = 0; ; i++) {
660
71.1k
        PyObject *item = list_get_item_ref((PyListObject *)aa, i);
661
71.1k
        if (item == NULL) {
662
            // out-of-bounds
663
10.0k
            return 0;
664
10.0k
        }
665
61.0k
        int cmp = PyObject_RichCompareBool(item, el, Py_EQ);
666
61.0k
        Py_DECREF(item);
667
61.0k
        if (cmp != 0) {
668
1.61k
            return cmp;
669
1.61k
        }
670
61.0k
    }
671
0
    return 0;
672
11.6k
}
673
674
static PyObject *
675
list_item(PyObject *aa, Py_ssize_t i)
676
30.4M
{
677
30.4M
    PyListObject *a = (PyListObject *)aa;
678
30.4M
    if (!valid_index(i, PyList_GET_SIZE(a))) {
679
2.29M
        PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
680
2.29M
        return NULL;
681
2.29M
    }
682
28.1M
    PyObject *item;
683
#ifdef Py_GIL_DISABLED
684
    item = list_get_item_ref(a, i);
685
    if (item == NULL) {
686
        PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
687
        return NULL;
688
    }
689
#else
690
28.1M
    item = Py_NewRef(a->ob_item[i]);
691
28.1M
#endif
692
28.1M
    return item;
693
30.4M
}
694
695
static PyObject *
696
list_slice_lock_held(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
697
4.04M
{
698
4.04M
    PyListObject *np;
699
4.04M
    PyObject **src, **dest;
700
4.04M
    Py_ssize_t i, len;
701
4.04M
    len = ihigh - ilow;
702
4.04M
    if (len <= 0) {
703
2.27k
        return PyList_New(0);
704
2.27k
    }
705
4.04M
    np = (PyListObject *) list_new_prealloc(len);
706
4.04M
    if (np == NULL)
707
0
        return NULL;
708
709
4.04M
    src = a->ob_item + ilow;
710
4.04M
    dest = np->ob_item;
711
31.8M
    for (i = 0; i < len; i++) {
712
27.7M
        PyObject *v = src[i];
713
27.7M
        dest[i] = Py_NewRef(v);
714
27.7M
    }
715
4.04M
    Py_SET_SIZE(np, len);
716
4.04M
    return (PyObject *)np;
717
4.04M
}
718
719
PyObject *
720
_PyList_BinarySlice(PyObject *container, PyObject *start, PyObject *stop)
721
144k
{
722
144k
    assert(PyList_CheckExact(container));
723
144k
    Py_ssize_t istart = 0;
724
144k
    Py_ssize_t istop = PY_SSIZE_T_MAX;
725
    /* Unpack the index values before acquiring the lock, since
726
     * _PyEval_SliceIndex may call __index__ which could execute
727
     * arbitrary Python code. */
728
144k
    if (!_PyEval_SliceIndex(start, &istart)) {
729
0
        return NULL;
730
0
    }
731
144k
    if (!_PyEval_SliceIndex(stop, &istop)) {
732
0
        return NULL;
733
0
    }
734
144k
    PyObject *ret;
735
144k
    Py_BEGIN_CRITICAL_SECTION(container);
736
144k
    Py_ssize_t len = Py_SIZE(container);
737
144k
    PySlice_AdjustIndices(len, &istart, &istop, 1);
738
144k
    ret = list_slice_lock_held((PyListObject *)container, istart, istop);
739
144k
    Py_END_CRITICAL_SECTION();
740
144k
    return ret;
741
144k
}
742
743
PyObject *
744
PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
745
0
{
746
0
    if (!PyList_Check(a)) {
747
0
        PyErr_BadInternalCall();
748
0
        return NULL;
749
0
    }
750
0
    PyObject *ret;
751
0
    Py_BEGIN_CRITICAL_SECTION(a);
752
0
    if (ilow < 0) {
753
0
        ilow = 0;
754
0
    }
755
0
    else if (ilow > Py_SIZE(a)) {
756
0
        ilow = Py_SIZE(a);
757
0
    }
758
0
    if (ihigh < ilow) {
759
0
        ihigh = ilow;
760
0
    }
761
0
    else if (ihigh > Py_SIZE(a)) {
762
0
        ihigh = Py_SIZE(a);
763
0
    }
764
0
    ret = list_slice_lock_held((PyListObject *)a, ilow, ihigh);
765
0
    Py_END_CRITICAL_SECTION();
766
0
    return ret;
767
0
}
768
769
static PyObject *
770
list_concat_lock_held(PyListObject *a, PyListObject *b)
771
21.0M
{
772
21.0M
    Py_ssize_t size;
773
21.0M
    Py_ssize_t i;
774
21.0M
    PyObject **src, **dest;
775
21.0M
    PyListObject *np;
776
21.0M
    assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX);
777
21.0M
    size = Py_SIZE(a) + Py_SIZE(b);
778
21.0M
    if (size == 0) {
779
6.91M
        return PyList_New(0);
780
6.91M
    }
781
14.1M
    np = (PyListObject *) list_new_prealloc(size);
782
14.1M
    if (np == NULL) {
783
0
        return NULL;
784
0
    }
785
14.1M
    src = a->ob_item;
786
14.1M
    dest = np->ob_item;
787
420M
    for (i = 0; i < Py_SIZE(a); i++) {
788
406M
        PyObject *v = src[i];
789
406M
        dest[i] = Py_NewRef(v);
790
406M
    }
791
14.1M
    src = b->ob_item;
792
14.1M
    dest = np->ob_item + Py_SIZE(a);
793
324M
    for (i = 0; i < Py_SIZE(b); i++) {
794
310M
        PyObject *v = src[i];
795
310M
        dest[i] = Py_NewRef(v);
796
310M
    }
797
14.1M
    Py_SET_SIZE(np, size);
798
14.1M
    return (PyObject *)np;
799
14.1M
}
800
801
static PyObject *
802
list_concat(PyObject *aa, PyObject *bb)
803
21.0M
{
804
21.0M
    if (!PyList_Check(bb)) {
805
0
        PyErr_Format(PyExc_TypeError,
806
0
                  "can only concatenate list (not \"%.200s\") to list",
807
0
                  Py_TYPE(bb)->tp_name);
808
0
        return NULL;
809
0
    }
810
21.0M
    PyListObject *a = (PyListObject *)aa;
811
21.0M
    PyListObject *b = (PyListObject *)bb;
812
21.0M
    PyObject *ret;
813
21.0M
    Py_BEGIN_CRITICAL_SECTION2(a, b);
814
21.0M
    ret = list_concat_lock_held(a, b);
815
21.0M
    Py_END_CRITICAL_SECTION2();
816
21.0M
    return ret;
817
21.0M
}
818
819
static PyObject *
820
list_repeat_lock_held(PyListObject *a, Py_ssize_t n)
821
18.8k
{
822
18.8k
    const Py_ssize_t input_size = Py_SIZE(a);
823
18.8k
    if (input_size == 0 || n <= 0)
824
1.72k
        return PyList_New(0);
825
18.8k
    assert(n > 0);
826
827
17.0k
    if (input_size > PY_SSIZE_T_MAX / n)
828
0
        return PyErr_NoMemory();
829
17.0k
    Py_ssize_t output_size = input_size * n;
830
831
17.0k
    PyListObject *np = (PyListObject *) list_new_prealloc(output_size);
832
17.0k
    if (np == NULL)
833
0
        return NULL;
834
835
17.0k
    PyObject **dest = np->ob_item;
836
17.0k
    if (input_size == 1) {
837
17.0k
        PyObject *elem = a->ob_item[0];
838
17.0k
        _Py_RefcntAdd(elem, n);
839
17.0k
        PyObject **dest_end = dest + output_size;
840
19.5M
        while (dest < dest_end) {
841
19.4M
            *dest++ = elem;
842
19.4M
        }
843
17.0k
    }
844
0
    else {
845
0
        PyObject **src = a->ob_item;
846
0
        PyObject **src_end = src + input_size;
847
0
        while (src < src_end) {
848
0
            _Py_RefcntAdd(*src, n);
849
0
            *dest++ = *src++;
850
0
        }
851
        // This list is not yet visible to other threads, so atomic repeat
852
        // is not necessary even in Py_GIL_DISABLED builds.
853
0
        _Py_memory_repeat((char *)np->ob_item, sizeof(PyObject *)*output_size,
854
0
                                        sizeof(PyObject *)*input_size);
855
0
    }
856
857
17.0k
    Py_SET_SIZE(np, output_size);
858
17.0k
    return (PyObject *) np;
859
17.0k
}
860
861
static PyObject *
862
list_repeat(PyObject *aa, Py_ssize_t n)
863
18.8k
{
864
18.8k
    PyObject *ret;
865
18.8k
    PyListObject *a = (PyListObject *)aa;
866
18.8k
    Py_BEGIN_CRITICAL_SECTION(a);
867
18.8k
    ret = list_repeat_lock_held(a, n);
868
18.8k
    Py_END_CRITICAL_SECTION();
869
18.8k
    return ret;
870
18.8k
}
871
872
static void
873
list_clear_impl(PyListObject *a, bool is_resize)
874
17.8M
{
875
17.8M
    PyObject **items = a->ob_item;
876
17.8M
    if (items == NULL) {
877
68
        return;
878
68
    }
879
880
    /* Because XDECREF can recursively invoke operations on
881
       this list, we make it empty first. */
882
17.8M
    Py_ssize_t i = Py_SIZE(a);
883
17.8M
    Py_SET_SIZE(a, 0);
884
17.8M
    FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item, NULL);
885
17.8M
    a->allocated = 0;
886
35.7M
    while (--i >= 0) {
887
17.9M
        Py_XDECREF(items[i]);
888
17.9M
    }
889
#ifdef Py_GIL_DISABLED
890
    if (is_resize) {
891
        ensure_shared_on_resize(a);
892
    }
893
    bool use_qsbr = is_resize && _PyObject_GC_IS_SHARED(a);
894
#else
895
17.8M
    bool use_qsbr = false;
896
17.8M
#endif
897
17.8M
    free_list_items(items, use_qsbr);
898
    // Note that there is no guarantee that the list is actually empty
899
    // at this point, because XDECREF may have populated it indirectly again!
900
17.8M
}
901
902
static void
903
list_clear(PyListObject *a)
904
17.8M
{
905
17.8M
    list_clear_impl(a, true);
906
17.8M
}
907
908
static int
909
list_clear_slot(PyObject *self)
910
0
{
911
0
    list_clear_impl((PyListObject *)self, false);
912
0
    return 0;
913
0
}
914
915
// Pointer-by-pointer memmove for PyObject** arrays that is safe
916
// for shared lists in Py_GIL_DISABLED builds.
917
static void
918
ptr_wise_atomic_memmove(PyListObject *a, PyObject **dest, PyObject **src, Py_ssize_t n)
919
15.2M
{
920
15.2M
#ifndef Py_GIL_DISABLED
921
15.2M
    memmove(dest, src, n * sizeof(PyObject *));
922
#else
923
    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(a);
924
    if (_Py_IsOwnedByCurrentThread((PyObject *)a) && !_PyObject_GC_IS_SHARED(a)) {
925
        // No other threads can read this list concurrently
926
        memmove(dest, src, n * sizeof(PyObject *));
927
        return;
928
    }
929
    if (dest < src) {
930
        for (Py_ssize_t i = 0; i != n; i++) {
931
            _Py_atomic_store_ptr_release(&dest[i], src[i]);
932
        }
933
    }
934
    else {
935
        // copy backwards to avoid overwriting src before it's read
936
        for (Py_ssize_t i = n; i != 0; i--) {
937
            _Py_atomic_store_ptr_release(&dest[i - 1], src[i - 1]);
938
        }
939
    }
940
#endif
941
15.2M
}
942
943
/* a[ilow:ihigh] = v if v != NULL.
944
 * del a[ilow:ihigh] if v == NULL.
945
 *
946
 * Special speed gimmick:  when v is NULL and ihigh - ilow <= 8, it's
947
 * guaranteed the call cannot fail.
948
 */
949
static int
950
list_ass_slice_lock_held(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
951
4.15M
{
952
    /* Because [X]DECREF can recursively invoke list operations on
953
       this list, we must postpone all [X]DECREF activity until
954
       after the list is back in its canonical shape.  Therefore
955
       we must allocate an additional array, 'recycle', into which
956
       we temporarily copy the items that are deleted from the
957
       list. :-( */
958
4.15M
    PyObject *recycle_on_stack[8];
959
4.15M
    PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
960
4.15M
    PyObject **item;
961
4.15M
    PyObject **vitem = NULL;
962
4.15M
    PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
963
4.15M
    Py_ssize_t n; /* # of elements in replacement list */
964
4.15M
    Py_ssize_t norig; /* # of elements in list getting replaced */
965
4.15M
    Py_ssize_t d; /* Change in size */
966
4.15M
    Py_ssize_t k;
967
4.15M
    size_t s;
968
4.15M
    int result = -1;            /* guilty until proved innocent */
969
4.15M
#define b ((PyListObject *)v)
970
4.15M
    if (v == NULL)
971
3.74M
        n = 0;
972
409k
    else {
973
409k
        v_as_SF = PySequence_Fast(v, "can only assign an iterable");
974
409k
        if(v_as_SF == NULL)
975
0
            goto Error;
976
409k
        n = PySequence_Fast_GET_SIZE(v_as_SF);
977
409k
        vitem = PySequence_Fast_ITEMS(v_as_SF);
978
409k
    }
979
4.15M
    if (ilow < 0)
980
0
        ilow = 0;
981
4.15M
    else if (ilow > Py_SIZE(a))
982
157k
        ilow = Py_SIZE(a);
983
984
4.15M
    if (ihigh < ilow)
985
0
        ihigh = ilow;
986
4.15M
    else if (ihigh > Py_SIZE(a))
987
157k
        ihigh = Py_SIZE(a);
988
989
4.15M
    norig = ihigh - ilow;
990
4.15M
    assert(norig >= 0);
991
4.15M
    d = n - norig;
992
4.15M
    if (Py_SIZE(a) + d == 0) {
993
657k
        Py_XDECREF(v_as_SF);
994
657k
        list_clear(a);
995
657k
        return 0;
996
657k
    }
997
3.49M
    item = a->ob_item;
998
    /* recycle the items that we are about to remove */
999
3.49M
    s = norig * sizeof(PyObject *);
1000
    /* If norig == 0, item might be NULL, in which case we may not memcpy from it. */
1001
3.49M
    if (s) {
1002
3.11M
        if (s > sizeof(recycle_on_stack)) {
1003
81
            recycle = (PyObject **)PyMem_Malloc(s);
1004
81
            if (recycle == NULL) {
1005
0
                PyErr_NoMemory();
1006
0
                goto Error;
1007
0
            }
1008
81
        }
1009
3.11M
        memcpy(recycle, &item[ilow], s);
1010
3.11M
    }
1011
1012
3.49M
    if (d < 0) { /* Delete -d items */
1013
3.10M
        Py_ssize_t tail = Py_SIZE(a) - ihigh;
1014
3.10M
        ptr_wise_atomic_memmove(a, &item[ihigh+d], &item[ihigh], tail);
1015
3.10M
        (void)list_resize(a, Py_SIZE(a) + d); // NB: shrinking a list can't fail
1016
3.10M
        item = a->ob_item;
1017
3.10M
    }
1018
385k
    else if (d > 0) { /* Insert d items */
1019
379k
        k = Py_SIZE(a);
1020
379k
        if (list_resize(a, k+d) < 0)
1021
0
            goto Error;
1022
379k
        item = a->ob_item;
1023
379k
        ptr_wise_atomic_memmove(a, &item[ihigh+d], &item[ihigh], k - ihigh);
1024
379k
    }
1025
18.4M
    for (k = 0; k < n; k++, ilow++) {
1026
14.9M
        PyObject *w = vitem[k];
1027
14.9M
        FT_ATOMIC_STORE_PTR_RELEASE(item[ilow], Py_XNewRef(w));
1028
14.9M
    }
1029
6.61M
    for (k = norig - 1; k >= 0; --k)
1030
3.12M
        Py_XDECREF(recycle[k]);
1031
3.49M
    result = 0;
1032
3.49M
 Error:
1033
3.49M
    if (recycle != recycle_on_stack)
1034
81
        PyMem_Free(recycle);
1035
3.49M
    Py_XDECREF(v_as_SF);
1036
3.49M
    return result;
1037
3.49M
#undef b
1038
3.49M
}
1039
1040
static int
1041
list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1042
3.88M
{
1043
3.88M
    int ret;
1044
3.88M
    if (a == (PyListObject *)v) {
1045
0
        Py_BEGIN_CRITICAL_SECTION(a);
1046
0
        Py_ssize_t n = PyList_GET_SIZE(a);
1047
0
        PyObject *copy = list_slice_lock_held(a, 0, n);
1048
0
        if (copy == NULL) {
1049
0
            ret = -1;
1050
0
        }
1051
0
        else {
1052
0
            ret = list_ass_slice_lock_held(a, ilow, ihigh, copy);
1053
0
            Py_DECREF(copy);
1054
0
        }
1055
0
        Py_END_CRITICAL_SECTION();
1056
0
    }
1057
3.88M
    else if (v != NULL && PyList_CheckExact(v)) {
1058
30.6k
        Py_BEGIN_CRITICAL_SECTION2(a, v);
1059
30.6k
        ret = list_ass_slice_lock_held(a, ilow, ihigh, v);
1060
30.6k
        Py_END_CRITICAL_SECTION2();
1061
30.6k
    }
1062
3.85M
    else {
1063
3.85M
        Py_BEGIN_CRITICAL_SECTION(a);
1064
3.85M
        ret = list_ass_slice_lock_held(a, ilow, ihigh, v);
1065
3.85M
        Py_END_CRITICAL_SECTION();
1066
3.85M
    }
1067
3.88M
    return ret;
1068
3.88M
}
1069
1070
int
1071
PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1072
3.88M
{
1073
3.88M
    if (!PyList_Check(a)) {
1074
0
        PyErr_BadInternalCall();
1075
0
        return -1;
1076
0
    }
1077
3.88M
    return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
1078
3.88M
}
1079
1080
static int
1081
list_inplace_repeat_lock_held(PyListObject *self, Py_ssize_t n)
1082
0
{
1083
0
    Py_ssize_t input_size = PyList_GET_SIZE(self);
1084
0
    if (input_size == 0 || n == 1) {
1085
0
        return 0;
1086
0
    }
1087
1088
0
    if (n < 1) {
1089
0
        list_clear(self);
1090
0
        return 0;
1091
0
    }
1092
1093
0
    if (input_size > PY_SSIZE_T_MAX / n) {
1094
0
        PyErr_NoMemory();
1095
0
        return -1;
1096
0
    }
1097
0
    Py_ssize_t output_size = input_size * n;
1098
1099
0
    if (list_resize(self, output_size) < 0) {
1100
0
        return -1;
1101
0
    }
1102
1103
0
    PyObject **items = self->ob_item;
1104
0
    for (Py_ssize_t j = 0; j < input_size; j++) {
1105
0
        _Py_RefcntAdd(items[j], n-1);
1106
0
    }
1107
0
#ifndef Py_GIL_DISABLED
1108
0
    _Py_memory_repeat((char *)items, sizeof(PyObject *)*output_size,
1109
0
                      sizeof(PyObject *)*input_size);
1110
#else
1111
    Py_ssize_t copied = input_size;
1112
    while (copied < output_size) {
1113
        Py_ssize_t items_to_copy = Py_MIN(copied, output_size - copied);
1114
        ptr_wise_atomic_memmove(self, items + copied, items, items_to_copy);
1115
        copied += items_to_copy;
1116
    }
1117
#endif
1118
0
    return 0;
1119
0
}
1120
1121
static PyObject *
1122
list_inplace_repeat(PyObject *_self, Py_ssize_t n)
1123
0
{
1124
0
    PyObject *ret;
1125
0
    PyListObject *self = (PyListObject *) _self;
1126
0
    Py_BEGIN_CRITICAL_SECTION(self);
1127
0
    if (list_inplace_repeat_lock_held(self, n) < 0) {
1128
0
        ret = NULL;
1129
0
    }
1130
0
    else {
1131
0
        ret = Py_NewRef(self);
1132
0
    }
1133
0
    Py_END_CRITICAL_SECTION();
1134
0
    return ret;
1135
0
}
1136
1137
static int
1138
list_ass_item_lock_held(PyListObject *a, Py_ssize_t i, PyObject *v)
1139
4.00M
{
1140
4.00M
    if (!valid_index(i, Py_SIZE(a))) {
1141
0
        PyErr_SetString(PyExc_IndexError,
1142
0
                        "list assignment index out of range");
1143
0
        return -1;
1144
0
    }
1145
4.00M
    PyObject *tmp = a->ob_item[i];
1146
4.00M
    if (v == NULL) {
1147
8.95k
        Py_ssize_t size = Py_SIZE(a);
1148
937k
        for (Py_ssize_t idx = i; idx < size - 1; idx++) {
1149
928k
            FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item[idx], a->ob_item[idx + 1]);
1150
928k
        }
1151
8.95k
        Py_SET_SIZE(a, size - 1);
1152
8.95k
    }
1153
3.99M
    else {
1154
3.99M
        FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item[i], Py_NewRef(v));
1155
3.99M
    }
1156
4.00M
    Py_DECREF(tmp);
1157
4.00M
    return 0;
1158
4.00M
}
1159
1160
static int
1161
list_ass_item(PyObject *aa, Py_ssize_t i, PyObject *v)
1162
4.61k
{
1163
4.61k
    int ret;
1164
4.61k
    PyListObject *a = (PyListObject *)aa;
1165
4.61k
    Py_BEGIN_CRITICAL_SECTION(a);
1166
4.61k
    ret = list_ass_item_lock_held(a, i, v);
1167
4.61k
    Py_END_CRITICAL_SECTION();
1168
4.61k
    return ret;
1169
4.61k
}
1170
1171
/*[clinic input]
1172
@critical_section
1173
list.insert
1174
1175
    index: Py_ssize_t
1176
    object: object
1177
    /
1178
1179
Insert object before index.
1180
[clinic start generated code]*/
1181
1182
static PyObject *
1183
list_insert_impl(PyListObject *self, Py_ssize_t index, PyObject *object)
1184
/*[clinic end generated code: output=7f35e32f60c8cb78 input=b1987ca998a4ae2d]*/
1185
1.88k
{
1186
1.88k
    if (ins1(self, index, object) == 0) {
1187
1.88k
        Py_RETURN_NONE;
1188
1.88k
    }
1189
0
    return NULL;
1190
1.88k
}
1191
1192
/*[clinic input]
1193
@critical_section
1194
list.clear as py_list_clear
1195
1196
Remove all items from list.
1197
[clinic start generated code]*/
1198
1199
static PyObject *
1200
py_list_clear_impl(PyListObject *self)
1201
/*[clinic end generated code: output=83726743807e3518 input=e285b7f09051a9ba]*/
1202
151
{
1203
151
    list_clear(self);
1204
151
    Py_RETURN_NONE;
1205
151
}
1206
1207
/*[clinic input]
1208
@critical_section
1209
list.copy
1210
1211
Return a shallow copy of the list.
1212
[clinic start generated code]*/
1213
1214
static PyObject *
1215
list_copy_impl(PyListObject *self)
1216
/*[clinic end generated code: output=ec6b72d6209d418e input=81c54b0c7bb4f73d]*/
1217
0
{
1218
0
    return list_slice_lock_held(self, 0, Py_SIZE(self));
1219
0
}
1220
1221
/*[clinic input]
1222
@critical_section
1223
list.append
1224
1225
     object: object
1226
     /
1227
1228
Append object to the end of the list.
1229
[clinic start generated code]*/
1230
1231
static PyObject *
1232
list_append_impl(PyListObject *self, PyObject *object)
1233
/*[clinic end generated code: output=78423561d92ed405 input=122b0853de54004f]*/
1234
128M
{
1235
128M
    if (_PyList_AppendTakeRef(self, Py_NewRef(object)) < 0) {
1236
0
        return NULL;
1237
0
    }
1238
128M
    Py_RETURN_NONE;
1239
128M
}
1240
1241
static int
1242
list_extend_fast(PyListObject *self, PyObject *iterable)
1243
25.1M
{
1244
25.1M
    Py_ssize_t n = PySequence_Fast_GET_SIZE(iterable);
1245
25.1M
    if (n == 0) {
1246
        /* short circuit when iterable is empty */
1247
8.83M
        return 0;
1248
8.83M
    }
1249
1250
16.2M
    Py_ssize_t m = Py_SIZE(self);
1251
    // It should not be possible to allocate a list large enough to cause
1252
    // an overflow on any relevant platform.
1253
16.2M
    assert(m < PY_SSIZE_T_MAX - n);
1254
16.2M
    if (self->ob_item == NULL) {
1255
1.38M
        if (list_preallocate_exact(self, n) < 0) {
1256
0
            return -1;
1257
0
        }
1258
1.38M
        Py_SET_SIZE(self, n);
1259
1.38M
    }
1260
14.8M
    else if (list_resize(self, m + n) < 0) {
1261
0
        return -1;
1262
0
    }
1263
1264
    // note that we may still have self == iterable here for the
1265
    // situation a.extend(a), but the following code works
1266
    // in that case too.  Just make sure to resize self
1267
    // before calling PySequence_Fast_ITEMS.
1268
    //
1269
    // populate the end of self with iterable's items.
1270
16.2M
    PyObject **src = PySequence_Fast_ITEMS(iterable);
1271
16.2M
    PyObject **dest = self->ob_item + m;
1272
76.0M
    for (Py_ssize_t i = 0; i < n; i++) {
1273
59.7M
        PyObject *o = src[i];
1274
59.7M
        FT_ATOMIC_STORE_PTR_RELEASE(dest[i], Py_NewRef(o));
1275
59.7M
    }
1276
16.2M
    return 0;
1277
16.2M
}
1278
1279
static int
1280
list_extend_iter_lock_held(PyListObject *self, PyObject *iterable)
1281
5.95M
{
1282
5.95M
    PyObject *it = PyObject_GetIter(iterable);
1283
5.95M
    if (it == NULL) {
1284
0
        return -1;
1285
0
    }
1286
5.95M
    PyObject *(*iternext)(PyObject *) = *Py_TYPE(it)->tp_iternext;
1287
1288
    /* Guess a result list size. */
1289
5.95M
    Py_ssize_t n = PyObject_LengthHint(iterable, 8);
1290
5.95M
    if (n < 0) {
1291
0
        Py_DECREF(it);
1292
0
        return -1;
1293
0
    }
1294
1295
5.95M
    Py_ssize_t m = Py_SIZE(self);
1296
5.95M
    if (m > PY_SSIZE_T_MAX - n) {
1297
        /* m + n overflowed; on the chance that n lied, and there really
1298
         * is enough room, ignore it.  If n was telling the truth, we'll
1299
         * eventually run out of memory during the loop.
1300
         */
1301
0
    }
1302
5.95M
    else if (self->ob_item == NULL) {
1303
5.66M
        if (n && list_preallocate_exact(self, n) < 0)
1304
0
            goto error;
1305
5.66M
    }
1306
287k
    else {
1307
        /* Make room. */
1308
287k
        if (list_resize(self, m + n) < 0) {
1309
0
            goto error;
1310
0
        }
1311
1312
        /* Make the list sane again. */
1313
287k
        Py_SET_SIZE(self, m);
1314
287k
    }
1315
1316
    /* Run iterator to exhaustion. */
1317
84.6M
    for (;;) {
1318
84.6M
        PyObject *item = iternext(it);
1319
84.6M
        if (item == NULL) {
1320
5.95M
            if (PyErr_Occurred()) {
1321
614
                if (PyErr_ExceptionMatches(PyExc_StopIteration))
1322
0
                    PyErr_Clear();
1323
614
                else
1324
614
                    goto error;
1325
614
            }
1326
5.95M
            break;
1327
5.95M
        }
1328
1329
78.6M
        if (Py_SIZE(self) < self->allocated) {
1330
77.5M
            Py_ssize_t len = Py_SIZE(self);
1331
77.5M
            FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[len], item);  // steals item ref
1332
77.5M
            Py_SET_SIZE(self, len + 1);
1333
77.5M
        }
1334
1.08M
        else {
1335
1.08M
            if (_PyList_AppendTakeRef(self, item) < 0)
1336
0
                goto error;
1337
1.08M
        }
1338
78.6M
    }
1339
1340
    /* Cut back result list if initial guess was too large. */
1341
5.95M
    if (Py_SIZE(self) < self->allocated) {
1342
4.33M
        if (list_resize(self, Py_SIZE(self)) < 0)
1343
0
            goto error;
1344
4.33M
    }
1345
1346
5.95M
    Py_DECREF(it);
1347
5.95M
    return 0;
1348
1349
614
  error:
1350
614
    Py_DECREF(it);
1351
614
    return -1;
1352
5.95M
}
1353
1354
static int
1355
list_extend_lock_held(PyListObject *self, PyObject *iterable)
1356
25.1M
{
1357
25.1M
    PyObject *seq = PySequence_Fast(iterable, "argument must be iterable");
1358
25.1M
    if (!seq) {
1359
0
        return -1;
1360
0
    }
1361
1362
25.1M
    int res = list_extend_fast(self, seq);
1363
25.1M
    Py_DECREF(seq);
1364
25.1M
    return res;
1365
25.1M
}
1366
1367
static int
1368
list_extend_set(PyListObject *self, PySetObject *other)
1369
17.1k
{
1370
17.1k
    Py_ssize_t m = Py_SIZE(self);
1371
17.1k
    Py_ssize_t n = PySet_GET_SIZE(other);
1372
17.1k
    Py_ssize_t r = m + n;
1373
17.1k
    if (r == 0) {
1374
640
        return 0;
1375
640
    }
1376
16.4k
    if (list_resize(self, r) < 0) {
1377
0
        return -1;
1378
0
    }
1379
1380
16.4k
    assert(self->ob_item != NULL);
1381
    /* populate the end of self with iterable's items */
1382
16.4k
    Py_ssize_t setpos = 0;
1383
16.4k
    Py_hash_t hash;
1384
16.4k
    PyObject *key;
1385
16.4k
    PyObject **dest = self->ob_item + m;
1386
107k
    while (_PySet_NextEntryRef((PyObject *)other, &setpos, &key, &hash)) {
1387
90.7k
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, key);
1388
90.7k
        dest++;
1389
90.7k
    }
1390
16.4k
    Py_SET_SIZE(self, r);
1391
16.4k
    return 0;
1392
16.4k
}
1393
1394
static int
1395
list_extend_dict(PyListObject *self, PyDictObject *dict, int which_item)
1396
3.00M
{
1397
    // which_item: 0 for keys and 1 for values
1398
3.00M
    Py_ssize_t m = Py_SIZE(self);
1399
3.00M
    Py_ssize_t n = PyDict_GET_SIZE(dict);
1400
3.00M
    Py_ssize_t r = m + n;
1401
3.00M
    if (r == 0) {
1402
0
        return 0;
1403
0
    }
1404
3.00M
    if (list_resize(self, r) < 0) {
1405
0
        return -1;
1406
0
    }
1407
1408
3.00M
    assert(self->ob_item != NULL);
1409
3.00M
    PyObject **dest = self->ob_item + m;
1410
3.00M
    Py_ssize_t pos = 0;
1411
3.00M
    PyObject *keyvalue[2];
1412
7.00M
    while (_PyDict_Next((PyObject *)dict, &pos, &keyvalue[0], &keyvalue[1], NULL)) {
1413
4.00M
        PyObject *obj = keyvalue[which_item];
1414
4.00M
        Py_INCREF(obj);
1415
4.00M
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, obj);
1416
4.00M
        dest++;
1417
4.00M
    }
1418
1419
3.00M
    Py_SET_SIZE(self, r);
1420
3.00M
    return 0;
1421
3.00M
}
1422
1423
static int
1424
list_extend_dictitems(PyListObject *self, PyDictObject *dict)
1425
6
{
1426
6
    Py_ssize_t m = Py_SIZE(self);
1427
6
    Py_ssize_t n = PyDict_GET_SIZE(dict);
1428
6
    Py_ssize_t r = m + n;
1429
6
    if (r == 0) {
1430
0
        return 0;
1431
0
    }
1432
6
    if (list_resize(self, r) < 0) {
1433
0
        return -1;
1434
0
    }
1435
1436
6
    assert(self->ob_item != NULL);
1437
6
    PyObject **dest = self->ob_item + m;
1438
6
    Py_ssize_t pos = 0;
1439
6
    Py_ssize_t i = 0;
1440
6
    PyObject *key_value[2];
1441
543
    while (_PyDict_Next((PyObject *)dict, &pos, &key_value[0], &key_value[1], NULL)) {
1442
537
        PyObject *item = PyTuple_FromArray(key_value, 2);
1443
537
        if (item == NULL) {
1444
0
            Py_SET_SIZE(self, m + i);
1445
0
            return -1;
1446
0
        }
1447
537
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, item);
1448
537
        dest++;
1449
537
        i++;
1450
537
    }
1451
1452
6
    Py_SET_SIZE(self, r);
1453
6
    return 0;
1454
6
}
1455
1456
static int
1457
_list_extend(PyListObject *self, PyObject *iterable)
1458
34.0M
{
1459
    // Special case:
1460
    // lists and tuples which can use PySequence_Fast ops
1461
34.0M
    int res = -1;
1462
34.0M
    if ((PyObject *)self == iterable) {
1463
0
        Py_BEGIN_CRITICAL_SECTION(self);
1464
0
        res = list_inplace_repeat_lock_held(self, 2);
1465
0
        Py_END_CRITICAL_SECTION();
1466
0
    }
1467
34.0M
    else if (PyList_CheckExact(iterable)) {
1468
10.1M
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1469
10.1M
        res = list_extend_lock_held(self, iterable);
1470
10.1M
        Py_END_CRITICAL_SECTION2();
1471
10.1M
    }
1472
23.8M
    else if (PyTuple_CheckExact(iterable)) {
1473
14.9M
        Py_BEGIN_CRITICAL_SECTION(self);
1474
14.9M
        res = list_extend_lock_held(self, iterable);
1475
14.9M
        Py_END_CRITICAL_SECTION();
1476
14.9M
    }
1477
8.96M
    else if (PyAnySet_CheckExact(iterable)) {
1478
17.1k
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1479
17.1k
        res = list_extend_set(self, (PySetObject *)iterable);
1480
17.1k
        Py_END_CRITICAL_SECTION2();
1481
17.1k
    }
1482
8.95M
    else if (PyDict_CheckExact(iterable)) {
1483
2.99M
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1484
2.99M
        res = list_extend_dict(self, (PyDictObject *)iterable, 0 /*keys*/);
1485
2.99M
        Py_END_CRITICAL_SECTION2();
1486
2.99M
    }
1487
5.95M
    else if (Py_IS_TYPE(iterable, &PyDictKeys_Type)) {
1488
3.56k
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1489
3.56k
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1490
3.56k
        res = list_extend_dict(self, dict, 0 /*keys*/);
1491
3.56k
        Py_END_CRITICAL_SECTION2();
1492
3.56k
    }
1493
5.95M
    else if (Py_IS_TYPE(iterable, &PyDictValues_Type)) {
1494
8
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1495
8
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1496
8
        res = list_extend_dict(self, dict, 1 /*values*/);
1497
8
        Py_END_CRITICAL_SECTION2();
1498
8
    }
1499
5.95M
    else if (Py_IS_TYPE(iterable, &PyDictItems_Type)) {
1500
6
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1501
6
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1502
6
        res = list_extend_dictitems(self, dict);
1503
6
        Py_END_CRITICAL_SECTION2();
1504
6
    }
1505
5.95M
    else {
1506
5.95M
        Py_BEGIN_CRITICAL_SECTION(self);
1507
5.95M
        res = list_extend_iter_lock_held(self, iterable);
1508
5.95M
        Py_END_CRITICAL_SECTION();
1509
5.95M
    }
1510
34.0M
    return res;
1511
34.0M
}
1512
1513
/*[clinic input]
1514
list.extend as list_extend
1515
1516
     iterable: object
1517
     /
1518
1519
Extend list by appending elements from the iterable.
1520
[clinic start generated code]*/
1521
1522
static PyObject *
1523
list_extend_impl(PyListObject *self, PyObject *iterable)
1524
/*[clinic end generated code: output=b0eba9e0b186d5ce input=979da7597a515791]*/
1525
23.9M
{
1526
23.9M
    if (_list_extend(self, iterable) < 0) {
1527
614
        return NULL;
1528
614
    }
1529
23.9M
    Py_RETURN_NONE;
1530
23.9M
}
1531
1532
PyObject *
1533
_PyList_Extend(PyListObject *self, PyObject *iterable)
1534
22.7M
{
1535
22.7M
    return list_extend((PyObject*)self, iterable);
1536
22.7M
}
1537
1538
int
1539
PyList_Extend(PyObject *self, PyObject *iterable)
1540
0
{
1541
0
    if (!PyList_Check(self)) {
1542
0
        PyErr_BadInternalCall();
1543
0
        return -1;
1544
0
    }
1545
0
    return _list_extend((PyListObject*)self, iterable);
1546
0
}
1547
1548
1549
int
1550
PyList_Clear(PyObject *self)
1551
0
{
1552
0
    if (!PyList_Check(self)) {
1553
0
        PyErr_BadInternalCall();
1554
0
        return -1;
1555
0
    }
1556
0
    Py_BEGIN_CRITICAL_SECTION(self);
1557
0
    list_clear((PyListObject*)self);
1558
0
    Py_END_CRITICAL_SECTION();
1559
0
    return 0;
1560
0
}
1561
1562
1563
static PyObject *
1564
list_inplace_concat(PyObject *_self, PyObject *other)
1565
111k
{
1566
111k
    PyListObject *self = (PyListObject *)_self;
1567
111k
    if (_list_extend(self, other) < 0) {
1568
0
        return NULL;
1569
0
    }
1570
111k
    return Py_NewRef(self);
1571
111k
}
1572
1573
/*[clinic input]
1574
@critical_section
1575
list.pop
1576
1577
    index: Py_ssize_t = -1
1578
    /
1579
1580
Remove and return item at index (default last).
1581
1582
Raises IndexError if list is empty or index is out of range.
1583
[clinic start generated code]*/
1584
1585
static PyObject *
1586
list_pop_impl(PyListObject *self, Py_ssize_t index)
1587
/*[clinic end generated code: output=6bd69dcb3f17eca8 input=c269141068ae4b8f]*/
1588
44.1M
{
1589
44.1M
    PyObject *v;
1590
1591
44.1M
    if (Py_SIZE(self) == 0) {
1592
        /* Special-case most common failure cause */
1593
0
        PyErr_SetString(PyExc_IndexError, "pop from empty list");
1594
0
        return NULL;
1595
0
    }
1596
44.1M
    if (index < 0)
1597
25.0M
        index += Py_SIZE(self);
1598
44.1M
    if (!valid_index(index, Py_SIZE(self))) {
1599
0
        PyErr_SetString(PyExc_IndexError, "pop index out of range");
1600
0
        return NULL;
1601
0
    }
1602
1603
44.1M
    PyObject **items = self->ob_item;
1604
44.1M
    v = items[index];
1605
44.1M
    if (Py_SIZE(self) == 1) {
1606
17.1M
        Py_INCREF(v);
1607
17.1M
        list_clear(self);
1608
17.1M
        return v;
1609
17.1M
    }
1610
26.9M
    Py_ssize_t size_after_pop = Py_SIZE(self) - 1;
1611
26.9M
    if (index < size_after_pop) {
1612
11.8M
        ptr_wise_atomic_memmove(self, &items[index], &items[index+1],
1613
11.8M
                                size_after_pop - index);
1614
11.8M
    }
1615
26.9M
    list_resize(self, size_after_pop);  // NB: shrinking a list can't fail
1616
26.9M
    return v;
1617
44.1M
}
1618
1619
/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
1620
static void
1621
reverse_slice(PyObject **lo, PyObject **hi)
1622
124k
{
1623
124k
    assert(lo && hi);
1624
1625
124k
    --hi;
1626
3.84M
    while (lo < hi) {
1627
3.71M
        PyObject *t = *lo;
1628
3.71M
        FT_ATOMIC_STORE_PTR_RELEASE(*lo, *hi);
1629
3.71M
        FT_ATOMIC_STORE_PTR_RELEASE(*hi, t);
1630
3.71M
        ++lo;
1631
3.71M
        --hi;
1632
3.71M
    }
1633
124k
}
1634
1635
/* Lots of code for an adaptive, stable, natural mergesort.  There are many
1636
 * pieces to this algorithm; read listsort.txt for overviews and details.
1637
 */
1638
1639
/* A sortslice contains a pointer to an array of keys and a pointer to
1640
 * an array of corresponding values.  In other words, keys[i]
1641
 * corresponds with values[i].  If values == NULL, then the keys are
1642
 * also the values.
1643
 *
1644
 * Several convenience routines are provided here, so that keys and
1645
 * values are always moved in sync.
1646
 */
1647
1648
typedef struct {
1649
    PyObject **keys;
1650
    PyObject **values;
1651
} sortslice;
1652
1653
Py_LOCAL_INLINE(void)
1654
sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
1655
39.9k
{
1656
39.9k
    s1->keys[i] = s2->keys[j];
1657
39.9k
    if (s1->values != NULL)
1658
32.7k
        s1->values[i] = s2->values[j];
1659
39.9k
}
1660
1661
Py_LOCAL_INLINE(void)
1662
sortslice_copy_incr(sortslice *dst, sortslice *src)
1663
1.21M
{
1664
1.21M
    *dst->keys++ = *src->keys++;
1665
1.21M
    if (dst->values != NULL)
1666
447k
        *dst->values++ = *src->values++;
1667
1.21M
}
1668
1669
Py_LOCAL_INLINE(void)
1670
sortslice_copy_decr(sortslice *dst, sortslice *src)
1671
2.74M
{
1672
2.74M
    *dst->keys-- = *src->keys--;
1673
2.74M
    if (dst->values != NULL)
1674
444k
        *dst->values-- = *src->values--;
1675
2.74M
}
1676
1677
1678
Py_LOCAL_INLINE(void)
1679
sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
1680
                 Py_ssize_t n)
1681
210k
{
1682
210k
    memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1683
210k
    if (s1->values != NULL)
1684
161k
        memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1685
210k
}
1686
1687
Py_LOCAL_INLINE(void)
1688
sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
1689
                  Py_ssize_t n)
1690
150k
{
1691
150k
    memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1692
150k
    if (s1->values != NULL)
1693
110k
        memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1694
150k
}
1695
1696
Py_LOCAL_INLINE(void)
1697
sortslice_advance(sortslice *slice, Py_ssize_t n)
1698
924k
{
1699
924k
    slice->keys += n;
1700
924k
    if (slice->values != NULL)
1701
600k
        slice->values += n;
1702
924k
}
1703
1704
/* Comparison function: ms->key_compare, which is set at run-time in
1705
 * listsort_impl to optimize for various special cases.
1706
 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1707
 */
1708
1709
23.6M
#define ISLT(X, Y) (*(ms->key_compare))(X, Y, ms)
1710
1711
/* Compare X to Y via "<".  Goto "fail" if the comparison raises an
1712
   error.  Else "k" is set to true iff X<Y, and an "if (k)" block is
1713
   started.  It makes more sense in context <wink>.  X and Y are PyObject*s.
1714
*/
1715
19.9M
#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail;  \
1716
19.9M
           if (k)
1717
1718
/* The maximum number of entries in a MergeState's pending-runs stack.
1719
 * For a list with n elements, this needs at most floor(log2(n)) + 1 entries
1720
 * even if we didn't force runs to a minimal length.  So the number of bits
1721
 * in a Py_ssize_t is plenty large enough for all cases.
1722
 */
1723
#define MAX_MERGE_PENDING (SIZEOF_SIZE_T * 8)
1724
1725
/* When we get into galloping mode, we stay there until both runs win less
1726
 * often than MIN_GALLOP consecutive times.  See listsort.txt for more info.
1727
 */
1728
3.55M
#define MIN_GALLOP 7
1729
1730
/* Avoid malloc for small temp arrays. */
1731
4.56M
#define MERGESTATE_TEMP_SIZE 256
1732
1733
/* The largest value of minrun. This must be a power of 2, and >= 1 */
1734
3.31M
#define MAX_MINRUN 64
1735
#if ((MAX_MINRUN) < 1) || ((MAX_MINRUN) & ((MAX_MINRUN) - 1))
1736
#error "MAX_MINRUN must be a power of 2, and >= 1"
1737
#endif
1738
1739
/* One MergeState exists on the stack per invocation of mergesort.  It's just
1740
 * a convenient way to pass state around among the helper functions.
1741
 */
1742
struct s_slice {
1743
    sortslice base;
1744
    Py_ssize_t len;   /* length of run */
1745
    int power; /* node "level" for powersort merge strategy */
1746
};
1747
1748
typedef struct s_MergeState MergeState;
1749
struct s_MergeState {
1750
    /* This controls when we get *into* galloping mode.  It's initialized
1751
     * to MIN_GALLOP.  merge_lo and merge_hi tend to nudge it higher for
1752
     * random data, and lower for highly structured data.
1753
     */
1754
    Py_ssize_t min_gallop;
1755
1756
    Py_ssize_t listlen;     /* len(input_list) - read only */
1757
    PyObject **basekeys;    /* base address of keys array - read only */
1758
1759
    /* 'a' is temp storage to help with merges.  It contains room for
1760
     * alloced entries.
1761
     */
1762
    sortslice a;        /* may point to temparray below */
1763
    Py_ssize_t alloced;
1764
1765
    /* A stack of n pending runs yet to be merged.  Run #i starts at
1766
     * address base[i] and extends for len[i] elements.  It's always
1767
     * true (so long as the indices are in bounds) that
1768
     *
1769
     *     pending[i].base + pending[i].len == pending[i+1].base
1770
     *
1771
     * so we could cut the storage for this, but it's a minor amount,
1772
     * and keeping all the info explicit simplifies the code.
1773
     */
1774
    int n;
1775
    struct s_slice pending[MAX_MERGE_PENDING];
1776
1777
    /* 'a' points to this when possible, rather than muck with malloc. */
1778
    PyObject *temparray[MERGESTATE_TEMP_SIZE];
1779
1780
    /* This is the function we will use to compare two keys,
1781
     * even when none of our special cases apply and we have to use
1782
     * safe_object_compare. */
1783
    int (*key_compare)(PyObject *, PyObject *, MergeState *);
1784
1785
    /* This function is used by unsafe_object_compare to optimize comparisons
1786
     * when we know our list is type-homogeneous but we can't assume anything else.
1787
     * In the pre-sort check it is set equal to Py_TYPE(key)->tp_richcompare */
1788
    PyObject *(*key_richcompare)(PyObject *, PyObject *, int);
1789
1790
    /* This function is used by unsafe_tuple_compare to compare the first elements
1791
     * of tuples. It may be set to safe_object_compare, but the idea is that hopefully
1792
     * we can assume more, and use one of the special-case compares. */
1793
    int (*tuple_elem_compare)(PyObject *, PyObject *, MergeState *);
1794
1795
    /* Varisbles used for minrun computation. The "ideal" minrun length is
1796
     * the infinite precision listlen / 2**e. See listsort.txt.
1797
     */
1798
     Py_ssize_t mr_current, mr_e, mr_mask;
1799
};
1800
1801
/* binarysort is the best method for sorting small arrays: it does few
1802
   compares, but can do data movement quadratic in the number of elements.
1803
   ss->keys is viewed as an array of n kays, a[:n]. a[:ok] is already sorted.
1804
   Pass ok = 0 (or 1) if you don't know.
1805
   It's sorted in-place, by a stable binary insertion sort. If ss->values
1806
   isn't NULL, it's permuted in lockstap with ss->keys.
1807
   On entry, must have n >= 1, and 0 <= ok <= n <= MAX_MINRUN.
1808
   Return -1 if comparison raises an exception, else 0.
1809
   Even in case of error, the output slice will be some permutation of
1810
   the input (nothing is lost or duplicated).
1811
*/
1812
static int
1813
binarysort(MergeState *ms, const sortslice *ss, Py_ssize_t n, Py_ssize_t ok)
1814
201k
{
1815
201k
    Py_ssize_t k; /* for IFLT macro expansion */
1816
201k
    PyObject ** const a = ss->keys;
1817
201k
    PyObject ** const v = ss->values;
1818
201k
    const bool has_values = v != NULL;
1819
201k
    PyObject *pivot;
1820
201k
    Py_ssize_t M;
1821
1822
201k
    assert(0 <= ok && ok <= n && 1 <= n && n <= MAX_MINRUN);
1823
    /* assert a[:ok] is sorted */
1824
201k
    if (! ok)
1825
0
        ++ok;
1826
    /* Regular insertion sort has average- and worst-case O(n**2) cost
1827
       for both # of comparisons and number of bytes moved. But its branches
1828
       are highly predictable, and it loves sorted input (n-1 compares and no
1829
       data movement). This is significant in cases like sortperf.py's %sort,
1830
       where an out-of-order element near the start of a run is moved into
1831
       place slowly but then the remaining elements up to length minrun are
1832
       generally at worst one slot away from their correct position (so only
1833
       need 1 or 2 commpares to resolve). If comparisons are very fast (such
1834
       as for a list of Python floats), the simple inner loop leaves it
1835
       very competitive with binary insertion, despite that it does
1836
       significantly more compares overall on random data.
1837
1838
       Binary insertion sort has worst, average, and best case O(n log n)
1839
       cost for # of comparisons, but worst and average case O(n**2) cost
1840
       for data movement. The more expensive comparisons, the more important
1841
       the comparison advantage. But its branches are less predictable the
1842
       more "randomish" the data, and that's so significant its worst case
1843
       in real life is random input rather than reverse-ordered (which does
1844
       about twice the data movement than random input does).
1845
1846
       Note that the number of bytes moved doesn't seem to matter. MAX_MINRUN
1847
       of 64 is so small that the key and value pointers all fit in a corner
1848
       of L1 cache, and moving things around in that is very fast. */
1849
#if 0 // ordinary insertion sort.
1850
    PyObject * vpivot = NULL;
1851
    for (; ok < n; ++ok) {
1852
        pivot = a[ok];
1853
        if (has_values)
1854
            vpivot = v[ok];
1855
        for (M = ok - 1; M >= 0; --M) {
1856
            k = ISLT(pivot, a[M]);
1857
            if (k < 0) {
1858
                a[M + 1] = pivot;
1859
                if (has_values)
1860
                    v[M + 1] = vpivot;
1861
                goto fail;
1862
            }
1863
            else if (k) {
1864
                a[M + 1] = a[M];
1865
                if (has_values)
1866
                    v[M + 1] = v[M];
1867
            }
1868
            else
1869
                break;
1870
        }
1871
        a[M + 1] = pivot;
1872
        if (has_values)
1873
            v[M + 1] = vpivot;
1874
    }
1875
#else // binary insertion sort
1876
201k
    Py_ssize_t L, R;
1877
2.92M
    for (; ok < n; ++ok) {
1878
        /* set L to where a[ok] belongs */
1879
2.72M
        L = 0;
1880
2.72M
        R = ok;
1881
2.72M
        pivot = a[ok];
1882
        /* Slice invariants. vacuously true at the start:
1883
         * all a[0:L]  <= pivot
1884
         * all a[L:R]     unknown
1885
         * all a[R:ok]  > pivot
1886
         */
1887
2.72M
        assert(L < R);
1888
11.5M
        do {
1889
            /* don't do silly ;-) things to prevent overflow when finding
1890
               the midpoint; L and R are very far from filling a Py_ssize_t */
1891
11.5M
            M = (L + R) >> 1;
1892
11.5M
#if 1 // straightforward, but highly unpredictable branch on random data
1893
11.5M
            IFLT(pivot, a[M])
1894
5.14M
                R = M;
1895
6.44M
            else
1896
6.44M
                L = M + 1;
1897
#else
1898
            /* Try to get compiler to generate conditional move instructions
1899
               instead. Works fine, but leaving it disabled for now because
1900
               it's not yielding consistently faster sorts. Needs more
1901
               investigation. More computation in the inner loop adds its own
1902
               costs, which can be significant when compares are fast. */
1903
            k = ISLT(pivot, a[M]);
1904
            if (k < 0)
1905
                goto fail;
1906
            Py_ssize_t Mp1 = M + 1;
1907
            R = k ? M : R;
1908
            L = k ? L : Mp1;
1909
#endif
1910
11.5M
        } while (L < R);
1911
2.72M
        assert(L == R);
1912
        /* a[:L] holds all elements from a[:ok] <= pivot now, so pivot belongs
1913
           at index L. Slide a[L:ok] to the right a slot to make room for it.
1914
           Caution: using memmove is much slower under MSVC 5; we're not
1915
           usually moving many slots. Years later: under Visual Studio 2022,
1916
           memmove seems just slightly slower than doing it "by hand". */
1917
24.1M
        for (M = ok; M > L; --M)
1918
21.4M
            a[M] = a[M - 1];
1919
2.72M
        a[L] = pivot;
1920
2.72M
        if (has_values) {
1921
1.52M
            pivot = v[ok];
1922
7.98M
            for (M = ok; M > L; --M)
1923
6.46M
                v[M] = v[M - 1];
1924
1.52M
            v[L] = pivot;
1925
1.52M
        }
1926
2.72M
    }
1927
201k
#endif // pick binary or regular insertion sort
1928
201k
    return 0;
1929
1930
0
 fail:
1931
0
    return -1;
1932
201k
}
1933
1934
static void
1935
sortslice_reverse(sortslice *s, Py_ssize_t n)
1936
85.8k
{
1937
85.8k
    reverse_slice(s->keys, &s->keys[n]);
1938
85.8k
    if (s->values != NULL)
1939
37.9k
        reverse_slice(s->values, &s->values[n]);
1940
85.8k
}
1941
1942
/*
1943
Return the length of the run beginning at slo->keys, spanning no more than
1944
nremaining elements. The run beginning there may be ascending or descending,
1945
but the function permutes it in place, if needed, so that it's always ascending
1946
upon return.
1947
1948
Returns -1 in case of error.
1949
*/
1950
static Py_ssize_t
1951
count_run(MergeState *ms, sortslice *slo, Py_ssize_t nremaining)
1952
352k
{
1953
352k
    Py_ssize_t k; /* used by IFLT macro expansion */
1954
352k
    Py_ssize_t n;
1955
352k
    PyObject ** const lo = slo->keys;
1956
1957
    /* In general, as things go on we've established that the slice starts
1958
       with a monotone run of n elements, starting at lo. */
1959
1960
    /* We're n elements into the slice, and the most recent neq+1 elements are
1961
     * all equal. This reverses them in-place, and resets neq for reuse.
1962
     */
1963
352k
#define REVERSE_LAST_NEQ                        \
1964
2.36M
    if (neq) {                                  \
1965
5.58k
        sortslice slice = *slo;                 \
1966
5.58k
        ++neq;                                  \
1967
5.58k
        sortslice_advance(&slice, n - neq);     \
1968
5.58k
        sortslice_reverse(&slice, neq);         \
1969
5.58k
        neq = 0;                                \
1970
5.58k
    }
1971
1972
    /* Sticking to only __lt__ compares is confusing and error-prone. But in
1973
     * this routine, almost all uses of IFLT can be captured by tiny macros
1974
     * giving mnemonic names to the intent. Note that inline functions don't
1975
     * work for this (IFLT expands to code including `goto fail`).
1976
     */
1977
352k
#define IF_NEXT_LARGER  IFLT(lo[n-1], lo[n])
1978
5.82M
#define IF_NEXT_SMALLER IFLT(lo[n], lo[n-1])
1979
1980
352k
    assert(nremaining);
1981
    /* try ascending run first */
1982
3.21M
    for (n = 1; n < nremaining; ++n) {
1983
3.12M
        IF_NEXT_SMALLER
1984
260k
            break;
1985
3.12M
    }
1986
352k
    if (n == nremaining)
1987
91.6k
        return n;
1988
    /* lo[n] is strictly less */
1989
    /* If n is 1 now, then the first compare established it's a descending
1990
     * run, so fall through to the descending case. But if n > 1, there are
1991
     * n elements in an ascending run terminated by the strictly less lo[n].
1992
     * If the first key < lo[n-1], *somewhere* along the way the sequence
1993
     * increased, so we're done (there is no descending run).
1994
     * Else first key >= lo[n-1], which implies that the entire ascending run
1995
     * consists of equal elements. In that case, this is a descending run,
1996
     * and we reverse the all-equal prefix in-place.
1997
     */
1998
260k
    if (n > 1) {
1999
190k
        IFLT(lo[0], lo[n-1])
2000
185k
            return n;
2001
5.07k
        sortslice_reverse(slo, n);
2002
5.07k
    }
2003
75.1k
    ++n; /* in all cases it's been established that lo[n] has been resolved */
2004
2005
    /* Finish descending run. All-squal subruns are reversed in-place on the
2006
     * fly. Their original order will be restored at the end by the whole-slice
2007
     * reversal.
2008
     */
2009
75.1k
    Py_ssize_t neq = 0;
2010
2.38M
    for ( ; n < nremaining; ++n) {
2011
2.34M
        IF_NEXT_SMALLER {
2012
            /* This ends the most recent run of equal elements, but still in
2013
             * the "descending" direction.
2014
             */
2015
2.28M
            REVERSE_LAST_NEQ
2016
2.28M
        }
2017
58.8k
        else {
2018
58.8k
            IF_NEXT_LARGER /* descending run is over */
2019
36.2k
                break;
2020
22.5k
            else /* not x < y and not y < x implies x == y */
2021
22.5k
                ++neq;
2022
58.8k
        }
2023
2.34M
    }
2024
75.1k
    REVERSE_LAST_NEQ
2025
75.1k
    sortslice_reverse(slo, n); /* transform to ascending run */
2026
2027
    /* And after reversing, it's possible this can be extended by a
2028
     * naturally increasing suffix; e.g., [3, 2, 3, 4, 1] makes an
2029
     * ascending run from the first 4 elements.
2030
     */
2031
388k
    for ( ; n < nremaining; ++n) {
2032
347k
        IF_NEXT_SMALLER
2033
34.6k
            break;
2034
347k
    }
2035
2036
75.1k
    return n;
2037
0
fail:
2038
0
    return -1;
2039
2040
75.1k
#undef REVERSE_LAST_NEQ
2041
75.1k
#undef IF_NEXT_SMALLER
2042
75.1k
#undef IF_NEXT_LARGER
2043
75.1k
}
2044
2045
/*
2046
Locate the proper position of key in a sorted vector; if the vector contains
2047
an element equal to key, return the position immediately to the left of
2048
the leftmost equal element.  [gallop_right() does the same except returns
2049
the position to the right of the rightmost equal element (if any).]
2050
2051
"a" is a sorted vector with n elements, starting at a[0].  n must be > 0.
2052
2053
"hint" is an index at which to begin the search, 0 <= hint < n.  The closer
2054
hint is to the final result, the faster this runs.
2055
2056
The return value is the int k in 0..n such that
2057
2058
    a[k-1] < key <= a[k]
2059
2060
pretending that *(a-1) is minus infinity and a[n] is plus infinity.  IOW,
2061
key belongs at index k; or, IOW, the first k elements of a should precede
2062
key, and the last n-k should follow key.
2063
2064
Returns -1 on error.  See listsort.txt for info on the method.
2065
*/
2066
static Py_ssize_t
2067
gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
2068
212k
{
2069
212k
    Py_ssize_t ofs;
2070
212k
    Py_ssize_t lastofs;
2071
212k
    Py_ssize_t k;
2072
2073
212k
    assert(key && a && n > 0 && hint >= 0 && hint < n);
2074
2075
212k
    a += hint;
2076
212k
    lastofs = 0;
2077
212k
    ofs = 1;
2078
212k
    IFLT(*a, key) {
2079
        /* a[hint] < key -- gallop right, until
2080
         * a[hint + lastofs] < key <= a[hint + ofs]
2081
         */
2082
117k
        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
2083
364k
        while (ofs < maxofs) {
2084
283k
            IFLT(a[ofs], key) {
2085
246k
                lastofs = ofs;
2086
246k
                assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2087
246k
                ofs = (ofs << 1) + 1;
2088
246k
            }
2089
36.6k
            else                /* key <= a[hint + ofs] */
2090
36.6k
                break;
2091
283k
        }
2092
117k
        if (ofs > maxofs)
2093
31.6k
            ofs = maxofs;
2094
        /* Translate back to offsets relative to &a[0]. */
2095
117k
        lastofs += hint;
2096
117k
        ofs += hint;
2097
117k
    }
2098
94.7k
    else {
2099
        /* key <= a[hint] -- gallop left, until
2100
         * a[hint - ofs] < key <= a[hint - lastofs]
2101
         */
2102
94.7k
        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
2103
303k
        while (ofs < maxofs) {
2104
270k
            IFLT(*(a-ofs), key)
2105
61.6k
                break;
2106
            /* key <= a[hint - ofs] */
2107
209k
            lastofs = ofs;
2108
209k
            assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2109
209k
            ofs = (ofs << 1) + 1;
2110
209k
        }
2111
94.7k
        if (ofs > maxofs)
2112
19.4k
            ofs = maxofs;
2113
        /* Translate back to positive offsets relative to &a[0]. */
2114
94.7k
        k = lastofs;
2115
94.7k
        lastofs = hint - ofs;
2116
94.7k
        ofs = hint - k;
2117
94.7k
    }
2118
212k
    a -= hint;
2119
2120
212k
    assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
2121
    /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
2122
     * right of lastofs but no farther right than ofs.  Do a binary
2123
     * search, with invariant a[lastofs-1] < key <= a[ofs].
2124
     */
2125
212k
    ++lastofs;
2126
604k
    while (lastofs < ofs) {
2127
391k
        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
2128
2129
391k
        IFLT(a[m], key)
2130
205k
            lastofs = m+1;              /* a[m] < key */
2131
186k
        else
2132
186k
            ofs = m;                    /* key <= a[m] */
2133
391k
    }
2134
212k
    assert(lastofs == ofs);             /* so a[ofs-1] < key <= a[ofs] */
2135
212k
    return ofs;
2136
2137
0
fail:
2138
0
    return -1;
2139
212k
}
2140
2141
/*
2142
Exactly like gallop_left(), except that if key already exists in a[0:n],
2143
finds the position immediately to the right of the rightmost equal value.
2144
2145
The return value is the int k in 0..n such that
2146
2147
    a[k-1] <= key < a[k]
2148
2149
or -1 if error.
2150
2151
The code duplication is massive, but this is enough different given that
2152
we're sticking to "<" comparisons that it's much harder to follow if
2153
written as one routine with yet another "left or right?" flag.
2154
*/
2155
static Py_ssize_t
2156
gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
2157
235k
{
2158
235k
    Py_ssize_t ofs;
2159
235k
    Py_ssize_t lastofs;
2160
235k
    Py_ssize_t k;
2161
2162
235k
    assert(key && a && n > 0 && hint >= 0 && hint < n);
2163
2164
235k
    a += hint;
2165
235k
    lastofs = 0;
2166
235k
    ofs = 1;
2167
235k
    IFLT(key, *a) {
2168
        /* key < a[hint] -- gallop left, until
2169
         * a[hint - ofs] <= key < a[hint - lastofs]
2170
         */
2171
99.5k
        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
2172
233k
        while (ofs < maxofs) {
2173
156k
            IFLT(key, *(a-ofs)) {
2174
133k
                lastofs = ofs;
2175
133k
                assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2176
133k
                ofs = (ofs << 1) + 1;
2177
133k
            }
2178
22.3k
            else                /* a[hint - ofs] <= key */
2179
22.3k
                break;
2180
156k
        }
2181
99.5k
        if (ofs > maxofs)
2182
13.8k
            ofs = maxofs;
2183
        /* Translate back to positive offsets relative to &a[0]. */
2184
99.5k
        k = lastofs;
2185
99.5k
        lastofs = hint - ofs;
2186
99.5k
        ofs = hint - k;
2187
99.5k
    }
2188
135k
    else {
2189
        /* a[hint] <= key -- gallop right, until
2190
         * a[hint + lastofs] <= key < a[hint + ofs]
2191
        */
2192
135k
        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
2193
436k
        while (ofs < maxofs) {
2194
381k
            IFLT(key, a[ofs])
2195
81.0k
                break;
2196
            /* a[hint + ofs] <= key */
2197
300k
            lastofs = ofs;
2198
300k
            assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2199
300k
            ofs = (ofs << 1) + 1;
2200
300k
        }
2201
135k
        if (ofs > maxofs)
2202
29.4k
            ofs = maxofs;
2203
        /* Translate back to offsets relative to &a[0]. */
2204
135k
        lastofs += hint;
2205
135k
        ofs += hint;
2206
135k
    }
2207
235k
    a -= hint;
2208
2209
235k
    assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
2210
    /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
2211
     * right of lastofs but no farther right than ofs.  Do a binary
2212
     * search, with invariant a[lastofs-1] <= key < a[ofs].
2213
     */
2214
235k
    ++lastofs;
2215
612k
    while (lastofs < ofs) {
2216
377k
        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
2217
2218
377k
        IFLT(key, a[m])
2219
196k
            ofs = m;                    /* key < a[m] */
2220
180k
        else
2221
180k
            lastofs = m+1;              /* a[m] <= key */
2222
377k
    }
2223
235k
    assert(lastofs == ofs);             /* so a[ofs-1] <= key < a[ofs] */
2224
235k
    return ofs;
2225
2226
0
fail:
2227
0
    return -1;
2228
235k
}
2229
2230
/* Conceptually a MergeState's constructor. */
2231
static void
2232
merge_init(MergeState *ms, Py_ssize_t list_size, int has_keyfunc,
2233
           sortslice *lo)
2234
3.27M
{
2235
3.27M
    assert(ms != NULL);
2236
3.27M
    if (has_keyfunc) {
2237
        /* The temporary space for merging will need at most half the list
2238
         * size rounded up.  Use the minimum possible space so we can use the
2239
         * rest of temparray for other things.  In particular, if there is
2240
         * enough extra space, listsort() will use it to store the keys.
2241
         */
2242
642k
        ms->alloced = (list_size + 1) / 2;
2243
2244
        /* ms->alloced describes how many keys will be stored at
2245
           ms->temparray, but we also need to store the values.  Hence,
2246
           ms->alloced is capped at half of MERGESTATE_TEMP_SIZE. */
2247
642k
        if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
2248
2.70k
            ms->alloced = MERGESTATE_TEMP_SIZE / 2;
2249
642k
        ms->a.values = &ms->temparray[ms->alloced];
2250
642k
    }
2251
2.63M
    else {
2252
2.63M
        ms->alloced = MERGESTATE_TEMP_SIZE;
2253
2.63M
        ms->a.values = NULL;
2254
2.63M
    }
2255
3.27M
    ms->a.keys = ms->temparray;
2256
3.27M
    ms->n = 0;
2257
3.27M
    ms->min_gallop = MIN_GALLOP;
2258
3.27M
    ms->listlen = list_size;
2259
3.27M
    ms->basekeys = lo->keys;
2260
2261
    /* State for generating minrun values. See listsort.txt. */
2262
3.27M
    ms->mr_e = 0;
2263
3.31M
    while (list_size >> ms->mr_e >= MAX_MINRUN) {
2264
34.2k
        ++ms->mr_e;
2265
34.2k
    }
2266
3.27M
    ms->mr_mask = (1 << ms->mr_e) - 1;
2267
3.27M
    ms->mr_current = 0;
2268
3.27M
}
2269
2270
/* Free all the temp memory owned by the MergeState.  This must be called
2271
 * when you're done with a MergeState, and may be called before then if
2272
 * you want to free the temp memory early.
2273
 */
2274
static void
2275
merge_freemem(MergeState *ms)
2276
3.28M
{
2277
3.28M
    assert(ms != NULL);
2278
3.28M
    if (ms->a.keys != ms->temparray) {
2279
5.48k
        PyMem_Free(ms->a.keys);
2280
5.48k
        ms->a.keys = NULL;
2281
5.48k
    }
2282
3.28M
}
2283
2284
/* Ensure enough temp memory for 'need' array slots is available.
2285
 * Returns 0 on success and -1 if the memory can't be gotten.
2286
 */
2287
static int
2288
merge_getmem(MergeState *ms, Py_ssize_t need)
2289
5.48k
{
2290
5.48k
    int multiplier;
2291
2292
5.48k
    assert(ms != NULL);
2293
5.48k
    if (need <= ms->alloced)
2294
0
        return 0;
2295
2296
5.48k
    multiplier = ms->a.values != NULL ? 2 : 1;
2297
2298
    /* Don't realloc!  That can cost cycles to copy the old data, but
2299
     * we don't care what's in the block.
2300
     */
2301
5.48k
    merge_freemem(ms);
2302
5.48k
    if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject *) / multiplier) {
2303
0
        PyErr_NoMemory();
2304
0
        return -1;
2305
0
    }
2306
5.48k
    ms->a.keys = (PyObject **)PyMem_Malloc(multiplier * need
2307
5.48k
                                          * sizeof(PyObject *));
2308
5.48k
    if (ms->a.keys != NULL) {
2309
5.48k
        ms->alloced = need;
2310
5.48k
        if (ms->a.values != NULL)
2311
4.91k
            ms->a.values = &ms->a.keys[need];
2312
5.48k
        return 0;
2313
5.48k
    }
2314
0
    PyErr_NoMemory();
2315
0
    return -1;
2316
5.48k
}
2317
78.3k
#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 :   \
2318
78.3k
                                merge_getmem(MS, NEED))
2319
2320
/* Merge the na elements starting at ssa with the nb elements starting at
2321
 * ssb.keys = ssa.keys + na in a stable way, in-place.  na and nb must be > 0.
2322
 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
2323
 * should have na <= nb.  See listsort.txt for more info.  Return 0 if
2324
 * successful, -1 if error.
2325
 */
2326
static Py_ssize_t
2327
merge_lo(MergeState *ms, sortslice ssa, Py_ssize_t na,
2328
         sortslice ssb, Py_ssize_t nb)
2329
51.8k
{
2330
51.8k
    Py_ssize_t k;
2331
51.8k
    sortslice dest;
2332
51.8k
    int result = -1;            /* guilty until proved innocent */
2333
51.8k
    Py_ssize_t min_gallop;
2334
2335
51.8k
    assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
2336
51.8k
    assert(ssa.keys + na == ssb.keys);
2337
51.8k
    if (MERGE_GETMEM(ms, na) < 0)
2338
0
        return -1;
2339
51.8k
    sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
2340
51.8k
    dest = ssa;
2341
51.8k
    ssa = ms->a;
2342
2343
51.8k
    sortslice_copy_incr(&dest, &ssb);
2344
51.8k
    --nb;
2345
51.8k
    if (nb == 0)
2346
1.92k
        goto Succeed;
2347
49.8k
    if (na == 1)
2348
7.14k
        goto CopyB;
2349
2350
42.7k
    min_gallop = ms->min_gallop;
2351
72.8k
    for (;;) {
2352
72.8k
        Py_ssize_t acount = 0;          /* # of times A won in a row */
2353
72.8k
        Py_ssize_t bcount = 0;          /* # of times B won in a row */
2354
2355
        /* Do the straightforward thing until (if ever) one run
2356
         * appears to win consistently.
2357
         */
2358
1.00M
        for (;;) {
2359
1.00M
            assert(na > 1 && nb > 0);
2360
1.00M
            k = ISLT(ssb.keys[0], ssa.keys[0]);
2361
1.00M
            if (k) {
2362
536k
                if (k < 0)
2363
0
                    goto Fail;
2364
536k
                sortslice_copy_incr(&dest, &ssb);
2365
536k
                ++bcount;
2366
536k
                acount = 0;
2367
536k
                --nb;
2368
536k
                if (nb == 0)
2369
3.93k
                    goto Succeed;
2370
532k
                if (bcount >= min_gallop)
2371
33.3k
                    break;
2372
532k
            }
2373
472k
            else {
2374
472k
                sortslice_copy_incr(&dest, &ssa);
2375
472k
                ++acount;
2376
472k
                bcount = 0;
2377
472k
                --na;
2378
472k
                if (na == 1)
2379
8.68k
                    goto CopyB;
2380
464k
                if (acount >= min_gallop)
2381
26.9k
                    break;
2382
464k
            }
2383
1.00M
        }
2384
2385
        /* One run is winning so consistently that galloping may
2386
         * be a huge win.  So try that, and continue galloping until
2387
         * (if ever) neither run appears to be winning consistently
2388
         * anymore.
2389
         */
2390
60.2k
        ++min_gallop;
2391
95.5k
        do {
2392
95.5k
            assert(na > 1 && nb > 0);
2393
95.5k
            min_gallop -= min_gallop > 1;
2394
95.5k
            ms->min_gallop = min_gallop;
2395
95.5k
            k = gallop_right(ms, ssb.keys[0], ssa.keys, na, 0);
2396
95.5k
            acount = k;
2397
95.5k
            if (k) {
2398
52.7k
                if (k < 0)
2399
0
                    goto Fail;
2400
52.7k
                sortslice_memcpy(&dest, 0, &ssa, 0, k);
2401
52.7k
                sortslice_advance(&dest, k);
2402
52.7k
                sortslice_advance(&ssa, k);
2403
52.7k
                na -= k;
2404
52.7k
                if (na == 1)
2405
7.51k
                    goto CopyB;
2406
                /* na==0 is impossible now if the comparison
2407
                 * function is consistent, but we can't assume
2408
                 * that it is.
2409
                 */
2410
45.2k
                if (na == 0)
2411
0
                    goto Succeed;
2412
45.2k
            }
2413
88.0k
            sortslice_copy_incr(&dest, &ssb);
2414
88.0k
            --nb;
2415
88.0k
            if (nb == 0)
2416
1.91k
                goto Succeed;
2417
2418
86.0k
            k = gallop_left(ms, ssa.keys[0], ssb.keys, nb, 0);
2419
86.0k
            bcount = k;
2420
86.0k
            if (k) {
2421
73.3k
                if (k < 0)
2422
0
                    goto Fail;
2423
73.3k
                sortslice_memmove(&dest, 0, &ssb, 0, k);
2424
73.3k
                sortslice_advance(&dest, k);
2425
73.3k
                sortslice_advance(&ssb, k);
2426
73.3k
                nb -= k;
2427
73.3k
                if (nb == 0)
2428
16.7k
                    goto Succeed;
2429
73.3k
            }
2430
69.3k
            sortslice_copy_incr(&dest, &ssa);
2431
69.3k
            --na;
2432
69.3k
            if (na == 1)
2433
3.96k
                goto CopyB;
2434
69.3k
        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
2435
30.0k
        ++min_gallop;           /* penalize it for leaving galloping mode */
2436
30.0k
        ms->min_gallop = min_gallop;
2437
30.0k
    }
2438
24.4k
Succeed:
2439
24.4k
    result = 0;
2440
24.4k
Fail:
2441
24.4k
    if (na)
2442
24.4k
        sortslice_memcpy(&dest, 0, &ssa, 0, na);
2443
24.4k
    return result;
2444
27.3k
CopyB:
2445
27.3k
    assert(na == 1 && nb > 0);
2446
    /* The last element of ssa belongs at the end of the merge. */
2447
27.3k
    sortslice_memmove(&dest, 0, &ssb, 0, nb);
2448
27.3k
    sortslice_copy(&dest, nb, &ssa, 0);
2449
27.3k
    return 0;
2450
24.4k
}
2451
2452
/* Merge the na elements starting at pa with the nb elements starting at
2453
 * ssb.keys = ssa.keys + na in a stable way, in-place.  na and nb must be > 0.
2454
 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
2455
 * should have na >= nb.  See listsort.txt for more info.  Return 0 if
2456
 * successful, -1 if error.
2457
 */
2458
static Py_ssize_t
2459
merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
2460
         sortslice ssb, Py_ssize_t nb)
2461
26.5k
{
2462
26.5k
    Py_ssize_t k;
2463
26.5k
    sortslice dest, basea, baseb;
2464
26.5k
    int result = -1;            /* guilty until proved innocent */
2465
26.5k
    Py_ssize_t min_gallop;
2466
2467
26.5k
    assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
2468
26.5k
    assert(ssa.keys + na == ssb.keys);
2469
26.5k
    if (MERGE_GETMEM(ms, nb) < 0)
2470
0
        return -1;
2471
26.5k
    dest = ssb;
2472
26.5k
    sortslice_advance(&dest, nb-1);
2473
26.5k
    sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
2474
26.5k
    basea = ssa;
2475
26.5k
    baseb = ms->a;
2476
26.5k
    ssb.keys = ms->a.keys + nb - 1;
2477
26.5k
    if (ssb.values != NULL)
2478
22.9k
        ssb.values = ms->a.values + nb - 1;
2479
26.5k
    sortslice_advance(&ssa, na - 1);
2480
2481
26.5k
    sortslice_copy_decr(&dest, &ssa);
2482
26.5k
    --na;
2483
26.5k
    if (na == 0)
2484
0
        goto Succeed;
2485
26.5k
    if (nb == 1)
2486
1.19k
        goto CopyA;
2487
2488
25.3k
    min_gallop = ms->min_gallop;
2489
37.0k
    for (;;) {
2490
37.0k
        Py_ssize_t acount = 0;          /* # of times A won in a row */
2491
37.0k
        Py_ssize_t bcount = 0;          /* # of times B won in a row */
2492
2493
        /* Do the straightforward thing until (if ever) one run
2494
         * appears to win consistently.
2495
         */
2496
2.62M
        for (;;) {
2497
2.62M
            assert(na > 0 && nb > 1);
2498
2.62M
            k = ISLT(ssb.keys[0], ssa.keys[0]);
2499
2.62M
            if (k) {
2500
1.31M
                if (k < 0)
2501
0
                    goto Fail;
2502
1.31M
                sortslice_copy_decr(&dest, &ssa);
2503
1.31M
                ++acount;
2504
1.31M
                bcount = 0;
2505
1.31M
                --na;
2506
1.31M
                if (na == 0)
2507
949
                    goto Succeed;
2508
1.31M
                if (acount >= min_gallop)
2509
17.5k
                    break;
2510
1.31M
            }
2511
1.31M
            else {
2512
1.31M
                sortslice_copy_decr(&dest, &ssb);
2513
1.31M
                ++bcount;
2514
1.31M
                acount = 0;
2515
1.31M
                --nb;
2516
1.31M
                if (nb == 1)
2517
618
                    goto CopyA;
2518
1.31M
                if (bcount >= min_gallop)
2519
17.9k
                    break;
2520
1.31M
            }
2521
2.62M
        }
2522
2523
        /* One run is winning so consistently that galloping may
2524
         * be a huge win.  So try that, and continue galloping until
2525
         * (if ever) neither run appears to be winning consistently
2526
         * anymore.
2527
         */
2528
35.5k
        ++min_gallop;
2529
60.8k
        do {
2530
60.8k
            assert(na > 0 && nb > 1);
2531
60.8k
            min_gallop -= min_gallop > 1;
2532
60.8k
            ms->min_gallop = min_gallop;
2533
60.8k
            k = gallop_right(ms, ssb.keys[0], basea.keys, na, na-1);
2534
60.8k
            if (k < 0)
2535
0
                goto Fail;
2536
60.8k
            k = na - k;
2537
60.8k
            acount = k;
2538
60.8k
            if (k) {
2539
37.5k
                sortslice_advance(&dest, -k);
2540
37.5k
                sortslice_advance(&ssa, -k);
2541
37.5k
                sortslice_memmove(&dest, 1, &ssa, 1, k);
2542
37.5k
                na -= k;
2543
37.5k
                if (na == 0)
2544
11.7k
                    goto Succeed;
2545
37.5k
            }
2546
49.0k
            sortslice_copy_decr(&dest, &ssb);
2547
49.0k
            --nb;
2548
49.0k
            if (nb == 1)
2549
847
                goto CopyA;
2550
2551
48.2k
            k = gallop_left(ms, ssa.keys[0], baseb.keys, nb, nb-1);
2552
48.2k
            if (k < 0)
2553
0
                goto Fail;
2554
48.2k
            k = nb - k;
2555
48.2k
            bcount = k;
2556
48.2k
            if (k) {
2557
41.1k
                sortslice_advance(&dest, -k);
2558
41.1k
                sortslice_advance(&ssb, -k);
2559
41.1k
                sortslice_memcpy(&dest, 1, &ssb, 1, k);
2560
41.1k
                nb -= k;
2561
41.1k
                if (nb == 1)
2562
9.99k
                    goto CopyA;
2563
                /* nb==0 is impossible now if the comparison
2564
                 * function is consistent, but we can't assume
2565
                 * that it is.
2566
                 */
2567
31.1k
                if (nb == 0)
2568
0
                    goto Succeed;
2569
31.1k
            }
2570
38.2k
            sortslice_copy_decr(&dest, &ssa);
2571
38.2k
            --na;
2572
38.2k
            if (na == 0)
2573
1.22k
                goto Succeed;
2574
38.2k
        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
2575
11.6k
        ++min_gallop;           /* penalize it for leaving galloping mode */
2576
11.6k
        ms->min_gallop = min_gallop;
2577
11.6k
    }
2578
13.9k
Succeed:
2579
13.9k
    result = 0;
2580
13.9k
Fail:
2581
13.9k
    if (nb)
2582
13.9k
        sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
2583
13.9k
    return result;
2584
12.6k
CopyA:
2585
12.6k
    assert(nb == 1 && na > 0);
2586
    /* The first element of ssb belongs at the front of the merge. */
2587
12.6k
    sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
2588
12.6k
    sortslice_advance(&dest, -na);
2589
12.6k
    sortslice_advance(&ssa, -na);
2590
12.6k
    sortslice_copy(&dest, 0, &ssb, 0);
2591
12.6k
    return 0;
2592
13.9k
}
2593
2594
/* Merge the two runs at stack indices i and i+1.
2595
 * Returns 0 on success, -1 on error.
2596
 */
2597
static Py_ssize_t
2598
merge_at(MergeState *ms, Py_ssize_t i)
2599
78.9k
{
2600
78.9k
    sortslice ssa, ssb;
2601
78.9k
    Py_ssize_t na, nb;
2602
78.9k
    Py_ssize_t k;
2603
2604
78.9k
    assert(ms != NULL);
2605
78.9k
    assert(ms->n >= 2);
2606
78.9k
    assert(i >= 0);
2607
78.9k
    assert(i == ms->n - 2 || i == ms->n - 3);
2608
2609
78.9k
    ssa = ms->pending[i].base;
2610
78.9k
    na = ms->pending[i].len;
2611
78.9k
    ssb = ms->pending[i+1].base;
2612
78.9k
    nb = ms->pending[i+1].len;
2613
78.9k
    assert(na > 0 && nb > 0);
2614
78.9k
    assert(ssa.keys + na == ssb.keys);
2615
2616
    /* Record the length of the combined runs; if i is the 3rd-last
2617
     * run now, also slide over the last run (which isn't involved
2618
     * in this merge).  The current run i+1 goes away in any case.
2619
     */
2620
78.9k
    ms->pending[i].len = na + nb;
2621
78.9k
    if (i == ms->n - 3)
2622
585
        ms->pending[i+1] = ms->pending[i+2];
2623
78.9k
    --ms->n;
2624
2625
    /* Where does b start in a?  Elements in a before that can be
2626
     * ignored (already in place).
2627
     */
2628
78.9k
    k = gallop_right(ms, *ssb.keys, ssa.keys, na, 0);
2629
78.9k
    if (k < 0)
2630
0
        return -1;
2631
78.9k
    sortslice_advance(&ssa, k);
2632
78.9k
    na -= k;
2633
78.9k
    if (na == 0)
2634
554
        return 0;
2635
2636
    /* Where does a end in b?  Elements in b after that can be
2637
     * ignored (already in place).
2638
     */
2639
78.3k
    nb = gallop_left(ms, ssa.keys[na-1], ssb.keys, nb, nb-1);
2640
78.3k
    if (nb <= 0)
2641
0
        return nb;
2642
2643
    /* Merge what remains of the runs, using a temp array with
2644
     * min(na, nb) elements.
2645
     */
2646
78.3k
    if (na <= nb)
2647
51.8k
        return merge_lo(ms, ssa, na, ssb, nb);
2648
26.5k
    else
2649
26.5k
        return merge_hi(ms, ssa, na, ssb, nb);
2650
78.3k
}
2651
2652
/* Two adjacent runs begin at index s1. The first run has length n1, and
2653
 * the second run (starting at index s1+n1) has length n2. The list has total
2654
 * length n.
2655
 * Compute the "power" of the first run. See listsort.txt for details.
2656
 */
2657
static int
2658
powerloop(Py_ssize_t s1, Py_ssize_t n1, Py_ssize_t n2, Py_ssize_t n)
2659
78.9k
{
2660
78.9k
    int result = 0;
2661
78.9k
    assert(s1 >= 0);
2662
78.9k
    assert(n1 > 0 && n2 > 0);
2663
78.9k
    assert(s1 + n1 + n2 <= n);
2664
    /* midpoints a and b:
2665
     * a = s1 + n1/2
2666
     * b = s1 + n1 + n2/2 = a + (n1 + n2)/2
2667
     *
2668
     * Those may not be integers, though, because of the "/2". So we work with
2669
     * 2*a and 2*b instead, which are necessarily integers. It makes no
2670
     * difference to the outcome, since the bits in the expansion of (2*i)/n
2671
     * are merely shifted one position from those of i/n.
2672
     */
2673
78.9k
    Py_ssize_t a = 2 * s1 + n1;  /* 2*a */
2674
78.9k
    Py_ssize_t b = a + n1 + n2;  /* 2*b */
2675
    /* Emulate a/n and b/n one bit a time, until bits differ. */
2676
288k
    for (;;) {
2677
288k
        ++result;
2678
288k
        if (a >= n) {  /* both quotient bits are 1 */
2679
107k
            assert(b >= a);
2680
107k
            a -= n;
2681
107k
            b -= n;
2682
107k
        }
2683
180k
        else if (b >= n) {  /* a/n bit is 0, b/n bit is 1 */
2684
78.9k
            break;
2685
78.9k
        } /* else both quotient bits are 0 */
2686
288k
        assert(a < b && b < n);
2687
209k
        a <<= 1;
2688
209k
        b <<= 1;
2689
209k
    }
2690
78.9k
    return result;
2691
78.9k
}
2692
2693
/* The next run has been identified, of length n2.
2694
 * If there's already a run on the stack, apply the "powersort" merge strategy:
2695
 * compute the topmost run's "power" (depth in a conceptual binary merge tree)
2696
 * and merge adjacent runs on the stack with greater power. See listsort.txt
2697
 * for more info.
2698
 *
2699
 * It's the caller's responsibility to push the new run on the stack when this
2700
 * returns.
2701
 *
2702
 * Returns 0 on success, -1 on error.
2703
 */
2704
static int
2705
found_new_run(MergeState *ms, Py_ssize_t n2)
2706
352k
{
2707
352k
    assert(ms);
2708
352k
    if (ms->n) {
2709
78.9k
        assert(ms->n > 0);
2710
78.9k
        struct s_slice *p = ms->pending;
2711
78.9k
        Py_ssize_t s1 = p[ms->n - 1].base.keys - ms->basekeys; /* start index */
2712
78.9k
        Py_ssize_t n1 = p[ms->n - 1].len;
2713
78.9k
        int power = powerloop(s1, n1, n2, ms->listlen);
2714
126k
        while (ms->n > 1 && p[ms->n - 2].power > power) {
2715
47.6k
            if (merge_at(ms, ms->n - 2) < 0)
2716
0
                return -1;
2717
47.6k
        }
2718
78.9k
        assert(ms->n < 2 || p[ms->n - 2].power < power);
2719
78.9k
        p[ms->n - 1].power = power;
2720
78.9k
    }
2721
352k
    return 0;
2722
352k
}
2723
2724
/* Regardless of invariants, merge all runs on the stack until only one
2725
 * remains.  This is used at the end of the mergesort.
2726
 *
2727
 * Returns 0 on success, -1 on error.
2728
 */
2729
static int
2730
merge_force_collapse(MergeState *ms)
2731
273k
{
2732
273k
    struct s_slice *p = ms->pending;
2733
2734
273k
    assert(ms);
2735
304k
    while (ms->n > 1) {
2736
31.2k
        Py_ssize_t n = ms->n - 2;
2737
31.2k
        if (n > 0 && p[n-1].len < p[n+1].len)
2738
585
            --n;
2739
31.2k
        if (merge_at(ms, n) < 0)
2740
0
            return -1;
2741
31.2k
    }
2742
273k
    return 0;
2743
273k
}
2744
2745
/* Return the next minrun value to use. See listsort.txt. */
2746
Py_LOCAL_INLINE(Py_ssize_t)
2747
minrun_next(MergeState *ms)
2748
352k
{
2749
352k
    ms->mr_current += ms->listlen;
2750
352k
    assert(ms->mr_current >= 0); /* no overflow */
2751
352k
    Py_ssize_t result = ms->mr_current >> ms->mr_e;
2752
352k
    ms->mr_current &= ms->mr_mask;
2753
352k
    return result;
2754
352k
}
2755
2756
/* Here we define custom comparison functions to optimize for the cases one commonly
2757
 * encounters in practice: homogeneous lists, often of one of the basic types. */
2758
2759
/* This struct holds the comparison function and helper functions
2760
 * selected in the pre-sort check. */
2761
2762
/* These are the special case compare functions.
2763
 * ms->key_compare will always point to one of these: */
2764
2765
/* Heterogeneous compare: default, always safe to fall back on. */
2766
static int
2767
safe_object_compare(PyObject *v, PyObject *w, MergeState *ms)
2768
8.31k
{
2769
    /* No assumptions necessary! */
2770
8.31k
    return PyObject_RichCompareBool(v, w, Py_LT);
2771
8.31k
}
2772
2773
/* Homogeneous compare: safe for any two comparable objects of the same type.
2774
 * (ms->key_richcompare is set to ob_type->tp_richcompare in the
2775
 *  pre-sort check.)
2776
 */
2777
static int
2778
unsafe_object_compare(PyObject *v, PyObject *w, MergeState *ms)
2779
9.91M
{
2780
9.91M
    PyObject *res_obj; int res;
2781
2782
    /* No assumptions, because we check first: */
2783
9.91M
    if (Py_TYPE(v)->tp_richcompare != ms->key_richcompare)
2784
0
        return PyObject_RichCompareBool(v, w, Py_LT);
2785
2786
9.91M
    assert(ms->key_richcompare != NULL);
2787
9.91M
    res_obj = (*(ms->key_richcompare))(v, w, Py_LT);
2788
2789
9.91M
    if (res_obj == Py_NotImplemented) {
2790
0
        Py_DECREF(res_obj);
2791
0
        return PyObject_RichCompareBool(v, w, Py_LT);
2792
0
    }
2793
9.91M
    if (res_obj == NULL)
2794
0
        return -1;
2795
2796
9.91M
    if (PyBool_Check(res_obj)) {
2797
9.91M
        res = (res_obj == Py_True);
2798
9.91M
    }
2799
0
    else {
2800
0
        res = PyObject_IsTrue(res_obj);
2801
0
    }
2802
9.91M
    Py_DECREF(res_obj);
2803
2804
    /* Note that we can't assert
2805
     *     res == PyObject_RichCompareBool(v, w, Py_LT);
2806
     * because of evil compare functions like this:
2807
     *     lambda a, b:  int(random.random() * 3) - 1)
2808
     * (which is actually in test_sort.py) */
2809
9.91M
    return res;
2810
9.91M
}
2811
2812
/* Latin string compare: safe for any two latin (one byte per char) strings. */
2813
static int
2814
unsafe_latin_compare(PyObject *v, PyObject *w, MergeState *ms)
2815
3.64M
{
2816
3.64M
    Py_ssize_t len;
2817
3.64M
    int res;
2818
2819
    /* Modified from Objects/unicodeobject.c:unicode_compare, assuming: */
2820
3.64M
    assert(Py_IS_TYPE(v, &PyUnicode_Type));
2821
3.64M
    assert(Py_IS_TYPE(w, &PyUnicode_Type));
2822
3.64M
    assert(PyUnicode_KIND(v) == PyUnicode_KIND(w));
2823
3.64M
    assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND);
2824
2825
3.64M
    len = Py_MIN(PyUnicode_GET_LENGTH(v), PyUnicode_GET_LENGTH(w));
2826
3.64M
    res = memcmp(PyUnicode_DATA(v), PyUnicode_DATA(w), len);
2827
2828
3.64M
    res = (res != 0 ?
2829
3.57M
           res < 0 :
2830
3.64M
           PyUnicode_GET_LENGTH(v) < PyUnicode_GET_LENGTH(w));
2831
2832
3.64M
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));;
2833
3.64M
    return res;
2834
3.64M
}
2835
2836
/* Bounded int compare: compare any two longs that fit in a single machine word. */
2837
static int
2838
unsafe_long_compare(PyObject *v, PyObject *w, MergeState *ms)
2839
8.92M
{
2840
8.92M
    PyLongObject *vl, *wl;
2841
8.92M
    intptr_t v0, w0;
2842
8.92M
    int res;
2843
2844
    /* Modified from Objects/longobject.c:long_compare, assuming: */
2845
8.92M
    assert(Py_IS_TYPE(v, &PyLong_Type));
2846
8.92M
    assert(Py_IS_TYPE(w, &PyLong_Type));
2847
8.92M
    assert(_PyLong_IsCompact((PyLongObject *)v));
2848
8.92M
    assert(_PyLong_IsCompact((PyLongObject *)w));
2849
2850
8.92M
    vl = (PyLongObject*)v;
2851
8.92M
    wl = (PyLongObject*)w;
2852
2853
8.92M
    v0 = _PyLong_CompactValue(vl);
2854
8.92M
    w0 = _PyLong_CompactValue(wl);
2855
2856
8.92M
    res = v0 < w0;
2857
8.92M
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2858
8.92M
    return res;
2859
8.92M
}
2860
2861
/* Float compare: compare any two floats. */
2862
static int
2863
unsafe_float_compare(PyObject *v, PyObject *w, MergeState *ms)
2864
0
{
2865
0
    int res;
2866
2867
    /* Modified from Objects/floatobject.c:float_richcompare, assuming: */
2868
0
    assert(Py_IS_TYPE(v, &PyFloat_Type));
2869
0
    assert(Py_IS_TYPE(w, &PyFloat_Type));
2870
2871
0
    res = PyFloat_AS_DOUBLE(v) < PyFloat_AS_DOUBLE(w);
2872
0
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2873
0
    return res;
2874
0
}
2875
2876
/* Tuple compare: compare *any* two tuples, using
2877
 * ms->tuple_elem_compare to compare the first elements, which is set
2878
 * using the same pre-sort check as we use for ms->key_compare,
2879
 * but run on the list [x[0] for x in L]. This allows us to optimize compares
2880
 * on two levels (as long as [x[0] for x in L] is type-homogeneous.) The idea is
2881
 * that most tuple compares don't involve x[1:]. */
2882
static int
2883
unsafe_tuple_compare(PyObject *v, PyObject *w, MergeState *ms)
2884
4.54M
{
2885
4.54M
    PyTupleObject *vt, *wt;
2886
4.54M
    Py_ssize_t i, vlen, wlen;
2887
4.54M
    int k;
2888
2889
    /* Modified from Objects/tupleobject.c:tuplerichcompare, assuming: */
2890
4.54M
    assert(Py_IS_TYPE(v, &PyTuple_Type));
2891
4.54M
    assert(Py_IS_TYPE(w, &PyTuple_Type));
2892
4.54M
    assert(Py_SIZE(v) > 0);
2893
4.54M
    assert(Py_SIZE(w) > 0);
2894
2895
4.54M
    vt = (PyTupleObject *)v;
2896
4.54M
    wt = (PyTupleObject *)w;
2897
2898
4.54M
    vlen = Py_SIZE(vt);
2899
4.54M
    wlen = Py_SIZE(wt);
2900
2901
6.76M
    for (i = 0; i < vlen && i < wlen; i++) {
2902
5.65M
        k = PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_EQ);
2903
5.65M
        if (k < 0)
2904
0
            return -1;
2905
5.65M
        if (!k)
2906
3.42M
            break;
2907
5.65M
    }
2908
2909
4.54M
    if (i >= vlen || i >= wlen)
2910
1.11M
        return vlen < wlen;
2911
2912
3.42M
    if (i == 0)
2913
3.42M
        return ms->tuple_elem_compare(vt->ob_item[i], wt->ob_item[i], ms);
2914
56
    else
2915
56
        return PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_LT);
2916
3.42M
}
2917
2918
/* An adaptive, stable, natural mergesort.  See listsort.txt.
2919
 * Returns Py_None on success, NULL on error.  Even in case of error, the
2920
 * list will be some permutation of its input state (nothing is lost or
2921
 * duplicated).
2922
 */
2923
/*[clinic input]
2924
@permit_long_docstring_body
2925
@critical_section
2926
list.sort
2927
2928
    *
2929
    key as keyfunc: object = None
2930
    reverse: bool = False
2931
2932
Sort the list in ascending order and return None.
2933
2934
The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
2935
order of two equal elements is maintained).
2936
2937
If a key function is given, apply it once to each list item and sort them,
2938
ascending or descending, according to their function values.
2939
2940
The reverse flag can be set to sort in descending order.
2941
[clinic start generated code]*/
2942
2943
static PyObject *
2944
list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
2945
/*[clinic end generated code: output=57b9f9c5e23fbe42 input=e4f6b6069181ad7d]*/
2946
3.27M
{
2947
3.27M
    MergeState ms;
2948
3.27M
    Py_ssize_t nremaining;
2949
3.27M
    Py_ssize_t minrun;
2950
3.27M
    sortslice lo;
2951
3.27M
    Py_ssize_t saved_ob_size, saved_allocated;
2952
3.27M
    PyObject **saved_ob_item;
2953
3.27M
    PyObject **final_ob_item;
2954
3.27M
    PyObject *result = NULL;            /* guilty until proved innocent */
2955
3.27M
    Py_ssize_t i;
2956
3.27M
    PyObject **keys;
2957
2958
3.27M
    assert(self != NULL);
2959
3.27M
    assert(PyList_Check(self));
2960
3.27M
    if (keyfunc == Py_None)
2961
2.61M
        keyfunc = NULL;
2962
2963
    /* The list is temporarily made empty, so that mutations performed
2964
     * by comparison functions can't affect the slice of memory we're
2965
     * sorting (allowing mutations during sorting is a core-dump
2966
     * factory, since ob_item may change).
2967
     */
2968
3.27M
    saved_ob_size = Py_SIZE(self);
2969
3.27M
    saved_ob_item = self->ob_item;
2970
3.27M
    saved_allocated = self->allocated;
2971
3.27M
    Py_SET_SIZE(self, 0);
2972
3.27M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, NULL);
2973
3.27M
    self->allocated = -1; /* any operation will reset it to >= 0 */
2974
2975
3.27M
    if (keyfunc == NULL) {
2976
2.63M
        keys = NULL;
2977
2.63M
        lo.keys = saved_ob_item;
2978
2.63M
        lo.values = NULL;
2979
2.63M
    }
2980
642k
    else {
2981
642k
        if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
2982
            /* Leverage stack space we allocated but won't otherwise use */
2983
638k
            keys = &ms.temparray[saved_ob_size+1];
2984
4.19k
        else {
2985
4.19k
            keys = PyMem_Malloc(sizeof(PyObject *) * saved_ob_size);
2986
4.19k
            if (keys == NULL) {
2987
0
                PyErr_NoMemory();
2988
0
                goto keyfunc_fail;
2989
0
            }
2990
4.19k
        }
2991
2992
5.47M
        for (i = 0; i < saved_ob_size ; i++) {
2993
4.83M
            keys[i] = PyObject_CallOneArg(keyfunc, saved_ob_item[i]);
2994
4.83M
            if (keys[i] == NULL) {
2995
0
                for (i=i-1 ; i>=0 ; i--)
2996
0
                    Py_DECREF(keys[i]);
2997
0
                if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
2998
0
                    PyMem_Free(keys);
2999
0
                goto keyfunc_fail;
3000
0
            }
3001
4.83M
        }
3002
3003
642k
        lo.keys = keys;
3004
642k
        lo.values = saved_ob_item;
3005
642k
    }
3006
3007
3008
    /* The pre-sort check: here's where we decide which compare function to use.
3009
     * How much optimization is safe? We test for homogeneity with respect to
3010
     * several properties that are expensive to check at compare-time, and
3011
     * set ms appropriately. */
3012
3.27M
    if (saved_ob_size > 1) {
3013
        /* Assume the first element is representative of the whole list. */
3014
273k
        int keys_are_in_tuples = (Py_IS_TYPE(lo.keys[0], &PyTuple_Type) &&
3015
228
                                  Py_SIZE(lo.keys[0]) > 0);
3016
3017
273k
        PyTypeObject* key_type = (keys_are_in_tuples ?
3018
228
                                  Py_TYPE(PyTuple_GET_ITEM(lo.keys[0], 0)) :
3019
273k
                                  Py_TYPE(lo.keys[0]));
3020
3021
273k
        int keys_are_all_same_type = 1;
3022
273k
        int strings_are_latin = 1;
3023
273k
        int ints_are_bounded = 1;
3024
3025
        /* Prove that assumption by checking every key. */
3026
8.91M
        for (i=0; i < saved_ob_size; i++) {
3027
3028
8.63M
            if (keys_are_in_tuples &&
3029
2.27M
                !(Py_IS_TYPE(lo.keys[i], &PyTuple_Type) && Py_SIZE(lo.keys[i]) != 0)) {
3030
0
                keys_are_in_tuples = 0;
3031
0
                keys_are_all_same_type = 0;
3032
0
                break;
3033
0
            }
3034
3035
            /* Note: for lists of tuples, key is the first element of the tuple
3036
             * lo.keys[i], not lo.keys[i] itself! We verify type-homogeneity
3037
             * for lists of tuples in the if-statement directly above. */
3038
8.63M
            PyObject *key = (keys_are_in_tuples ?
3039
2.27M
                             PyTuple_GET_ITEM(lo.keys[i], 0) :
3040
8.63M
                             lo.keys[i]);
3041
3042
8.63M
            if (!Py_IS_TYPE(key, key_type)) {
3043
4
                keys_are_all_same_type = 0;
3044
                /* If keys are in tuple we must loop over the whole list to make
3045
                   sure all items are tuples */
3046
4
                if (!keys_are_in_tuples) {
3047
4
                    break;
3048
4
                }
3049
4
            }
3050
3051
8.63M
            if (keys_are_all_same_type) {
3052
8.63M
                if (key_type == &PyLong_Type &&
3053
6.56M
                    ints_are_bounded &&
3054
4.61M
                    !_PyLong_IsCompact((PyLongObject *)key)) {
3055
3056
6.53k
                    ints_are_bounded = 0;
3057
6.53k
                }
3058
8.63M
                else if (key_type == &PyUnicode_Type &&
3059
946k
                         strings_are_latin &&
3060
878k
                         PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) {
3061
3062
5.16k
                        strings_are_latin = 0;
3063
5.16k
                    }
3064
8.63M
                }
3065
8.63M
            }
3066
3067
        /* Choose the best compare, given what we now know about the keys. */
3068
273k
        if (keys_are_all_same_type) {
3069
3070
273k
            if (key_type == &PyUnicode_Type && strings_are_latin) {
3071
95.7k
                ms.key_compare = unsafe_latin_compare;
3072
95.7k
            }
3073
177k
            else if (key_type == &PyLong_Type && ints_are_bounded) {
3074
80.6k
                ms.key_compare = unsafe_long_compare;
3075
80.6k
            }
3076
96.8k
            else if (key_type == &PyFloat_Type) {
3077
0
                ms.key_compare = unsafe_float_compare;
3078
0
            }
3079
96.8k
            else if ((ms.key_richcompare = key_type->tp_richcompare) != NULL) {
3080
96.8k
                ms.key_compare = unsafe_object_compare;
3081
96.8k
            }
3082
0
            else {
3083
0
                ms.key_compare = safe_object_compare;
3084
0
            }
3085
273k
        }
3086
4
        else {
3087
4
            ms.key_compare = safe_object_compare;
3088
4
        }
3089
3090
273k
        if (keys_are_in_tuples) {
3091
            /* Make sure we're not dealing with tuples of tuples
3092
             * (remember: here, key_type refers list [key[0] for key in keys]) */
3093
228
            if (key_type == &PyTuple_Type) {
3094
0
                ms.tuple_elem_compare = safe_object_compare;
3095
0
            }
3096
228
            else {
3097
228
                ms.tuple_elem_compare = ms.key_compare;
3098
228
            }
3099
3100
228
            ms.key_compare = unsafe_tuple_compare;
3101
228
        }
3102
273k
    }
3103
    /* End of pre-sort check: ms is now set properly! */
3104
3105
3.27M
    merge_init(&ms, saved_ob_size, keys != NULL, &lo);
3106
3107
3.27M
    nremaining = saved_ob_size;
3108
3.27M
    if (nremaining < 2)
3109
3.00M
        goto succeed;
3110
3111
    /* Reverse sort stability achieved by initially reversing the list,
3112
    applying a stable forward sort, then reversing the final result. */
3113
273k
    if (reverse) {
3114
122
        if (keys != NULL)
3115
0
            reverse_slice(&keys[0], &keys[saved_ob_size]);
3116
122
        reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
3117
122
    }
3118
3119
    /* March over the array once, left to right, finding natural runs,
3120
     * and extending short natural runs to minrun elements.
3121
     */
3122
352k
    do {
3123
352k
        Py_ssize_t n;
3124
3125
        /* Identify next run. */
3126
352k
        n = count_run(&ms, &lo, nremaining);
3127
352k
        if (n < 0)
3128
0
            goto fail;
3129
        /* If short, extend to min(minrun, nremaining). */
3130
352k
        minrun = minrun_next(&ms);
3131
352k
        if (n < minrun) {
3132
201k
            const Py_ssize_t force = nremaining <= minrun ?
3133
144k
                              nremaining : minrun;
3134
201k
            if (binarysort(&ms, &lo, force, n) < 0)
3135
0
                goto fail;
3136
201k
            n = force;
3137
201k
        }
3138
        /* Maybe merge pending runs. */
3139
352k
        assert(ms.n == 0 || ms.pending[ms.n -1].base.keys +
3140
352k
                            ms.pending[ms.n-1].len == lo.keys);
3141
352k
        if (found_new_run(&ms, n) < 0)
3142
0
            goto fail;
3143
        /* Push new run on stack. */
3144
352k
        assert(ms.n < MAX_MERGE_PENDING);
3145
352k
        ms.pending[ms.n].base = lo;
3146
352k
        ms.pending[ms.n].len = n;
3147
352k
        ++ms.n;
3148
        /* Advance to find next run. */
3149
352k
        sortslice_advance(&lo, n);
3150
352k
        nremaining -= n;
3151
352k
    } while (nremaining);
3152
3153
273k
    if (merge_force_collapse(&ms) < 0)
3154
0
        goto fail;
3155
273k
    assert(ms.n == 1);
3156
273k
    assert(keys == NULL
3157
273k
           ? ms.pending[0].base.keys == saved_ob_item
3158
273k
           : ms.pending[0].base.keys == &keys[0]);
3159
273k
    assert(ms.pending[0].len == saved_ob_size);
3160
273k
    lo = ms.pending[0].base;
3161
3162
3.27M
succeed:
3163
3.27M
    result = Py_None;
3164
3.27M
fail:
3165
3.27M
    if (keys != NULL) {
3166
5.47M
        for (i = 0; i < saved_ob_size; i++)
3167
4.83M
            Py_DECREF(keys[i]);
3168
642k
        if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
3169
4.19k
            PyMem_Free(keys);
3170
642k
    }
3171
3172
3.27M
    if (self->allocated != -1 && result != NULL) {
3173
        /* The user mucked with the list during the sort,
3174
         * and we don't already have another error to report.
3175
         */
3176
0
        PyErr_SetString(PyExc_ValueError, "list modified during sort");
3177
0
        result = NULL;
3178
0
    }
3179
3180
3.27M
    if (reverse && saved_ob_size > 1)
3181
122
        reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
3182
3183
3.27M
    merge_freemem(&ms);
3184
3185
3.27M
keyfunc_fail:
3186
3.27M
    final_ob_item = self->ob_item;
3187
3.27M
    i = Py_SIZE(self);
3188
3.27M
    Py_SET_SIZE(self, saved_ob_size);
3189
3.27M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, saved_ob_item);
3190
3.27M
    FT_ATOMIC_STORE_SSIZE_RELAXED(self->allocated, saved_allocated);
3191
3.27M
    if (final_ob_item != NULL) {
3192
        /* we cannot use list_clear() for this because it does not
3193
           guarantee that the list is really empty when it returns */
3194
0
        while (--i >= 0) {
3195
0
            Py_XDECREF(final_ob_item[i]);
3196
0
        }
3197
#ifdef Py_GIL_DISABLED
3198
        ensure_shared_on_resize(self);
3199
        bool use_qsbr = _PyObject_GC_IS_SHARED(self);
3200
#else
3201
0
        bool use_qsbr = false;
3202
0
#endif
3203
0
        free_list_items(final_ob_item, use_qsbr);
3204
0
    }
3205
3.27M
    return Py_XNewRef(result);
3206
3.27M
}
3207
#undef IFLT
3208
#undef ISLT
3209
3210
int
3211
PyList_Sort(PyObject *v)
3212
20.0k
{
3213
20.0k
    if (v == NULL || !PyList_Check(v)) {
3214
0
        PyErr_BadInternalCall();
3215
0
        return -1;
3216
0
    }
3217
20.0k
    Py_BEGIN_CRITICAL_SECTION(v);
3218
20.0k
    v = list_sort_impl((PyListObject *)v, NULL, 0);
3219
20.0k
    Py_END_CRITICAL_SECTION();
3220
20.0k
    if (v == NULL)
3221
0
        return -1;
3222
20.0k
    Py_DECREF(v);
3223
20.0k
    return 0;
3224
20.0k
}
3225
3226
/*[clinic input]
3227
@critical_section
3228
list.reverse
3229
3230
Reverse *IN PLACE*.
3231
[clinic start generated code]*/
3232
3233
static PyObject *
3234
list_reverse_impl(PyListObject *self)
3235
/*[clinic end generated code: output=482544fc451abea9 input=04ac8e0c6a66e4d9]*/
3236
0
{
3237
0
    if (Py_SIZE(self) > 1)
3238
0
        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
3239
0
    Py_RETURN_NONE;
3240
0
}
3241
3242
int
3243
PyList_Reverse(PyObject *v)
3244
78
{
3245
78
    PyListObject *self = (PyListObject *)v;
3246
3247
78
    if (v == NULL || !PyList_Check(v)) {
3248
0
        PyErr_BadInternalCall();
3249
0
        return -1;
3250
0
    }
3251
78
    Py_BEGIN_CRITICAL_SECTION(self);
3252
78
    if (Py_SIZE(self) > 1) {
3253
78
        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
3254
78
    }
3255
78
    Py_END_CRITICAL_SECTION()
3256
78
    return 0;
3257
78
}
3258
3259
PyObject *
3260
PyList_AsTuple(PyObject *v)
3261
285k
{
3262
285k
    if (v == NULL || !PyList_Check(v)) {
3263
0
        PyErr_BadInternalCall();
3264
0
        return NULL;
3265
0
    }
3266
285k
    PyObject *ret;
3267
285k
    PyListObject *self = (PyListObject *)v;
3268
285k
    Py_BEGIN_CRITICAL_SECTION(self);
3269
285k
    ret = PyTuple_FromArray(self->ob_item, Py_SIZE(v));
3270
285k
    Py_END_CRITICAL_SECTION();
3271
285k
    return ret;
3272
285k
}
3273
3274
PyObject *
3275
_PyList_AsTupleAndClear(PyListObject *self)
3276
170
{
3277
170
    assert(self != NULL);
3278
170
    PyObject *ret;
3279
170
    if (self->ob_item == NULL) {
3280
0
        return PyTuple_New(0);
3281
0
    }
3282
170
    Py_BEGIN_CRITICAL_SECTION(self);
3283
170
    PyObject **items = self->ob_item;
3284
170
    Py_ssize_t size = Py_SIZE(self);
3285
170
    self->ob_item = NULL;
3286
170
    Py_SET_SIZE(self, 0);
3287
170
    ret = _PyTuple_FromArraySteal(items, size);
3288
170
    free_list_items(items, false);
3289
170
    Py_END_CRITICAL_SECTION();
3290
170
    return ret;
3291
170
}
3292
3293
PyObject *
3294
_PyList_FromStackRefStealOnSuccess(const _PyStackRef *src, Py_ssize_t n)
3295
197M
{
3296
197M
    if (n == 0) {
3297
174M
        return PyList_New(0);
3298
174M
    }
3299
3300
22.9M
    PyListObject *list = (PyListObject *)PyList_New(n);
3301
22.9M
    if (list == NULL) {
3302
0
        return NULL;
3303
0
    }
3304
3305
22.9M
    PyObject **dst = list->ob_item;
3306
60.0M
    for (Py_ssize_t i = 0; i < n; i++) {
3307
37.0M
        dst[i] = PyStackRef_AsPyObjectSteal(src[i]);
3308
37.0M
    }
3309
3310
22.9M
    return (PyObject *)list;
3311
22.9M
}
3312
3313
/*[clinic input]
3314
list.index
3315
3316
    value: object
3317
    start: slice_index(accept={int}) = 0
3318
    stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
3319
    /
3320
3321
Return first index of value.
3322
3323
Raises ValueError if the value is not present.
3324
[clinic start generated code]*/
3325
3326
static PyObject *
3327
list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start,
3328
                Py_ssize_t stop)
3329
/*[clinic end generated code: output=ec51b88787e4e481 input=40ec5826303a0eb1]*/
3330
0
{
3331
0
    if (start < 0) {
3332
0
        start += Py_SIZE(self);
3333
0
        if (start < 0)
3334
0
            start = 0;
3335
0
    }
3336
0
    if (stop < 0) {
3337
0
        stop += Py_SIZE(self);
3338
0
        if (stop < 0)
3339
0
            stop = 0;
3340
0
    }
3341
0
    for (Py_ssize_t i = start; i < stop; i++) {
3342
0
        PyObject *obj = list_get_item_ref(self, i);
3343
0
        if (obj == NULL) {
3344
            // out-of-bounds
3345
0
            break;
3346
0
        }
3347
0
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3348
0
        Py_DECREF(obj);
3349
0
        if (cmp > 0)
3350
0
            return PyLong_FromSsize_t(i);
3351
0
        else if (cmp < 0)
3352
0
            return NULL;
3353
0
    }
3354
0
    PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
3355
0
    return NULL;
3356
0
}
3357
3358
/*[clinic input]
3359
list.count
3360
3361
     value: object
3362
     /
3363
3364
Return number of occurrences of value.
3365
[clinic start generated code]*/
3366
3367
static PyObject *
3368
list_count_impl(PyListObject *self, PyObject *value)
3369
/*[clinic end generated code: output=eff66f14aef2df86 input=3bdc3a5e6f749565]*/
3370
24
{
3371
24
    Py_ssize_t count = 0;
3372
144
    for (Py_ssize_t i = 0; ; i++) {
3373
144
        PyObject *obj = list_get_item_ref(self, i);
3374
144
        if (obj == NULL) {
3375
            // out-of-bounds
3376
24
            break;
3377
24
        }
3378
120
        if (obj == value) {
3379
96
           count++;
3380
96
           Py_DECREF(obj);
3381
96
           continue;
3382
96
        }
3383
24
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3384
24
        Py_DECREF(obj);
3385
24
        if (cmp > 0)
3386
0
            count++;
3387
24
        else if (cmp < 0)
3388
0
            return NULL;
3389
24
    }
3390
24
    return PyLong_FromSsize_t(count);
3391
24
}
3392
3393
/*[clinic input]
3394
@critical_section
3395
list.remove
3396
3397
     value: object
3398
     /
3399
3400
Remove first occurrence of value.
3401
3402
Raises ValueError if the value is not present.
3403
[clinic start generated code]*/
3404
3405
static PyObject *
3406
list_remove_impl(PyListObject *self, PyObject *value)
3407
/*[clinic end generated code: output=b9b76a6633b18778 input=26c813dbb95aa93b]*/
3408
17.2k
{
3409
17.2k
    Py_ssize_t i;
3410
3411
17.2k
    for (i = 0; i < Py_SIZE(self); i++) {
3412
17.2k
        PyObject *obj = self->ob_item[i];
3413
17.2k
        Py_INCREF(obj);
3414
17.2k
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3415
17.2k
        Py_DECREF(obj);
3416
17.2k
        if (cmp > 0) {
3417
17.2k
            if (list_ass_slice_lock_held(self, i, i+1, NULL) == 0)
3418
17.2k
                Py_RETURN_NONE;
3419
0
            return NULL;
3420
17.2k
        }
3421
24
        else if (cmp < 0)
3422
0
            return NULL;
3423
17.2k
    }
3424
2
    PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
3425
2
    return NULL;
3426
17.2k
}
3427
3428
static int
3429
list_traverse(PyObject *self, visitproc visit, void *arg)
3430
59.3M
{
3431
59.3M
    PyListObject *o = (PyListObject *)self;
3432
59.3M
    Py_ssize_t i;
3433
3434
196M
    for (i = Py_SIZE(o); --i >= 0; )
3435
137M
        Py_VISIT(o->ob_item[i]);
3436
59.3M
    return 0;
3437
59.3M
}
3438
3439
static PyObject *
3440
list_richcompare_impl(PyObject *v, PyObject *w, int op)
3441
142k
{
3442
142k
    PyListObject *vl, *wl;
3443
142k
    Py_ssize_t i;
3444
3445
142k
    if (!PyList_Check(v) || !PyList_Check(w))
3446
2.14k
        Py_RETURN_NOTIMPLEMENTED;
3447
3448
140k
    vl = (PyListObject *)v;
3449
140k
    wl = (PyListObject *)w;
3450
3451
140k
    if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
3452
        /* Shortcut: if the lengths differ, the lists differ */
3453
23.7k
        if (op == Py_EQ)
3454
23.7k
            Py_RETURN_FALSE;
3455
0
        else
3456
0
            Py_RETURN_TRUE;
3457
23.7k
    }
3458
3459
    /* Search for the first index where items are different */
3460
174k
    for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
3461
153k
        PyObject *vitem = vl->ob_item[i];
3462
153k
        PyObject *witem = wl->ob_item[i];
3463
153k
        if (vitem == witem) {
3464
47.7k
            continue;
3465
47.7k
        }
3466
3467
105k
        Py_INCREF(vitem);
3468
105k
        Py_INCREF(witem);
3469
105k
        int k = PyObject_RichCompareBool(vitem, witem, Py_EQ);
3470
105k
        Py_DECREF(vitem);
3471
105k
        Py_DECREF(witem);
3472
105k
        if (k < 0)
3473
0
            return NULL;
3474
105k
        if (!k)
3475
95.2k
            break;
3476
105k
    }
3477
3478
116k
    if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
3479
        /* No more items to compare -- compare sizes */
3480
21.3k
        Py_RETURN_RICHCOMPARE(Py_SIZE(vl), Py_SIZE(wl), op);
3481
21.3k
    }
3482
3483
    /* We have an item that differs -- shortcuts for EQ/NE */
3484
95.2k
    if (op == Py_EQ) {
3485
95.2k
        Py_RETURN_FALSE;
3486
95.2k
    }
3487
30
    if (op == Py_NE) {
3488
30
        Py_RETURN_TRUE;
3489
30
    }
3490
3491
    /* Compare the final item again using the proper operator */
3492
0
    PyObject *vitem = vl->ob_item[i];
3493
0
    PyObject *witem = wl->ob_item[i];
3494
0
    Py_INCREF(vitem);
3495
0
    Py_INCREF(witem);
3496
0
    PyObject *result = PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
3497
0
    Py_DECREF(vitem);
3498
0
    Py_DECREF(witem);
3499
0
    return result;
3500
30
}
3501
3502
static PyObject *
3503
list_richcompare(PyObject *v, PyObject *w, int op)
3504
142k
{
3505
142k
    PyObject *ret;
3506
142k
    Py_BEGIN_CRITICAL_SECTION2(v, w);
3507
142k
    ret = list_richcompare_impl(v, w, op);
3508
142k
    Py_END_CRITICAL_SECTION2()
3509
142k
    return ret;
3510
142k
}
3511
3512
/*[clinic input]
3513
list.__init__
3514
3515
    iterable: object(c_default="NULL") = ()
3516
    /
3517
3518
Built-in mutable sequence.
3519
3520
If no argument is given, the constructor creates a new empty list.
3521
The argument must be an iterable if specified.
3522
[clinic start generated code]*/
3523
3524
static int
3525
list___init___impl(PyListObject *self, PyObject *iterable)
3526
/*[clinic end generated code: output=0f3c21379d01de48 input=b3f3fe7206af8f6b]*/
3527
20.5M
{
3528
    /* Verify list invariants established by PyType_GenericAlloc() */
3529
20.5M
    assert(0 <= Py_SIZE(self));
3530
20.5M
    assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
3531
20.5M
    assert(self->ob_item != NULL ||
3532
20.5M
           self->allocated == 0 || self->allocated == -1);
3533
3534
    /* Empty previous contents */
3535
20.5M
    if (self->ob_item != NULL) {
3536
0
        Py_BEGIN_CRITICAL_SECTION(self);
3537
0
        list_clear(self);
3538
0
        Py_END_CRITICAL_SECTION();
3539
0
    }
3540
20.5M
    if (iterable != NULL) {
3541
9.99M
        if (_list_extend(self, iterable) < 0) {
3542
0
            return -1;
3543
0
        }
3544
9.99M
    }
3545
20.5M
    return 0;
3546
20.5M
}
3547
3548
static PyObject *
3549
list_vectorcall(PyObject *type, PyObject * const*args,
3550
                size_t nargsf, PyObject *kwnames)
3551
10.0M
{
3552
10.0M
    if (!_PyArg_NoKwnames("list", kwnames)) {
3553
0
        return NULL;
3554
0
    }
3555
10.0M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
3556
10.0M
    if (!_PyArg_CheckPositional("list", nargs, 0, 1)) {
3557
0
        return NULL;
3558
0
    }
3559
3560
10.0M
    PyObject *list = PyType_GenericAlloc(_PyType_CAST(type), 0);
3561
10.0M
    if (list == NULL) {
3562
0
        return NULL;
3563
0
    }
3564
10.0M
    if (nargs) {
3565
9.99M
        if (list___init___impl((PyListObject *)list, args[0])) {
3566
0
            Py_DECREF(list);
3567
0
            return NULL;
3568
0
        }
3569
9.99M
    }
3570
10.0M
    return list;
3571
10.0M
}
3572
3573
3574
/*[clinic input]
3575
list.__sizeof__
3576
3577
Return the size of the list in memory, in bytes.
3578
[clinic start generated code]*/
3579
3580
static PyObject *
3581
list___sizeof___impl(PyListObject *self)
3582
/*[clinic end generated code: output=3417541f95f9a53e input=b8030a5d5ce8a187]*/
3583
0
{
3584
0
    size_t res = _PyObject_SIZE(Py_TYPE(self));
3585
0
    Py_ssize_t allocated = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->allocated);
3586
0
    res += (size_t)allocated * sizeof(void*);
3587
0
    return PyLong_FromSize_t(res);
3588
0
}
3589
3590
static PyObject *list_iter(PyObject *seq);
3591
static PyObject *list_subscript(PyObject*, PyObject*);
3592
3593
static PyMethodDef list_methods[] = {
3594
    {"__getitem__", list_subscript, METH_O|METH_COEXIST,
3595
     PyDoc_STR("__getitem__($self, index, /)\n--\n\nReturn self[index].")},
3596
    LIST___REVERSED___METHODDEF
3597
    LIST___SIZEOF___METHODDEF
3598
    PY_LIST_CLEAR_METHODDEF
3599
    LIST_COPY_METHODDEF
3600
    LIST_APPEND_METHODDEF
3601
    LIST_INSERT_METHODDEF
3602
    LIST_EXTEND_METHODDEF
3603
    LIST_POP_METHODDEF
3604
    LIST_REMOVE_METHODDEF
3605
    LIST_INDEX_METHODDEF
3606
    LIST_COUNT_METHODDEF
3607
    LIST_REVERSE_METHODDEF
3608
    LIST_SORT_METHODDEF
3609
    {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
3610
    {NULL,              NULL}           /* sentinel */
3611
};
3612
3613
static PySequenceMethods list_as_sequence = {
3614
    list_length,                                /* sq_length */
3615
    list_concat,                                /* sq_concat */
3616
    list_repeat,                                /* sq_repeat */
3617
    list_item,                                  /* sq_item */
3618
    0,                                          /* sq_slice */
3619
    list_ass_item,                              /* sq_ass_item */
3620
    0,                                          /* sq_ass_slice */
3621
    list_contains,                              /* sq_contains */
3622
    list_inplace_concat,                        /* sq_inplace_concat */
3623
    list_inplace_repeat,                        /* sq_inplace_repeat */
3624
};
3625
3626
static inline PyObject *
3627
list_slice_step_lock_held(PyListObject *a, Py_ssize_t start, Py_ssize_t step, Py_ssize_t len)
3628
381
{
3629
381
    PyListObject *np = (PyListObject *)list_new_prealloc(len);
3630
381
    if (np == NULL) {
3631
0
        return NULL;
3632
0
    }
3633
381
    size_t cur;
3634
381
    Py_ssize_t i;
3635
381
    PyObject **src = a->ob_item;
3636
381
    PyObject **dest = np->ob_item;
3637
3.56k
    for (cur = start, i = 0; i < len;
3638
3.18k
            cur += (size_t)step, i++) {
3639
3.18k
        PyObject *v = src[cur];
3640
3.18k
        dest[i] = Py_NewRef(v);
3641
3.18k
    }
3642
381
    Py_SET_SIZE(np, len);
3643
381
    return (PyObject *)np;
3644
381
}
3645
3646
static PyObject *
3647
list_slice_wrap(PyListObject *aa, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t step)
3648
4.36M
{
3649
4.36M
    PyObject *res = NULL;
3650
4.36M
    Py_BEGIN_CRITICAL_SECTION(aa);
3651
4.36M
    Py_ssize_t len = PySlice_AdjustIndices(Py_SIZE(aa), &start, &stop, step);
3652
4.36M
    if (len <= 0) {
3653
468k
        res = PyList_New(0);
3654
468k
    }
3655
3.89M
    else if (step == 1) {
3656
3.89M
        res = list_slice_lock_held(aa, start, stop);
3657
3.89M
    }
3658
381
    else {
3659
381
        res = list_slice_step_lock_held(aa, start, step, len);
3660
381
    }
3661
4.36M
    Py_END_CRITICAL_SECTION();
3662
4.36M
    return res;
3663
4.36M
}
3664
3665
static inline PyObject*
3666
list_slice_subscript(PyObject* self, PyObject* item)
3667
4.36M
{
3668
4.36M
    assert(PyList_Check(self));
3669
4.36M
    assert(PySlice_Check(item));
3670
4.36M
    Py_ssize_t start, stop, step;
3671
4.36M
    if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
3672
0
        return NULL;
3673
0
    }
3674
4.36M
    return list_slice_wrap((PyListObject *)self, start, stop, step);
3675
4.36M
}
3676
3677
PyObject *
3678
_PyList_SliceSubscript(PyObject* _self, PyObject* item)
3679
4.36M
{
3680
4.36M
    return list_slice_subscript(_self, item);
3681
4.36M
}
3682
3683
static PyObject *
3684
list_subscript(PyObject* _self, PyObject* item)
3685
30.3M
{
3686
30.3M
    PyListObject* self = (PyListObject*)_self;
3687
30.3M
    if (_PyIndex_Check(item)) {
3688
30.3M
        Py_ssize_t i;
3689
30.3M
        i = PyNumber_AsSsize_t(item, PyExc_IndexError);
3690
30.3M
        if (i == -1 && PyErr_Occurred())
3691
26
            return NULL;
3692
30.3M
        if (i < 0)
3693
24.6M
            i += PyList_GET_SIZE(self);
3694
30.3M
        return list_item((PyObject *)self, i);
3695
30.3M
    }
3696
272
    else if (PySlice_Check(item)) {
3697
272
        return list_slice_subscript(_self, item);
3698
272
    }
3699
0
    else {
3700
0
        PyErr_Format(PyExc_TypeError,
3701
0
                     "list indices must be integers or slices, not %.200s",
3702
0
                     Py_TYPE(item)->tp_name);
3703
0
        return NULL;
3704
0
    }
3705
30.3M
}
3706
3707
static Py_ssize_t
3708
adjust_slice_indexes(PyListObject *lst,
3709
                     Py_ssize_t *start, Py_ssize_t *stop,
3710
                     Py_ssize_t step)
3711
251k
{
3712
251k
    Py_ssize_t slicelength = PySlice_AdjustIndices(Py_SIZE(lst), start, stop,
3713
251k
                                                   step);
3714
3715
    /* Make sure s[5:2] = [..] inserts at the right place:
3716
        before 5, not before 2. */
3717
251k
    if ((step < 0 && *start < *stop) ||
3718
251k
        (step > 0 && *start > *stop))
3719
0
        *stop = *start;
3720
3721
251k
    return slicelength;
3722
251k
}
3723
3724
static int
3725
list_ass_subscript_lock_held(PyObject *_self, PyObject *item, PyObject *value)
3726
4.25M
{
3727
4.25M
    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(_self);
3728
3729
4.25M
    PyListObject *self = (PyListObject *)_self;
3730
4.25M
    if (_PyIndex_Check(item)) {
3731
4.00M
        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
3732
4.00M
        if (i == -1 && PyErr_Occurred())
3733
0
            return -1;
3734
4.00M
        if (i < 0)
3735
3.99M
            i += PyList_GET_SIZE(self);
3736
4.00M
        return list_ass_item_lock_held(self, i, value);
3737
4.00M
    }
3738
251k
    else if (PySlice_Check(item)) {
3739
251k
        Py_ssize_t start, stop, step;
3740
3741
251k
        if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
3742
0
            return -1;
3743
0
        }
3744
3745
251k
        if (value == NULL) {
3746
            /* delete slice */
3747
130
            PyObject **garbage;
3748
130
            size_t cur;
3749
130
            Py_ssize_t i;
3750
130
            int res;
3751
3752
130
            Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop,
3753
130
                                                          step);
3754
3755
130
            if (step == 1)
3756
130
                return list_ass_slice_lock_held(self, start, stop, value);
3757
3758
0
            if (slicelength <= 0)
3759
0
                return 0;
3760
3761
0
            if (step < 0) {
3762
0
                stop = start + 1;
3763
0
                start = stop + step*(slicelength - 1) - 1;
3764
0
                step = -step;
3765
0
            }
3766
3767
0
            garbage = (PyObject**)
3768
0
                PyMem_Malloc(slicelength*sizeof(PyObject*));
3769
0
            if (!garbage) {
3770
0
                PyErr_NoMemory();
3771
0
                return -1;
3772
0
            }
3773
3774
            /* drawing pictures might help understand these for
3775
               loops. Basically, we memmove the parts of the
3776
               list that are *not* part of the slice: step-1
3777
               items for each item that is part of the slice,
3778
               and then tail end of the list that was not
3779
               covered by the slice */
3780
0
            for (cur = start, i = 0;
3781
0
                 cur < (size_t)stop;
3782
0
                 cur += step, i++) {
3783
0
                Py_ssize_t lim = step - 1;
3784
3785
0
                garbage[i] = PyList_GET_ITEM(self, cur);
3786
3787
0
                if (cur + step >= (size_t)Py_SIZE(self)) {
3788
0
                    lim = Py_SIZE(self) - cur - 1;
3789
0
                }
3790
3791
0
                memmove(self->ob_item + cur - i,
3792
0
                    self->ob_item + cur + 1,
3793
0
                    lim * sizeof(PyObject *));
3794
0
            }
3795
0
            cur = start + (size_t)slicelength * step;
3796
0
            if (cur < (size_t)Py_SIZE(self)) {
3797
0
                memmove(self->ob_item + cur - slicelength,
3798
0
                    self->ob_item + cur,
3799
0
                    (Py_SIZE(self) - cur) *
3800
0
                     sizeof(PyObject *));
3801
0
            }
3802
3803
0
            Py_SET_SIZE(self, Py_SIZE(self) - slicelength);
3804
0
            res = list_resize(self, Py_SIZE(self));
3805
3806
0
            for (i = 0; i < slicelength; i++) {
3807
0
                Py_DECREF(garbage[i]);
3808
0
            }
3809
0
            PyMem_Free(garbage);
3810
3811
0
            return res;
3812
0
        }
3813
251k
        else {
3814
            /* assign slice */
3815
251k
            PyObject *ins, *seq;
3816
251k
            PyObject **garbage, **seqitems, **selfitems;
3817
251k
            Py_ssize_t i;
3818
251k
            size_t cur;
3819
3820
            /* protect against a[::-1] = a */
3821
251k
            if (self == (PyListObject*)value) {
3822
0
                seq = list_slice_lock_held((PyListObject *)value, 0,
3823
0
                                            Py_SIZE(value));
3824
0
            }
3825
251k
            else {
3826
251k
                seq = PySequence_Fast(value,
3827
251k
                                      "must assign iterable "
3828
251k
                                      "to extended slice");
3829
251k
            }
3830
251k
            if (!seq)
3831
0
                return -1;
3832
3833
251k
            Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop,
3834
251k
                                                          step);
3835
3836
251k
            if (step == 1) {
3837
251k
                int res = list_ass_slice_lock_held(self, start, stop, seq);
3838
251k
                Py_DECREF(seq);
3839
251k
                return res;
3840
251k
            }
3841
3842
0
            if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
3843
0
                PyErr_Format(PyExc_ValueError,
3844
0
                    "attempt to assign sequence of "
3845
0
                    "size %zd to extended slice of "
3846
0
                    "size %zd",
3847
0
                         PySequence_Fast_GET_SIZE(seq),
3848
0
                         slicelength);
3849
0
                Py_DECREF(seq);
3850
0
                return -1;
3851
0
            }
3852
3853
0
            if (!slicelength) {
3854
0
                Py_DECREF(seq);
3855
0
                return 0;
3856
0
            }
3857
3858
0
            garbage = (PyObject**)
3859
0
                PyMem_Malloc(slicelength*sizeof(PyObject*));
3860
0
            if (!garbage) {
3861
0
                Py_DECREF(seq);
3862
0
                PyErr_NoMemory();
3863
0
                return -1;
3864
0
            }
3865
3866
0
            selfitems = self->ob_item;
3867
0
            seqitems = PySequence_Fast_ITEMS(seq);
3868
0
            for (cur = start, i = 0; i < slicelength;
3869
0
                 cur += (size_t)step, i++) {
3870
0
                garbage[i] = selfitems[cur];
3871
0
                ins = Py_NewRef(seqitems[i]);
3872
0
                FT_ATOMIC_STORE_PTR_RELEASE(selfitems[cur], ins);
3873
0
            }
3874
3875
0
            for (i = 0; i < slicelength; i++) {
3876
0
                Py_DECREF(garbage[i]);
3877
0
            }
3878
3879
0
            PyMem_Free(garbage);
3880
0
            Py_DECREF(seq);
3881
3882
0
            return 0;
3883
0
        }
3884
251k
    }
3885
0
    else {
3886
0
        PyErr_Format(PyExc_TypeError,
3887
0
                     "list indices must be integers or slices, not %.200s",
3888
0
                     Py_TYPE(item)->tp_name);
3889
0
        return -1;
3890
0
    }
3891
4.25M
}
3892
3893
static int
3894
list_ass_subscript(PyObject *self, PyObject *item, PyObject *value)
3895
4.25M
{
3896
4.25M
    int res;
3897
#ifdef Py_GIL_DISABLED
3898
    if (PySlice_Check(item) && value != NULL && PyList_CheckExact(value)) {
3899
        Py_BEGIN_CRITICAL_SECTION2(self, value);
3900
        res = list_ass_subscript_lock_held(self, item, value);
3901
        Py_END_CRITICAL_SECTION2();
3902
        return res;
3903
    }
3904
#endif
3905
4.25M
    Py_BEGIN_CRITICAL_SECTION(self);
3906
4.25M
    res = list_ass_subscript_lock_held(self, item, value);
3907
4.25M
    Py_END_CRITICAL_SECTION();
3908
4.25M
    return res;
3909
4.25M
}
3910
3911
static PyMappingMethods list_as_mapping = {
3912
    list_length,
3913
    list_subscript,
3914
    list_ass_subscript
3915
};
3916
3917
PyTypeObject PyList_Type = {
3918
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
3919
    "list",
3920
    sizeof(PyListObject),
3921
    0,
3922
    list_dealloc,                               /* tp_dealloc */
3923
    0,                                          /* tp_vectorcall_offset */
3924
    0,                                          /* tp_getattr */
3925
    0,                                          /* tp_setattr */
3926
    0,                                          /* tp_as_async */
3927
    list_repr,                                  /* tp_repr */
3928
    0,                                          /* tp_as_number */
3929
    &list_as_sequence,                          /* tp_as_sequence */
3930
    &list_as_mapping,                           /* tp_as_mapping */
3931
    PyObject_HashNotImplemented,                /* tp_hash */
3932
    0,                                          /* tp_call */
3933
    0,                                          /* tp_str */
3934
    PyObject_GenericGetAttr,                    /* tp_getattro */
3935
    0,                                          /* tp_setattro */
3936
    0,                                          /* tp_as_buffer */
3937
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3938
        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS |
3939
        _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_SEQUENCE,  /* tp_flags */
3940
    list___init____doc__,                       /* tp_doc */
3941
    list_traverse,                              /* tp_traverse */
3942
    list_clear_slot,                            /* tp_clear */
3943
    list_richcompare,                           /* tp_richcompare */
3944
    0,                                          /* tp_weaklistoffset */
3945
    list_iter,                                  /* tp_iter */
3946
    0,                                          /* tp_iternext */
3947
    list_methods,                               /* tp_methods */
3948
    0,                                          /* tp_members */
3949
    0,                                          /* tp_getset */
3950
    0,                                          /* tp_base */
3951
    0,                                          /* tp_dict */
3952
    0,                                          /* tp_descr_get */
3953
    0,                                          /* tp_descr_set */
3954
    0,                                          /* tp_dictoffset */
3955
    list___init__,                              /* tp_init */
3956
    PyType_GenericAlloc,                        /* tp_alloc */
3957
    PyType_GenericNew,                          /* tp_new */
3958
    PyObject_GC_Del,                            /* tp_free */
3959
    .tp_vectorcall = list_vectorcall,
3960
    .tp_version_tag = _Py_TYPE_VERSION_LIST,
3961
};
3962
3963
/*********************** List Iterator **************************/
3964
3965
static void listiter_dealloc(PyObject *);
3966
static int listiter_traverse(PyObject *, visitproc, void *);
3967
static PyObject *listiter_next(PyObject *);
3968
static PyObject *listiter_len(PyObject *, PyObject *);
3969
static PyObject *listiter_reduce_general(void *_it, int forward);
3970
static PyObject *listiter_reduce(PyObject *, PyObject *);
3971
static PyObject *listiter_setstate(PyObject *, PyObject *state);
3972
3973
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
3974
PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3975
PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3976
3977
static PyMethodDef listiter_methods[] = {
3978
    {"__length_hint__", listiter_len, METH_NOARGS, length_hint_doc},
3979
    {"__reduce__", listiter_reduce, METH_NOARGS, reduce_doc},
3980
    {"__setstate__", listiter_setstate, METH_O, setstate_doc},
3981
    {NULL,              NULL}           /* sentinel */
3982
};
3983
3984
PyTypeObject PyListIter_Type = {
3985
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
3986
    "list_iterator",                            /* tp_name */
3987
    sizeof(_PyListIterObject),                  /* tp_basicsize */
3988
    0,                                          /* tp_itemsize */
3989
    /* methods */
3990
    listiter_dealloc,               /* tp_dealloc */
3991
    0,                                          /* tp_vectorcall_offset */
3992
    0,                                          /* tp_getattr */
3993
    0,                                          /* tp_setattr */
3994
    0,                                          /* tp_as_async */
3995
    0,                                          /* tp_repr */
3996
    0,                                          /* tp_as_number */
3997
    0,                                          /* tp_as_sequence */
3998
    0,                                          /* tp_as_mapping */
3999
    0,                                          /* tp_hash */
4000
    0,                                          /* tp_call */
4001
    0,                                          /* tp_str */
4002
    PyObject_GenericGetAttr,                    /* tp_getattro */
4003
    0,                                          /* tp_setattro */
4004
    0,                                          /* tp_as_buffer */
4005
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4006
    0,                                          /* tp_doc */
4007
    listiter_traverse,                          /* tp_traverse */
4008
    0,                                          /* tp_clear */
4009
    0,                                          /* tp_richcompare */
4010
    0,                                          /* tp_weaklistoffset */
4011
    PyObject_SelfIter,                          /* tp_iter */
4012
    listiter_next,                              /* tp_iternext */
4013
    listiter_methods,                           /* tp_methods */
4014
    0,                                          /* tp_members */
4015
};
4016
4017
4018
static PyObject *
4019
list_iter(PyObject *seq)
4020
33.5M
{
4021
33.5M
    if (!PyList_Check(seq)) {
4022
0
        PyErr_BadInternalCall();
4023
0
        return NULL;
4024
0
    }
4025
33.5M
    _PyListIterObject *it = _Py_FREELIST_POP(_PyListIterObject, list_iters);
4026
33.5M
    if (it == NULL) {
4027
2.73M
        it = PyObject_GC_New(_PyListIterObject, &PyListIter_Type);
4028
2.73M
        if (it == NULL) {
4029
0
            return NULL;
4030
0
        }
4031
2.73M
    }
4032
33.5M
    it->it_index = 0;
4033
33.5M
    it->it_seq = (PyListObject *)Py_NewRef(seq);
4034
33.5M
    _PyObject_GC_TRACK(it);
4035
33.5M
    return (PyObject *)it;
4036
33.5M
}
4037
4038
static void
4039
listiter_dealloc(PyObject *self)
4040
33.5M
{
4041
33.5M
    _PyListIterObject *it = (_PyListIterObject *)self;
4042
33.5M
    _PyObject_GC_UNTRACK(it);
4043
33.5M
    Py_XDECREF(it->it_seq);
4044
33.5M
    assert(Py_IS_TYPE(self, &PyListIter_Type));
4045
33.5M
    _Py_FREELIST_FREE(list_iters, it, PyObject_GC_Del);
4046
33.5M
}
4047
4048
static int
4049
listiter_traverse(PyObject *it, visitproc visit, void *arg)
4050
804k
{
4051
804k
    Py_VISIT(((_PyListIterObject *)it)->it_seq);
4052
804k
    return 0;
4053
804k
}
4054
4055
static PyObject *
4056
listiter_next(PyObject *self)
4057
152M
{
4058
152M
    _PyListIterObject *it = (_PyListIterObject *)self;
4059
152M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4060
152M
    if (index < 0) {
4061
169
        return NULL;
4062
169
    }
4063
4064
152M
    PyObject *item = list_get_item_ref(it->it_seq, index);
4065
152M
    if (item == NULL) {
4066
        // out-of-bounds
4067
32.9M
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, -1);
4068
32.9M
#ifndef Py_GIL_DISABLED
4069
32.9M
        PyListObject *seq = it->it_seq;
4070
32.9M
        it->it_seq = NULL;
4071
32.9M
        Py_DECREF(seq);
4072
32.9M
#endif
4073
32.9M
        return NULL;
4074
32.9M
    }
4075
119M
    FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index + 1);
4076
119M
    return item;
4077
152M
}
4078
4079
static PyObject *
4080
listiter_len(PyObject *self, PyObject *Py_UNUSED(ignored))
4081
1.54M
{
4082
1.54M
    assert(self != NULL);
4083
1.54M
    _PyListIterObject *it = (_PyListIterObject *)self;
4084
1.54M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4085
1.54M
    if (index >= 0) {
4086
1.54M
        Py_ssize_t len = PyList_GET_SIZE(it->it_seq) - index;
4087
1.54M
        if (len >= 0)
4088
1.54M
            return PyLong_FromSsize_t(len);
4089
1.54M
    }
4090
0
    return PyLong_FromLong(0);
4091
1.54M
}
4092
4093
static PyObject *
4094
listiter_reduce(PyObject *it, PyObject *Py_UNUSED(ignored))
4095
0
{
4096
0
    return listiter_reduce_general(it, 1);
4097
0
}
4098
4099
static PyObject *
4100
listiter_setstate(PyObject *self, PyObject *state)
4101
0
{
4102
0
    _PyListIterObject *it = (_PyListIterObject *)self;
4103
0
    Py_ssize_t index = PyLong_AsSsize_t(state);
4104
0
    if (index == -1 && PyErr_Occurred())
4105
0
        return NULL;
4106
0
    if (it->it_seq != NULL) {
4107
0
        if (index < -1)
4108
0
            index = -1;
4109
0
        else if (index > PyList_GET_SIZE(it->it_seq))
4110
0
            index = PyList_GET_SIZE(it->it_seq); /* iterator exhausted */
4111
0
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index);
4112
0
    }
4113
0
    Py_RETURN_NONE;
4114
0
}
4115
4116
/*********************** List Reverse Iterator **************************/
4117
4118
typedef struct {
4119
    PyObject_HEAD
4120
    Py_ssize_t it_index;
4121
    PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
4122
} listreviterobject;
4123
4124
static void listreviter_dealloc(PyObject *);
4125
static int listreviter_traverse(PyObject *, visitproc, void *);
4126
static PyObject *listreviter_next(PyObject *);
4127
static PyObject *listreviter_len(PyObject *, PyObject *);
4128
static PyObject *listreviter_reduce(PyObject *, PyObject *);
4129
static PyObject *listreviter_setstate(PyObject *, PyObject *);
4130
4131
static PyMethodDef listreviter_methods[] = {
4132
    {"__length_hint__", listreviter_len, METH_NOARGS, length_hint_doc},
4133
    {"__reduce__", listreviter_reduce, METH_NOARGS, reduce_doc},
4134
    {"__setstate__", listreviter_setstate, METH_O, setstate_doc},
4135
    {NULL,              NULL}           /* sentinel */
4136
};
4137
4138
PyTypeObject PyListRevIter_Type = {
4139
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
4140
    "list_reverseiterator",                     /* tp_name */
4141
    sizeof(listreviterobject),                  /* tp_basicsize */
4142
    0,                                          /* tp_itemsize */
4143
    /* methods */
4144
    listreviter_dealloc,                        /* tp_dealloc */
4145
    0,                                          /* tp_vectorcall_offset */
4146
    0,                                          /* tp_getattr */
4147
    0,                                          /* tp_setattr */
4148
    0,                                          /* tp_as_async */
4149
    0,                                          /* tp_repr */
4150
    0,                                          /* tp_as_number */
4151
    0,                                          /* tp_as_sequence */
4152
    0,                                          /* tp_as_mapping */
4153
    0,                                          /* tp_hash */
4154
    0,                                          /* tp_call */
4155
    0,                                          /* tp_str */
4156
    PyObject_GenericGetAttr,                    /* tp_getattro */
4157
    0,                                          /* tp_setattro */
4158
    0,                                          /* tp_as_buffer */
4159
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4160
    0,                                          /* tp_doc */
4161
    listreviter_traverse,                       /* tp_traverse */
4162
    0,                                          /* tp_clear */
4163
    0,                                          /* tp_richcompare */
4164
    0,                                          /* tp_weaklistoffset */
4165
    PyObject_SelfIter,                          /* tp_iter */
4166
    listreviter_next,                           /* tp_iternext */
4167
    listreviter_methods,                /* tp_methods */
4168
    0,
4169
};
4170
4171
/*[clinic input]
4172
list.__reversed__
4173
4174
Return a reverse iterator over the list.
4175
[clinic start generated code]*/
4176
4177
static PyObject *
4178
list___reversed___impl(PyListObject *self)
4179
/*[clinic end generated code: output=b166f073208c888c input=eadb6e17f8a6a280]*/
4180
52.0M
{
4181
52.0M
    listreviterobject *it;
4182
4183
52.0M
    it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
4184
52.0M
    if (it == NULL)
4185
0
        return NULL;
4186
52.0M
    assert(PyList_Check(self));
4187
52.0M
    it->it_index = PyList_GET_SIZE(self) - 1;
4188
52.0M
    it->it_seq = (PyListObject*)Py_NewRef(self);
4189
52.0M
    PyObject_GC_Track(it);
4190
52.0M
    return (PyObject *)it;
4191
52.0M
}
4192
4193
static void
4194
listreviter_dealloc(PyObject *self)
4195
52.0M
{
4196
52.0M
    listreviterobject *it = (listreviterobject *)self;
4197
52.0M
    PyObject_GC_UnTrack(it);
4198
52.0M
    Py_XDECREF(it->it_seq);
4199
52.0M
    PyObject_GC_Del(it);
4200
52.0M
}
4201
4202
static int
4203
listreviter_traverse(PyObject *it, visitproc visit, void *arg)
4204
810
{
4205
810
    Py_VISIT(((listreviterobject *)it)->it_seq);
4206
810
    return 0;
4207
810
}
4208
4209
static PyObject *
4210
listreviter_next(PyObject *self)
4211
62.7M
{
4212
62.7M
    listreviterobject *it = (listreviterobject *)self;
4213
62.7M
    assert(it != NULL);
4214
62.7M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4215
62.7M
    if (index < 0) {
4216
32.3M
        return NULL;
4217
32.3M
    }
4218
4219
30.4M
    PyListObject *seq = it->it_seq;
4220
30.4M
    assert(PyList_Check(seq));
4221
30.4M
    PyObject *item = list_get_item_ref(seq, index);
4222
30.4M
    if (item != NULL) {
4223
30.4M
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index - 1);
4224
30.4M
        return item;
4225
30.4M
    }
4226
0
    FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, -1);
4227
0
#ifndef Py_GIL_DISABLED
4228
0
    it->it_seq = NULL;
4229
0
    Py_DECREF(seq);
4230
0
#endif
4231
0
    return NULL;
4232
30.4M
}
4233
4234
static PyObject *
4235
listreviter_len(PyObject *self, PyObject *Py_UNUSED(ignored))
4236
0
{
4237
0
    listreviterobject *it = (listreviterobject *)self;
4238
0
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4239
0
    Py_ssize_t len = index + 1;
4240
0
    if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
4241
0
        len = 0;
4242
0
    return PyLong_FromSsize_t(len);
4243
0
}
4244
4245
static PyObject *
4246
listreviter_reduce(PyObject *it, PyObject *Py_UNUSED(ignored))
4247
0
{
4248
0
    return listiter_reduce_general(it, 0);
4249
0
}
4250
4251
static PyObject *
4252
listreviter_setstate(PyObject *self, PyObject *state)
4253
0
{
4254
0
    listreviterobject *it = (listreviterobject *)self;
4255
0
    Py_ssize_t index = PyLong_AsSsize_t(state);
4256
0
    if (index == -1 && PyErr_Occurred())
4257
0
        return NULL;
4258
0
    if (it->it_seq != NULL) {
4259
0
        if (index < -1)
4260
0
            index = -1;
4261
0
        else if (index > PyList_GET_SIZE(it->it_seq) - 1)
4262
0
            index = PyList_GET_SIZE(it->it_seq) - 1;
4263
0
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index);
4264
0
    }
4265
0
    Py_RETURN_NONE;
4266
0
}
4267
4268
/* common pickling support */
4269
4270
static PyObject *
4271
listiter_reduce_general(void *_it, int forward)
4272
0
{
4273
0
    PyObject *list;
4274
0
    PyObject *iter;
4275
4276
    /* _PyEval_GetBuiltin can invoke arbitrary code,
4277
     * call must be before access of iterator pointers.
4278
     * see issue #101765 */
4279
4280
0
    if (forward) {
4281
0
        iter = _PyEval_GetBuiltin(&_Py_ID(iter));
4282
0
        _PyListIterObject *it = (_PyListIterObject *)_it;
4283
0
        Py_ssize_t idx = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4284
0
        if (idx >= 0) {
4285
0
            return Py_BuildValue("N(O)n", iter, it->it_seq, idx);
4286
0
        }
4287
0
    } else {
4288
0
        iter = _PyEval_GetBuiltin(&_Py_ID(reversed));
4289
0
        listreviterobject *it = (listreviterobject *)_it;
4290
0
        Py_ssize_t idx = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4291
0
        if (idx >= 0) {
4292
0
            return Py_BuildValue("N(O)n", iter, it->it_seq, idx);
4293
0
        }
4294
0
    }
4295
    /* empty iterator, create an empty list */
4296
0
    list = PyList_New(0);
4297
0
    if (list == NULL)
4298
0
        return NULL;
4299
0
    return Py_BuildValue("N(N)", iter, list);
4300
0
}