Coverage Report

Created: 2026-03-23 06:45

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
123M
{
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
123M
    PyMem_Free(items);
72
123M
#endif
73
123M
}
74
75
static void
76
ensure_shared_on_resize(PyListObject *self)
77
86.4M
{
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
86.4M
}
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
95.4M
{
106
95.4M
    size_t new_allocated, target_bytes;
107
95.4M
    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
95.4M
    if (allocated >= newsize && newsize >= (allocated >> 1)) {
114
9.05M
        assert(self->ob_item != NULL || newsize == 0);
115
9.05M
        Py_SET_SIZE(self, newsize);
116
9.05M
        return 0;
117
9.05M
    }
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
86.4M
    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
86.4M
    if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize))
134
232k
        new_allocated = ((size_t)newsize + 3) & ~(size_t)3;
135
136
86.4M
    if (newsize == 0)
137
19.5k
        new_allocated = 0;
138
139
86.4M
    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
86.4M
    PyObject **items;
173
86.4M
    if (new_allocated <= (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {
174
86.4M
        target_bytes = new_allocated * sizeof(PyObject *);
175
86.4M
        items = (PyObject **)PyMem_Realloc(self->ob_item, target_bytes);
176
86.4M
    }
177
0
    else {
178
        // integer overflow
179
0
        items = NULL;
180
0
    }
181
86.4M
    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
86.4M
    self->ob_item = items;
191
86.4M
    Py_SET_SIZE(self, newsize);
192
86.4M
    self->allocated = new_allocated;
193
86.4M
#endif
194
86.4M
    return 0;
195
86.4M
}
196
197
static int
198
list_preallocate_exact(PyListObject *self, Py_ssize_t size)
199
6.25M
{
200
6.25M
    PyObject **items;
201
6.25M
    assert(self->ob_item == NULL);
202
6.25M
    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.25M
    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.25M
    items = PyMem_New(PyObject*, size);
220
6.25M
    if (items == NULL) {
221
0
        PyErr_NoMemory();
222
0
        return -1;
223
0
    }
224
6.25M
#endif
225
6.25M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, items);
226
6.25M
    self->allocated = size;
227
6.25M
    return 0;
228
6.25M
}
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
199M
{
243
199M
    if (size < 0) {
244
0
        PyErr_BadInternalCall();
245
0
        return NULL;
246
0
    }
247
248
199M
    PyListObject *op = _Py_FREELIST_POP(PyListObject, lists);
249
199M
    if (op == NULL) {
250
43.2M
        op = PyObject_GC_New(PyListObject, &PyList_Type);
251
43.2M
        if (op == NULL) {
252
0
            return NULL;
253
0
        }
254
43.2M
    }
255
199M
    if (size <= 0) {
256
160M
        op->ob_item = NULL;
257
160M
    }
258
38.7M
    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
38.7M
        op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));
269
38.7M
#endif
270
38.7M
        if (op->ob_item == NULL) {
271
0
            Py_DECREF(op);
272
0
            return PyErr_NoMemory();
273
0
        }
274
38.7M
    }
275
199M
    Py_SET_SIZE(op, size);
276
199M
    op->allocated = size;
277
199M
    _PyObject_GC_TRACK(op);
278
199M
    return (PyObject *) op;
279
199M
}
280
281
static PyObject *
282
list_new_prealloc(Py_ssize_t size)
283
17.3M
{
284
17.3M
    assert(size > 0);
285
17.3M
    PyListObject *op = (PyListObject *) PyList_New(0);
286
17.3M
    if (op == NULL) {
287
0
        return NULL;
288
0
    }
289
17.3M
    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
17.3M
    op->ob_item = PyMem_New(PyObject *, size);
299
17.3M
    if (op->ob_item == NULL) {
300
0
        Py_DECREF(op);
301
0
        return PyErr_NoMemory();
302
0
    }
303
17.3M
#endif
304
17.3M
    op->allocated = size;
305
17.3M
    return (PyObject *) op;
306
17.3M
}
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
205M
{
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
205M
    return (size_t) i < (size_t) limit;
331
205M
}
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
151M
{
383
151M
    if (!valid_index(i, Py_SIZE(op))) {
384
29.1M
        return NULL;
385
29.1M
    }
386
122M
    return Py_NewRef(PyList_GET_ITEM(op, i));
387
151M
}
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.7k
{
408
80.7k
    if (!PyList_Check(op)) {
409
0
        PyErr_SetString(PyExc_TypeError, "expected a list");
410
0
        return NULL;
411
0
    }
412
80.7k
    PyObject *item = list_get_item_ref((PyListObject *)op, i);
413
80.7k
    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.7k
    return item;
419
80.7k
}
420
421
PyObject *
422
_PyList_GetItemRef(PyListObject *list, Py_ssize_t i)
423
1.29M
{
424
1.29M
    return list_get_item_ref(list, i);
425
1.29M
}
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
5.54M
{
457
5.54M
    if (!PyList_Check(op)) {
458
0
        Py_XDECREF(newitem);
459
0
        PyErr_BadInternalCall();
460
0
        return -1;
461
0
    }
462
5.54M
    int ret;
463
5.54M
    PyListObject *self = ((PyListObject *)op);
464
5.54M
    Py_BEGIN_CRITICAL_SECTION(self);
465
5.54M
    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
5.54M
    PyObject *tmp = self->ob_item[i];
473
5.54M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[i], newitem);
474
5.54M
    Py_XDECREF(tmp);
475
5.54M
    ret = 0;
476
5.54M
end:;
477
5.54M
    Py_END_CRITICAL_SECTION();
478
5.54M
    return ret;
479
5.54M
}
480
481
static int
482
ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
483
2.91k
{
484
2.91k
    Py_ssize_t i, n = Py_SIZE(self);
485
2.91k
    PyObject **items;
486
2.91k
    if (v == NULL) {
487
0
        PyErr_BadInternalCall();
488
0
        return -1;
489
0
    }
490
491
2.91k
    assert((size_t)n + 1 < PY_SSIZE_T_MAX);
492
2.91k
    if (list_resize(self, n+1) < 0)
493
0
        return -1;
494
495
2.91k
    if (where < 0) {
496
0
        where += n;
497
0
        if (where < 0)
498
0
            where = 0;
499
0
    }
500
2.91k
    if (where > n)
501
0
        where = n;
502
2.91k
    items = self->ob_item;
503
20.6k
    for (i = n; --i >= where; )
504
17.6k
        FT_ATOMIC_STORE_PTR_RELEASE(items[i+1], items[i]);
505
2.91k
    FT_ATOMIC_STORE_PTR_RELEASE(items[where], Py_NewRef(v));
506
2.91k
    return 0;
507
2.91k
}
508
509
int
510
PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
511
42
{
512
42
    if (!PyList_Check(op)) {
513
0
        PyErr_BadInternalCall();
514
0
        return -1;
515
0
    }
516
42
    PyListObject *self = (PyListObject *)op;
517
42
    int err;
518
42
    Py_BEGIN_CRITICAL_SECTION(self);
519
42
    err = ins1(self, where, newitem);
520
42
    Py_END_CRITICAL_SECTION();
521
42
    return err;
522
42
}
523
524
/* internal, used by _PyList_AppendTakeRef */
525
int
526
_PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem)
527
66.9M
{
528
66.9M
    Py_ssize_t len = Py_SIZE(self);
529
66.9M
    assert(self->allocated == -1 || self->allocated == len);
530
66.9M
    if (list_resize(self, len + 1) < 0) {
531
0
        Py_DECREF(newitem);
532
0
        return -1;
533
0
    }
534
66.9M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[len], newitem);
535
66.9M
    return 0;
536
66.9M
}
537
538
int
539
PyList_Append(PyObject *op, PyObject *newitem)
540
197M
{
541
197M
    if (PyList_Check(op) && (newitem != NULL)) {
542
197M
        int ret;
543
197M
        Py_BEGIN_CRITICAL_SECTION(op);
544
197M
        ret = _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
545
197M
        Py_END_CRITICAL_SECTION();
546
197M
        return ret;
547
197M
    }
548
0
    PyErr_BadInternalCall();
549
0
    return -1;
550
197M
}
551
552
/* Methods */
553
554
static void
555
list_dealloc(PyObject *self)
556
220M
{
557
220M
    PyListObject *op = (PyListObject *)self;
558
220M
    Py_ssize_t i;
559
220M
    PyObject_GC_UnTrack(op);
560
220M
    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
114M
        i = Py_SIZE(op);
566
1.54G
        while (--i >= 0) {
567
1.42G
            Py_XDECREF(op->ob_item[i]);
568
1.42G
        }
569
114M
        free_list_items(op->ob_item, false);
570
114M
        op->ob_item = NULL;
571
114M
    }
572
220M
    if (PyList_CheckExact(op)) {
573
209M
        _Py_FREELIST_FREE(lists, op, PyObject_GC_Del);
574
209M
    }
575
10.8M
    else {
576
10.8M
        PyObject_GC_Del(op);
577
10.8M
    }
578
220M
}
579
580
static PyObject *
581
list_repr_impl(PyListObject *v)
582
3.65M
{
583
3.65M
    int res = Py_ReprEnter((PyObject*)v);
584
3.65M
    if (res != 0) {
585
0
        return (res > 0 ? PyUnicode_FromString("[...]") : NULL);
586
0
    }
587
588
    /* "[" + "1" + ", 2" * (len - 1) + "]" */
589
3.65M
    Py_ssize_t prealloc = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1;
590
3.65M
    PyUnicodeWriter *writer = PyUnicodeWriter_Create(prealloc);
591
3.65M
    PyObject *item = NULL;
592
3.65M
    if (writer == NULL) {
593
0
        goto error;
594
0
    }
595
596
3.65M
    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.9M
    for (Py_ssize_t i = 0; i < Py_SIZE(v); ++i) {
603
        /* Hold a strong reference since repr(item) can mutate the list */
604
7.26M
        item = Py_XNewRef(v->ob_item[i]);
605
606
7.26M
        if (i > 0) {
607
3.61M
            if (PyUnicodeWriter_WriteChar(writer, ',') < 0) {
608
0
                goto error;
609
0
            }
610
3.61M
            if (PyUnicodeWriter_WriteChar(writer, ' ') < 0) {
611
0
                goto error;
612
0
            }
613
3.61M
        }
614
615
7.26M
        if (PyUnicodeWriter_WriteRepr(writer, item) < 0) {
616
0
            goto error;
617
0
        }
618
7.26M
        Py_CLEAR(item);
619
7.26M
    }
620
621
3.65M
    if (PyUnicodeWriter_WriteChar(writer, ']') < 0) {
622
0
        goto error;
623
0
    }
624
625
3.65M
    Py_ReprLeave((PyObject *)v);
626
3.65M
    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.65M
}
634
635
static PyObject *
636
list_repr(PyObject *self)
637
3.65M
{
638
3.65M
    if (PyList_GET_SIZE(self) == 0) {
639
5.05k
        return PyUnicode_FromString("[]");
640
5.05k
    }
641
3.65M
    PyListObject *v = (PyListObject *)self;
642
3.65M
    PyObject *ret = NULL;
643
3.65M
    Py_BEGIN_CRITICAL_SECTION(v);
644
3.65M
    ret = list_repr_impl(v);
645
3.65M
    Py_END_CRITICAL_SECTION();
646
3.65M
    return ret;
647
3.65M
}
648
649
static Py_ssize_t
650
list_length(PyObject *a)
651
41.7M
{
652
41.7M
    return PyList_GET_SIZE(a);
653
41.7M
}
654
655
static int
656
list_contains(PyObject *aa, PyObject *el)
657
11.7k
{
658
659
72.6k
    for (Py_ssize_t i = 0; ; i++) {
660
72.6k
        PyObject *item = list_get_item_ref((PyListObject *)aa, i);
661
72.6k
        if (item == NULL) {
662
            // out-of-bounds
663
10.0k
            return 0;
664
10.0k
        }
665
62.5k
        int cmp = PyObject_RichCompareBool(item, el, Py_EQ);
666
62.5k
        Py_DECREF(item);
667
62.5k
        if (cmp != 0) {
668
1.69k
            return cmp;
669
1.69k
        }
670
62.5k
    }
671
0
    return 0;
672
11.7k
}
673
674
static PyObject *
675
list_item(PyObject *aa, Py_ssize_t i)
676
24.0M
{
677
24.0M
    PyListObject *a = (PyListObject *)aa;
678
24.0M
    if (!valid_index(i, PyList_GET_SIZE(a))) {
679
1.95M
        PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
680
1.95M
        return NULL;
681
1.95M
    }
682
22.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
22.1M
    item = Py_NewRef(a->ob_item[i]);
691
22.1M
#endif
692
22.1M
    return item;
693
24.0M
}
694
695
static PyObject *
696
list_slice_lock_held(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
697
2.50M
{
698
2.50M
    PyListObject *np;
699
2.50M
    PyObject **src, **dest;
700
2.50M
    Py_ssize_t i, len;
701
2.50M
    len = ihigh - ilow;
702
2.50M
    if (len <= 0) {
703
2.45k
        return PyList_New(0);
704
2.45k
    }
705
2.50M
    np = (PyListObject *) list_new_prealloc(len);
706
2.50M
    if (np == NULL)
707
0
        return NULL;
708
709
2.50M
    src = a->ob_item + ilow;
710
2.50M
    dest = np->ob_item;
711
13.5M
    for (i = 0; i < len; i++) {
712
11.0M
        PyObject *v = src[i];
713
11.0M
        dest[i] = Py_NewRef(v);
714
11.0M
    }
715
2.50M
    Py_SET_SIZE(np, len);
716
2.50M
    return (PyObject *)np;
717
2.50M
}
718
719
PyObject *
720
_PyList_BinarySlice(PyObject *container, PyObject *start, PyObject *stop)
721
80.1k
{
722
80.1k
    assert(PyList_CheckExact(container));
723
80.1k
    Py_ssize_t istart = 0;
724
80.1k
    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
80.1k
    if (!_PyEval_SliceIndex(start, &istart)) {
729
0
        return NULL;
730
0
    }
731
80.1k
    if (!_PyEval_SliceIndex(stop, &istop)) {
732
0
        return NULL;
733
0
    }
734
80.1k
    PyObject *ret;
735
80.1k
    Py_BEGIN_CRITICAL_SECTION(container);
736
80.1k
    Py_ssize_t len = Py_SIZE(container);
737
80.1k
    PySlice_AdjustIndices(len, &istart, &istop, 1);
738
80.1k
    ret = list_slice_lock_held((PyListObject *)container, istart, istop);
739
80.1k
    Py_END_CRITICAL_SECTION();
740
80.1k
    return ret;
741
80.1k
}
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.5M
{
772
21.5M
    Py_ssize_t size;
773
21.5M
    Py_ssize_t i;
774
21.5M
    PyObject **src, **dest;
775
21.5M
    PyListObject *np;
776
21.5M
    assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX);
777
21.5M
    size = Py_SIZE(a) + Py_SIZE(b);
778
21.5M
    if (size == 0) {
779
6.75M
        return PyList_New(0);
780
6.75M
    }
781
14.7M
    np = (PyListObject *) list_new_prealloc(size);
782
14.7M
    if (np == NULL) {
783
0
        return NULL;
784
0
    }
785
14.7M
    src = a->ob_item;
786
14.7M
    dest = np->ob_item;
787
381M
    for (i = 0; i < Py_SIZE(a); i++) {
788
366M
        PyObject *v = src[i];
789
366M
        dest[i] = Py_NewRef(v);
790
366M
    }
791
14.7M
    src = b->ob_item;
792
14.7M
    dest = np->ob_item + Py_SIZE(a);
793
351M
    for (i = 0; i < Py_SIZE(b); i++) {
794
336M
        PyObject *v = src[i];
795
336M
        dest[i] = Py_NewRef(v);
796
336M
    }
797
14.7M
    Py_SET_SIZE(np, size);
798
14.7M
    return (PyObject *)np;
799
14.7M
}
800
801
static PyObject *
802
list_concat(PyObject *aa, PyObject *bb)
803
21.5M
{
804
21.5M
    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.5M
    PyListObject *a = (PyListObject *)aa;
811
21.5M
    PyListObject *b = (PyListObject *)bb;
812
21.5M
    PyObject *ret;
813
21.5M
    Py_BEGIN_CRITICAL_SECTION2(a, b);
814
21.5M
    ret = list_concat_lock_held(a, b);
815
21.5M
    Py_END_CRITICAL_SECTION2();
816
21.5M
    return ret;
817
21.5M
}
818
819
static PyObject *
820
list_repeat_lock_held(PyListObject *a, Py_ssize_t n)
821
19.8k
{
822
19.8k
    const Py_ssize_t input_size = Py_SIZE(a);
823
19.8k
    if (input_size == 0 || n <= 0)
824
1.71k
        return PyList_New(0);
825
19.8k
    assert(n > 0);
826
827
18.1k
    if (input_size > PY_SSIZE_T_MAX / n)
828
0
        return PyErr_NoMemory();
829
18.1k
    Py_ssize_t output_size = input_size * n;
830
831
18.1k
    PyListObject *np = (PyListObject *) list_new_prealloc(output_size);
832
18.1k
    if (np == NULL)
833
0
        return NULL;
834
835
18.1k
    PyObject **dest = np->ob_item;
836
18.1k
    if (input_size == 1) {
837
18.1k
        PyObject *elem = a->ob_item[0];
838
18.1k
        _Py_RefcntAdd(elem, n);
839
18.1k
        PyObject **dest_end = dest + output_size;
840
8.00M
        while (dest < dest_end) {
841
7.98M
            *dest++ = elem;
842
7.98M
        }
843
18.1k
    }
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
18.1k
    Py_SET_SIZE(np, output_size);
858
18.1k
    return (PyObject *) np;
859
18.1k
}
860
861
static PyObject *
862
list_repeat(PyObject *aa, Py_ssize_t n)
863
19.8k
{
864
19.8k
    PyObject *ret;
865
19.8k
    PyListObject *a = (PyListObject *)aa;
866
19.8k
    Py_BEGIN_CRITICAL_SECTION(a);
867
19.8k
    ret = list_repeat_lock_held(a, n);
868
19.8k
    Py_END_CRITICAL_SECTION();
869
19.8k
    return ret;
870
19.8k
}
871
872
static void
873
list_clear_impl(PyListObject *a, bool is_resize)
874
8.78M
{
875
8.78M
    PyObject **items = a->ob_item;
876
8.78M
    if (items == NULL) {
877
72
        return;
878
72
    }
879
880
    /* Because XDECREF can recursively invoke operations on
881
       this list, we make it empty first. */
882
8.78M
    Py_ssize_t i = Py_SIZE(a);
883
8.78M
    Py_SET_SIZE(a, 0);
884
8.78M
    FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item, NULL);
885
8.78M
    a->allocated = 0;
886
17.6M
    while (--i >= 0) {
887
8.87M
        Py_XDECREF(items[i]);
888
8.87M
    }
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
8.78M
    bool use_qsbr = false;
896
8.78M
#endif
897
8.78M
    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
8.78M
}
901
902
static void
903
list_clear(PyListObject *a)
904
8.78M
{
905
8.78M
    list_clear_impl(a, true);
906
8.78M
}
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
5.42M
{
920
5.42M
#ifndef Py_GIL_DISABLED
921
5.42M
    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
5.42M
}
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.25M
{
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.25M
    PyObject *recycle_on_stack[8];
959
4.25M
    PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
960
4.25M
    PyObject **item;
961
4.25M
    PyObject **vitem = NULL;
962
4.25M
    PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
963
4.25M
    Py_ssize_t n; /* # of elements in replacement list */
964
4.25M
    Py_ssize_t norig; /* # of elements in list getting replaced */
965
4.25M
    Py_ssize_t d; /* Change in size */
966
4.25M
    Py_ssize_t k;
967
4.25M
    size_t s;
968
4.25M
    int result = -1;            /* guilty until proved innocent */
969
4.25M
#define b ((PyListObject *)v)
970
4.25M
    if (v == NULL)
971
3.75M
        n = 0;
972
501k
    else {
973
501k
        v_as_SF = PySequence_Fast(v, "can only assign an iterable");
974
501k
        if(v_as_SF == NULL)
975
0
            goto Error;
976
501k
        n = PySequence_Fast_GET_SIZE(v_as_SF);
977
501k
        vitem = PySequence_Fast_ITEMS(v_as_SF);
978
501k
    }
979
4.25M
    if (ilow < 0)
980
0
        ilow = 0;
981
4.25M
    else if (ilow > Py_SIZE(a))
982
245k
        ilow = Py_SIZE(a);
983
984
4.25M
    if (ihigh < ilow)
985
0
        ihigh = ilow;
986
4.25M
    else if (ihigh > Py_SIZE(a))
987
245k
        ihigh = Py_SIZE(a);
988
989
4.25M
    norig = ihigh - ilow;
990
4.25M
    assert(norig >= 0);
991
4.25M
    d = n - norig;
992
4.25M
    if (Py_SIZE(a) + d == 0) {
993
626k
        Py_XDECREF(v_as_SF);
994
626k
        list_clear(a);
995
626k
        return 0;
996
626k
    }
997
3.62M
    item = a->ob_item;
998
    /* recycle the items that we are about to remove */
999
3.62M
    s = norig * sizeof(PyObject *);
1000
    /* If norig == 0, item might be NULL, in which case we may not memcpy from it. */
1001
3.62M
    if (s) {
1002
3.15M
        if (s > sizeof(recycle_on_stack)) {
1003
80
            recycle = (PyObject **)PyMem_Malloc(s);
1004
80
            if (recycle == NULL) {
1005
0
                PyErr_NoMemory();
1006
0
                goto Error;
1007
0
            }
1008
80
        }
1009
3.15M
        memcpy(recycle, &item[ilow], s);
1010
3.15M
    }
1011
1012
3.62M
    if (d < 0) { /* Delete -d items */
1013
3.14M
        Py_ssize_t tail = Py_SIZE(a) - ihigh;
1014
3.14M
        ptr_wise_atomic_memmove(a, &item[ihigh+d], &item[ihigh], tail);
1015
3.14M
        (void)list_resize(a, Py_SIZE(a) + d); // NB: shrinking a list can't fail
1016
3.14M
        item = a->ob_item;
1017
3.14M
    }
1018
480k
    else if (d > 0) { /* Insert d items */
1019
478k
        k = Py_SIZE(a);
1020
478k
        if (list_resize(a, k+d) < 0)
1021
0
            goto Error;
1022
478k
        item = a->ob_item;
1023
478k
        ptr_wise_atomic_memmove(a, &item[ihigh+d], &item[ihigh], k - ihigh);
1024
478k
    }
1025
22.2M
    for (k = 0; k < n; k++, ilow++) {
1026
18.5M
        PyObject *w = vitem[k];
1027
18.5M
        FT_ATOMIC_STORE_PTR_RELEASE(item[ilow], Py_XNewRef(w));
1028
18.5M
    }
1029
6.78M
    for (k = norig - 1; k >= 0; --k)
1030
3.15M
        Py_XDECREF(recycle[k]);
1031
3.62M
    result = 0;
1032
3.62M
 Error:
1033
3.62M
    if (recycle != recycle_on_stack)
1034
80
        PyMem_Free(recycle);
1035
3.62M
    Py_XDECREF(v_as_SF);
1036
3.62M
    return result;
1037
3.62M
#undef b
1038
3.62M
}
1039
1040
static int
1041
list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1042
3.98M
{
1043
3.98M
    int ret;
1044
3.98M
    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.98M
    else if (v != NULL && PyList_CheckExact(v)) {
1058
47.4k
        Py_BEGIN_CRITICAL_SECTION2(a, v);
1059
47.4k
        ret = list_ass_slice_lock_held(a, ilow, ihigh, v);
1060
47.4k
        Py_END_CRITICAL_SECTION2();
1061
47.4k
    }
1062
3.93M
    else {
1063
3.93M
        Py_BEGIN_CRITICAL_SECTION(a);
1064
3.93M
        ret = list_ass_slice_lock_held(a, ilow, ihigh, v);
1065
3.93M
        Py_END_CRITICAL_SECTION();
1066
3.93M
    }
1067
3.98M
    return ret;
1068
3.98M
}
1069
1070
int
1071
PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1072
3.98M
{
1073
3.98M
    if (!PyList_Check(a)) {
1074
0
        PyErr_BadInternalCall();
1075
0
        return -1;
1076
0
    }
1077
3.98M
    return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
1078
3.98M
}
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
3.77M
{
1140
3.77M
    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
3.77M
    PyObject *tmp = a->ob_item[i];
1146
3.77M
    if (v == NULL) {
1147
10.7k
        Py_ssize_t size = Py_SIZE(a);
1148
48.6M
        for (Py_ssize_t idx = i; idx < size - 1; idx++) {
1149
48.6M
            FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item[idx], a->ob_item[idx + 1]);
1150
48.6M
        }
1151
10.7k
        Py_SET_SIZE(a, size - 1);
1152
10.7k
    }
1153
3.76M
    else {
1154
3.76M
        FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item[i], Py_NewRef(v));
1155
3.76M
    }
1156
3.77M
    Py_DECREF(tmp);
1157
3.77M
    return 0;
1158
3.77M
}
1159
1160
static int
1161
list_ass_item(PyObject *aa, Py_ssize_t i, PyObject *v)
1162
4.60k
{
1163
4.60k
    int ret;
1164
4.60k
    PyListObject *a = (PyListObject *)aa;
1165
4.60k
    Py_BEGIN_CRITICAL_SECTION(a);
1166
4.60k
    ret = list_ass_item_lock_held(a, i, v);
1167
4.60k
    Py_END_CRITICAL_SECTION();
1168
4.60k
    return ret;
1169
4.60k
}
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
2.87k
{
1186
2.87k
    if (ins1(self, index, object) == 0) {
1187
2.87k
        Py_RETURN_NONE;
1188
2.87k
    }
1189
0
    return NULL;
1190
2.87k
}
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
179
{
1203
179
    list_clear(self);
1204
179
    Py_RETURN_NONE;
1205
179
}
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
118M
{
1235
118M
    if (_PyList_AppendTakeRef(self, Py_NewRef(object)) < 0) {
1236
0
        return NULL;
1237
0
    }
1238
118M
    Py_RETURN_NONE;
1239
118M
}
1240
1241
static int
1242
list_extend_fast(PyListObject *self, PyObject *iterable)
1243
15.0M
{
1244
15.0M
    Py_ssize_t n = PySequence_Fast_GET_SIZE(iterable);
1245
15.0M
    if (n == 0) {
1246
        /* short circuit when iterable is empty */
1247
8.94M
        return 0;
1248
8.94M
    }
1249
1250
6.09M
    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
6.09M
    assert(m < PY_SSIZE_T_MAX - n);
1254
6.09M
    if (self->ob_item == NULL) {
1255
1.34M
        if (list_preallocate_exact(self, n) < 0) {
1256
0
            return -1;
1257
0
        }
1258
1.34M
        Py_SET_SIZE(self, n);
1259
1.34M
    }
1260
4.74M
    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
6.09M
    PyObject **src = PySequence_Fast_ITEMS(iterable);
1271
6.09M
    PyObject **dest = self->ob_item + m;
1272
42.6M
    for (Py_ssize_t i = 0; i < n; i++) {
1273
36.5M
        PyObject *o = src[i];
1274
36.5M
        FT_ATOMIC_STORE_PTR_RELEASE(dest[i], Py_NewRef(o));
1275
36.5M
    }
1276
6.09M
    return 0;
1277
6.09M
}
1278
1279
static int
1280
list_extend_iter_lock_held(PyListObject *self, PyObject *iterable)
1281
5.52M
{
1282
5.52M
    PyObject *it = PyObject_GetIter(iterable);
1283
5.52M
    if (it == NULL) {
1284
0
        return -1;
1285
0
    }
1286
5.52M
    PyObject *(*iternext)(PyObject *) = *Py_TYPE(it)->tp_iternext;
1287
1288
    /* Guess a result list size. */
1289
5.52M
    Py_ssize_t n = PyObject_LengthHint(iterable, 8);
1290
5.52M
    if (n < 0) {
1291
0
        Py_DECREF(it);
1292
0
        return -1;
1293
0
    }
1294
1295
5.52M
    Py_ssize_t m = Py_SIZE(self);
1296
5.52M
    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.52M
    else if (self->ob_item == NULL) {
1303
5.24M
        if (n && list_preallocate_exact(self, n) < 0)
1304
0
            goto error;
1305
5.24M
    }
1306
283k
    else {
1307
        /* Make room. */
1308
283k
        if (list_resize(self, m + n) < 0) {
1309
0
            goto error;
1310
0
        }
1311
1312
        /* Make the list sane again. */
1313
283k
        Py_SET_SIZE(self, m);
1314
283k
    }
1315
1316
    /* Run iterator to exhaustion. */
1317
57.4M
    for (;;) {
1318
57.4M
        PyObject *item = iternext(it);
1319
57.4M
        if (item == NULL) {
1320
5.52M
            if (PyErr_Occurred()) {
1321
622
                if (PyErr_ExceptionMatches(PyExc_StopIteration))
1322
0
                    PyErr_Clear();
1323
622
                else
1324
622
                    goto error;
1325
622
            }
1326
5.52M
            break;
1327
5.52M
        }
1328
1329
51.9M
        if (Py_SIZE(self) < self->allocated) {
1330
51.2M
            Py_ssize_t len = Py_SIZE(self);
1331
51.2M
            FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[len], item);  // steals item ref
1332
51.2M
            Py_SET_SIZE(self, len + 1);
1333
51.2M
        }
1334
700k
        else {
1335
700k
            if (_PyList_AppendTakeRef(self, item) < 0)
1336
0
                goto error;
1337
700k
        }
1338
51.9M
    }
1339
1340
    /* Cut back result list if initial guess was too large. */
1341
5.52M
    if (Py_SIZE(self) < self->allocated) {
1342
3.89M
        if (list_resize(self, Py_SIZE(self)) < 0)
1343
0
            goto error;
1344
3.89M
    }
1345
1346
5.52M
    Py_DECREF(it);
1347
5.52M
    return 0;
1348
1349
622
  error:
1350
622
    Py_DECREF(it);
1351
622
    return -1;
1352
5.52M
}
1353
1354
static int
1355
list_extend_lock_held(PyListObject *self, PyObject *iterable)
1356
15.0M
{
1357
15.0M
    PyObject *seq = PySequence_Fast(iterable, "argument must be iterable");
1358
15.0M
    if (!seq) {
1359
0
        return -1;
1360
0
    }
1361
1362
15.0M
    int res = list_extend_fast(self, seq);
1363
15.0M
    Py_DECREF(seq);
1364
15.0M
    return res;
1365
15.0M
}
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
639
        return 0;
1375
639
    }
1376
16.5k
    if (list_resize(self, r) < 0) {
1377
0
        return -1;
1378
0
    }
1379
1380
16.5k
    assert(self->ob_item != NULL);
1381
    /* populate the end of self with iterable's items */
1382
16.5k
    Py_ssize_t setpos = 0;
1383
16.5k
    Py_hash_t hash;
1384
16.5k
    PyObject *key;
1385
16.5k
    PyObject **dest = self->ob_item + m;
1386
96.8k
    while (_PySet_NextEntryRef((PyObject *)other, &setpos, &key, &hash)) {
1387
80.3k
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, key);
1388
80.3k
        dest++;
1389
80.3k
    }
1390
16.5k
    Py_SET_SIZE(self, r);
1391
16.5k
    return 0;
1392
16.5k
}
1393
1394
static int
1395
list_extend_dict(PyListObject *self, PyDictObject *dict, int which_item)
1396
3.32M
{
1397
    // which_item: 0 for keys and 1 for values
1398
3.32M
    Py_ssize_t m = Py_SIZE(self);
1399
3.32M
    Py_ssize_t n = PyDict_GET_SIZE(dict);
1400
3.32M
    Py_ssize_t r = m + n;
1401
3.32M
    if (r == 0) {
1402
0
        return 0;
1403
0
    }
1404
3.32M
    if (list_resize(self, r) < 0) {
1405
0
        return -1;
1406
0
    }
1407
1408
3.32M
    assert(self->ob_item != NULL);
1409
3.32M
    PyObject **dest = self->ob_item + m;
1410
3.32M
    Py_ssize_t pos = 0;
1411
3.32M
    PyObject *keyvalue[2];
1412
8.01M
    while (_PyDict_Next((PyObject *)dict, &pos, &keyvalue[0], &keyvalue[1], NULL)) {
1413
4.69M
        PyObject *obj = keyvalue[which_item];
1414
4.69M
        Py_INCREF(obj);
1415
4.69M
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, obj);
1416
4.69M
        dest++;
1417
4.69M
    }
1418
1419
3.32M
    Py_SET_SIZE(self, r);
1420
3.32M
    return 0;
1421
3.32M
}
1422
1423
static int
1424
list_extend_dictitems(PyListObject *self, PyDictObject *dict)
1425
7
{
1426
7
    Py_ssize_t m = Py_SIZE(self);
1427
7
    Py_ssize_t n = PyDict_GET_SIZE(dict);
1428
7
    Py_ssize_t r = m + n;
1429
7
    if (r == 0) {
1430
0
        return 0;
1431
0
    }
1432
7
    if (list_resize(self, r) < 0) {
1433
0
        return -1;
1434
0
    }
1435
1436
7
    assert(self->ob_item != NULL);
1437
7
    PyObject **dest = self->ob_item + m;
1438
7
    Py_ssize_t pos = 0;
1439
7
    Py_ssize_t i = 0;
1440
7
    PyObject *key_value[2];
1441
876
    while (_PyDict_Next((PyObject *)dict, &pos, &key_value[0], &key_value[1], NULL)) {
1442
869
        PyObject *item = PyTuple_FromArray(key_value, 2);
1443
869
        if (item == NULL) {
1444
0
            Py_SET_SIZE(self, m + i);
1445
0
            return -1;
1446
0
        }
1447
869
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, item);
1448
869
        dest++;
1449
869
        i++;
1450
869
    }
1451
1452
7
    Py_SET_SIZE(self, r);
1453
7
    return 0;
1454
7
}
1455
1456
static int
1457
_list_extend(PyListObject *self, PyObject *iterable)
1458
23.9M
{
1459
    // Special case:
1460
    // lists and tuples which can use PySequence_Fast ops
1461
23.9M
    int res = -1;
1462
23.9M
    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
23.9M
    else if (PyList_CheckExact(iterable)) {
1468
10.2M
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1469
10.2M
        res = list_extend_lock_held(self, iterable);
1470
10.2M
        Py_END_CRITICAL_SECTION2();
1471
10.2M
    }
1472
13.6M
    else if (PyTuple_CheckExact(iterable)) {
1473
4.76M
        Py_BEGIN_CRITICAL_SECTION(self);
1474
4.76M
        res = list_extend_lock_held(self, iterable);
1475
4.76M
        Py_END_CRITICAL_SECTION();
1476
4.76M
    }
1477
8.86M
    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.84M
    else if (PyDict_CheckExact(iterable)) {
1483
3.31M
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1484
3.31M
        res = list_extend_dict(self, (PyDictObject *)iterable, 0 /*keys*/);
1485
3.31M
        Py_END_CRITICAL_SECTION2();
1486
3.31M
    }
1487
5.52M
    else if (Py_IS_TYPE(iterable, &PyDictKeys_Type)) {
1488
570
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1489
570
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1490
570
        res = list_extend_dict(self, dict, 0 /*keys*/);
1491
570
        Py_END_CRITICAL_SECTION2();
1492
570
    }
1493
5.52M
    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.52M
    else if (Py_IS_TYPE(iterable, &PyDictItems_Type)) {
1500
7
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1501
7
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1502
7
        res = list_extend_dictitems(self, dict);
1503
7
        Py_END_CRITICAL_SECTION2();
1504
7
    }
1505
5.52M
    else {
1506
5.52M
        Py_BEGIN_CRITICAL_SECTION(self);
1507
5.52M
        res = list_extend_iter_lock_held(self, iterable);
1508
5.52M
        Py_END_CRITICAL_SECTION();
1509
5.52M
    }
1510
23.9M
    return res;
1511
23.9M
}
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
13.4M
{
1526
13.4M
    if (_list_extend(self, iterable) < 0) {
1527
622
        return NULL;
1528
622
    }
1529
13.4M
    Py_RETURN_NONE;
1530
13.4M
}
1531
1532
PyObject *
1533
_PyList_Extend(PyListObject *self, PyObject *iterable)
1534
12.2M
{
1535
12.2M
    return list_extend((PyObject*)self, iterable);
1536
12.2M
}
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
198k
{
1566
198k
    PyListObject *self = (PyListObject *)_self;
1567
198k
    if (_list_extend(self, other) < 0) {
1568
0
        return NULL;
1569
0
    }
1570
198k
    return Py_NewRef(self);
1571
198k
}
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
20.7M
{
1589
20.7M
    PyObject *v;
1590
1591
20.7M
    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
20.7M
    if (index < 0)
1597
17.8M
        index += Py_SIZE(self);
1598
20.7M
    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
20.7M
    PyObject **items = self->ob_item;
1604
20.7M
    v = items[index];
1605
20.7M
    if (Py_SIZE(self) == 1) {
1606
8.15M
        Py_INCREF(v);
1607
8.15M
        list_clear(self);
1608
8.15M
        return v;
1609
8.15M
    }
1610
12.6M
    Py_ssize_t size_after_pop = Py_SIZE(self) - 1;
1611
12.6M
    if (index < size_after_pop) {
1612
1.80M
        ptr_wise_atomic_memmove(self, &items[index], &items[index+1],
1613
1.80M
                                size_after_pop - index);
1614
1.80M
    }
1615
12.6M
    list_resize(self, size_after_pop);  // NB: shrinking a list can't fail
1616
12.6M
    return v;
1617
20.7M
}
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
115k
{
1623
115k
    assert(lo && hi);
1624
1625
115k
    --hi;
1626
3.81M
    while (lo < hi) {
1627
3.69M
        PyObject *t = *lo;
1628
3.69M
        FT_ATOMIC_STORE_PTR_RELEASE(*lo, *hi);
1629
3.69M
        FT_ATOMIC_STORE_PTR_RELEASE(*hi, t);
1630
3.69M
        ++lo;
1631
3.69M
        --hi;
1632
3.69M
    }
1633
115k
}
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
36.2k
{
1656
36.2k
    s1->keys[i] = s2->keys[j];
1657
36.2k
    if (s1->values != NULL)
1658
29.6k
        s1->values[i] = s2->values[j];
1659
36.2k
}
1660
1661
Py_LOCAL_INLINE(void)
1662
sortslice_copy_incr(sortslice *dst, sortslice *src)
1663
1.04M
{
1664
1.04M
    *dst->keys++ = *src->keys++;
1665
1.04M
    if (dst->values != NULL)
1666
432k
        *dst->values++ = *src->values++;
1667
1.04M
}
1668
1669
Py_LOCAL_INLINE(void)
1670
sortslice_copy_decr(sortslice *dst, sortslice *src)
1671
2.71M
{
1672
2.71M
    *dst->keys-- = *src->keys--;
1673
2.71M
    if (dst->values != NULL)
1674
451k
        *dst->values-- = *src->values--;
1675
2.71M
}
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
169k
{
1682
169k
    memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1683
169k
    if (s1->values != NULL)
1684
149k
        memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1685
169k
}
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
121k
{
1691
121k
    memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1692
121k
    if (s1->values != NULL)
1693
103k
        memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1694
121k
}
1695
1696
Py_LOCAL_INLINE(void)
1697
sortslice_advance(sortslice *slice, Py_ssize_t n)
1698
723k
{
1699
723k
    slice->keys += n;
1700
723k
    if (slice->values != NULL)
1701
569k
        slice->values += n;
1702
723k
}
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
19.9M
#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
16.4M
#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail;  \
1716
16.4M
           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.16M
#define MIN_GALLOP 7
1729
1730
/* Avoid malloc for small temp arrays. */
1731
4.15M
#define MERGESTATE_TEMP_SIZE 256
1732
1733
/* The largest value of minrun. This must be a power of 2, and >= 1 */
1734
2.97M
#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
133k
{
1815
133k
    Py_ssize_t k; /* for IFLT macro expansion */
1816
133k
    PyObject ** const a = ss->keys;
1817
133k
    PyObject ** const v = ss->values;
1818
133k
    const bool has_values = v != NULL;
1819
133k
    PyObject *pivot;
1820
133k
    Py_ssize_t M;
1821
1822
133k
    assert(0 <= ok && ok <= n && 1 <= n && n <= MAX_MINRUN);
1823
    /* assert a[:ok] is sorted */
1824
133k
    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
133k
    Py_ssize_t L, R;
1877
2.31M
    for (; ok < n; ++ok) {
1878
        /* set L to where a[ok] belongs */
1879
2.18M
        L = 0;
1880
2.18M
        R = ok;
1881
2.18M
        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.18M
        assert(L < R);
1888
9.36M
        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
9.36M
            M = (L + R) >> 1;
1892
9.36M
#if 1 // straightforward, but highly unpredictable branch on random data
1893
9.36M
            IFLT(pivot, a[M])
1894
3.88M
                R = M;
1895
5.47M
            else
1896
5.47M
                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
9.36M
        } while (L < R);
1911
2.18M
        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
17.2M
        for (M = ok; M > L; --M)
1918
15.0M
            a[M] = a[M - 1];
1919
2.18M
        a[L] = pivot;
1920
2.18M
        if (has_values) {
1921
1.43M
            pivot = v[ok];
1922
7.60M
            for (M = ok; M > L; --M)
1923
6.16M
                v[M] = v[M - 1];
1924
1.43M
            v[L] = pivot;
1925
1.43M
        }
1926
2.18M
    }
1927
133k
#endif // pick binary or regular insertion sort
1928
133k
    return 0;
1929
1930
0
 fail:
1931
0
    return -1;
1932
133k
}
1933
1934
static void
1935
sortslice_reverse(sortslice *s, Py_ssize_t n)
1936
73.2k
{
1937
73.2k
    reverse_slice(s->keys, &s->keys[n]);
1938
73.2k
    if (s->values != NULL)
1939
41.6k
        reverse_slice(s->values, &s->values[n]);
1940
73.2k
}
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
255k
{
1953
255k
    Py_ssize_t k; /* used by IFLT macro expansion */
1954
255k
    Py_ssize_t n;
1955
255k
    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
255k
#define REVERSE_LAST_NEQ                        \
1964
2.34M
    if (neq) {                                  \
1965
7.91k
        sortslice slice = *slo;                 \
1966
7.91k
        ++neq;                                  \
1967
7.91k
        sortslice_advance(&slice, n - neq);     \
1968
7.91k
        sortslice_reverse(&slice, neq);         \
1969
7.91k
        neq = 0;                                \
1970
7.91k
    }
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
255k
#define IF_NEXT_LARGER  IFLT(lo[n-1], lo[n])
1978
4.98M
#define IF_NEXT_SMALLER IFLT(lo[n], lo[n-1])
1979
1980
255k
    assert(nremaining);
1981
    /* try ascending run first */
1982
2.41M
    for (n = 1; n < nremaining; ++n) {
1983
2.33M
        IF_NEXT_SMALLER
1984
177k
            break;
1985
2.33M
    }
1986
255k
    if (n == nremaining)
1987
77.8k
        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
177k
    if (n > 1) {
1999
121k
        IFLT(lo[0], lo[n-1])
2000
116k
            return n;
2001
4.68k
        sortslice_reverse(slo, n);
2002
4.68k
    }
2003
60.6k
    ++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
60.6k
    Py_ssize_t neq = 0;
2010
2.37M
    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
60.1k
        else {
2018
60.1k
            IF_NEXT_LARGER /* descending run is over */
2019
31.8k
                break;
2020
28.3k
            else /* not x < y and not y < x implies x == y */
2021
28.3k
                ++neq;
2022
60.1k
        }
2023
2.34M
    }
2024
60.6k
    REVERSE_LAST_NEQ
2025
60.6k
    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
329k
    for ( ; n < nremaining; ++n) {
2032
299k
        IF_NEXT_SMALLER
2033
30.4k
            break;
2034
299k
    }
2035
2036
60.6k
    return n;
2037
0
fail:
2038
0
    return -1;
2039
2040
60.6k
#undef REVERSE_LAST_NEQ
2041
60.6k
#undef IF_NEXT_SMALLER
2042
60.6k
#undef IF_NEXT_LARGER
2043
60.6k
}
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
169k
{
2069
169k
    Py_ssize_t ofs;
2070
169k
    Py_ssize_t lastofs;
2071
169k
    Py_ssize_t k;
2072
2073
169k
    assert(key && a && n > 0 && hint >= 0 && hint < n);
2074
2075
169k
    a += hint;
2076
169k
    lastofs = 0;
2077
169k
    ofs = 1;
2078
169k
    IFLT(*a, key) {
2079
        /* a[hint] < key -- gallop right, until
2080
         * a[hint + lastofs] < key <= a[hint + ofs]
2081
         */
2082
84.2k
        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
2083
252k
        while (ofs < maxofs) {
2084
194k
            IFLT(a[ofs], key) {
2085
168k
                lastofs = ofs;
2086
168k
                assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2087
168k
                ofs = (ofs << 1) + 1;
2088
168k
            }
2089
26.1k
            else                /* key <= a[hint + ofs] */
2090
26.1k
                break;
2091
194k
        }
2092
84.2k
        if (ofs > maxofs)
2093
22.1k
            ofs = maxofs;
2094
        /* Translate back to offsets relative to &a[0]. */
2095
84.2k
        lastofs += hint;
2096
84.2k
        ofs += hint;
2097
84.2k
    }
2098
84.7k
    else {
2099
        /* key <= a[hint] -- gallop left, until
2100
         * a[hint - ofs] < key <= a[hint - lastofs]
2101
         */
2102
84.7k
        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
2103
268k
        while (ofs < maxofs) {
2104
238k
            IFLT(*(a-ofs), key)
2105
54.6k
                break;
2106
            /* key <= a[hint - ofs] */
2107
183k
            lastofs = ofs;
2108
183k
            assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2109
183k
            ofs = (ofs << 1) + 1;
2110
183k
        }
2111
84.7k
        if (ofs > maxofs)
2112
17.6k
            ofs = maxofs;
2113
        /* Translate back to positive offsets relative to &a[0]. */
2114
84.7k
        k = lastofs;
2115
84.7k
        lastofs = hint - ofs;
2116
84.7k
        ofs = hint - k;
2117
84.7k
    }
2118
169k
    a -= hint;
2119
2120
169k
    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
169k
    ++lastofs;
2126
473k
    while (lastofs < ofs) {
2127
304k
        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
2128
2129
304k
        IFLT(a[m], key)
2130
155k
            lastofs = m+1;              /* a[m] < key */
2131
149k
        else
2132
149k
            ofs = m;                    /* key <= a[m] */
2133
304k
    }
2134
169k
    assert(lastofs == ofs);             /* so a[ofs-1] < key <= a[ofs] */
2135
169k
    return ofs;
2136
2137
0
fail:
2138
0
    return -1;
2139
169k
}
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
187k
{
2158
187k
    Py_ssize_t ofs;
2159
187k
    Py_ssize_t lastofs;
2160
187k
    Py_ssize_t k;
2161
2162
187k
    assert(key && a && n > 0 && hint >= 0 && hint < n);
2163
2164
187k
    a += hint;
2165
187k
    lastofs = 0;
2166
187k
    ofs = 1;
2167
187k
    IFLT(key, *a) {
2168
        /* key < a[hint] -- gallop left, until
2169
         * a[hint - ofs] <= key < a[hint - lastofs]
2170
         */
2171
71.0k
        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
2172
181k
        while (ofs < maxofs) {
2173
131k
            IFLT(key, *(a-ofs)) {
2174
110k
                lastofs = ofs;
2175
110k
                assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2176
110k
                ofs = (ofs << 1) + 1;
2177
110k
            }
2178
20.8k
            else                /* a[hint - ofs] <= key */
2179
20.8k
                break;
2180
131k
        }
2181
71.0k
        if (ofs > maxofs)
2182
10.7k
            ofs = maxofs;
2183
        /* Translate back to positive offsets relative to &a[0]. */
2184
71.0k
        k = lastofs;
2185
71.0k
        lastofs = hint - ofs;
2186
71.0k
        ofs = hint - k;
2187
71.0k
    }
2188
116k
    else {
2189
        /* a[hint] <= key -- gallop right, until
2190
         * a[hint + lastofs] <= key < a[hint + ofs]
2191
        */
2192
116k
        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
2193
375k
        while (ofs < maxofs) {
2194
328k
            IFLT(key, a[ofs])
2195
69.2k
                break;
2196
            /* a[hint + ofs] <= key */
2197
259k
            lastofs = ofs;
2198
259k
            assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2199
259k
            ofs = (ofs << 1) + 1;
2200
259k
        }
2201
116k
        if (ofs > maxofs)
2202
25.8k
            ofs = maxofs;
2203
        /* Translate back to offsets relative to &a[0]. */
2204
116k
        lastofs += hint;
2205
116k
        ofs += hint;
2206
116k
    }
2207
187k
    a -= hint;
2208
2209
187k
    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
187k
    ++lastofs;
2215
510k
    while (lastofs < ofs) {
2216
322k
        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
2217
2218
322k
        IFLT(key, a[m])
2219
164k
            ofs = m;                    /* key < a[m] */
2220
158k
        else
2221
158k
            lastofs = m+1;              /* a[m] <= key */
2222
322k
    }
2223
187k
    assert(lastofs == ofs);             /* so a[ofs-1] <= key < a[ofs] */
2224
187k
    return ofs;
2225
2226
0
fail:
2227
0
    return -1;
2228
187k
}
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
2.94M
{
2235
2.94M
    assert(ms != NULL);
2236
2.94M
    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
603k
        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
603k
        if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
2248
2.43k
            ms->alloced = MERGESTATE_TEMP_SIZE / 2;
2249
603k
        ms->a.values = &ms->temparray[ms->alloced];
2250
603k
    }
2251
2.33M
    else {
2252
2.33M
        ms->alloced = MERGESTATE_TEMP_SIZE;
2253
2.33M
        ms->a.values = NULL;
2254
2.33M
    }
2255
2.94M
    ms->a.keys = ms->temparray;
2256
2.94M
    ms->n = 0;
2257
2.94M
    ms->min_gallop = MIN_GALLOP;
2258
2.94M
    ms->listlen = list_size;
2259
2.94M
    ms->basekeys = lo->keys;
2260
2261
    /* State for generating minrun values. See listsort.txt. */
2262
2.94M
    ms->mr_e = 0;
2263
2.97M
    while (list_size >> ms->mr_e >= MAX_MINRUN) {
2264
28.6k
        ++ms->mr_e;
2265
28.6k
    }
2266
2.94M
    ms->mr_mask = (1 << ms->mr_e) - 1;
2267
2.94M
    ms->mr_current = 0;
2268
2.94M
}
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
2.94M
{
2277
2.94M
    assert(ms != NULL);
2278
2.94M
    if (ms->a.keys != ms->temparray) {
2279
4.47k
        PyMem_Free(ms->a.keys);
2280
4.47k
        ms->a.keys = NULL;
2281
4.47k
    }
2282
2.94M
}
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
4.47k
{
2290
4.47k
    int multiplier;
2291
2292
4.47k
    assert(ms != NULL);
2293
4.47k
    if (need <= ms->alloced)
2294
0
        return 0;
2295
2296
4.47k
    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
4.47k
    merge_freemem(ms);
2302
4.47k
    if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject *) / multiplier) {
2303
0
        PyErr_NoMemory();
2304
0
        return -1;
2305
0
    }
2306
4.47k
    ms->a.keys = (PyObject **)PyMem_Malloc(multiplier * need
2307
4.47k
                                          * sizeof(PyObject *));
2308
4.47k
    if (ms->a.keys != NULL) {
2309
4.47k
        ms->alloced = need;
2310
4.47k
        if (ms->a.values != NULL)
2311
4.42k
            ms->a.values = &ms->a.keys[need];
2312
4.47k
        return 0;
2313
4.47k
    }
2314
0
    PyErr_NoMemory();
2315
0
    return -1;
2316
4.47k
}
2317
63.0k
#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 :   \
2318
63.0k
                                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
40.7k
{
2330
40.7k
    Py_ssize_t k;
2331
40.7k
    sortslice dest;
2332
40.7k
    int result = -1;            /* guilty until proved innocent */
2333
40.7k
    Py_ssize_t min_gallop;
2334
2335
40.7k
    assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
2336
40.7k
    assert(ssa.keys + na == ssb.keys);
2337
40.7k
    if (MERGE_GETMEM(ms, na) < 0)
2338
0
        return -1;
2339
40.7k
    sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
2340
40.7k
    dest = ssa;
2341
40.7k
    ssa = ms->a;
2342
2343
40.7k
    sortslice_copy_incr(&dest, &ssb);
2344
40.7k
    --nb;
2345
40.7k
    if (nb == 0)
2346
1.85k
        goto Succeed;
2347
38.8k
    if (na == 1)
2348
6.37k
        goto CopyB;
2349
2350
32.5k
    min_gallop = ms->min_gallop;
2351
57.8k
    for (;;) {
2352
57.8k
        Py_ssize_t acount = 0;          /* # of times A won in a row */
2353
57.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
887k
        for (;;) {
2359
887k
            assert(na > 1 && nb > 0);
2360
887k
            k = ISLT(ssb.keys[0], ssa.keys[0]);
2361
887k
            if (k) {
2362
450k
                if (k < 0)
2363
0
                    goto Fail;
2364
450k
                sortslice_copy_incr(&dest, &ssb);
2365
450k
                ++bcount;
2366
450k
                acount = 0;
2367
450k
                --nb;
2368
450k
                if (nb == 0)
2369
2.78k
                    goto Succeed;
2370
447k
                if (bcount >= min_gallop)
2371
22.4k
                    break;
2372
447k
            }
2373
437k
            else {
2374
437k
                sortslice_copy_incr(&dest, &ssa);
2375
437k
                ++acount;
2376
437k
                bcount = 0;
2377
437k
                --na;
2378
437k
                if (na == 1)
2379
8.41k
                    goto CopyB;
2380
429k
                if (acount >= min_gallop)
2381
24.2k
                    break;
2382
429k
            }
2383
887k
        }
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
46.6k
        ++min_gallop;
2391
71.8k
        do {
2392
71.8k
            assert(na > 1 && nb > 0);
2393
71.8k
            min_gallop -= min_gallop > 1;
2394
71.8k
            ms->min_gallop = min_gallop;
2395
71.8k
            k = gallop_right(ms, ssb.keys[0], ssa.keys, na, 0);
2396
71.8k
            acount = k;
2397
71.8k
            if (k) {
2398
44.2k
                if (k < 0)
2399
0
                    goto Fail;
2400
44.2k
                sortslice_memcpy(&dest, 0, &ssa, 0, k);
2401
44.2k
                sortslice_advance(&dest, k);
2402
44.2k
                sortslice_advance(&ssa, k);
2403
44.2k
                na -= k;
2404
44.2k
                if (na == 1)
2405
6.61k
                    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
37.6k
                if (na == 0)
2411
0
                    goto Succeed;
2412
37.6k
            }
2413
65.2k
            sortslice_copy_incr(&dest, &ssb);
2414
65.2k
            --nb;
2415
65.2k
            if (nb == 0)
2416
1.28k
                goto Succeed;
2417
2418
63.9k
            k = gallop_left(ms, ssa.keys[0], ssb.keys, nb, 0);
2419
63.9k
            bcount = k;
2420
63.9k
            if (k) {
2421
52.3k
                if (k < 0)
2422
0
                    goto Fail;
2423
52.3k
                sortslice_memmove(&dest, 0, &ssb, 0, k);
2424
52.3k
                sortslice_advance(&dest, k);
2425
52.3k
                sortslice_advance(&ssb, k);
2426
52.3k
                nb -= k;
2427
52.3k
                if (nb == 0)
2428
10.0k
                    goto Succeed;
2429
52.3k
            }
2430
53.9k
            sortslice_copy_incr(&dest, &ssa);
2431
53.9k
            --na;
2432
53.9k
            if (na == 1)
2433
3.36k
                goto CopyB;
2434
53.9k
        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
2435
25.3k
        ++min_gallop;           /* penalize it for leaving galloping mode */
2436
25.3k
        ms->min_gallop = min_gallop;
2437
25.3k
    }
2438
15.9k
Succeed:
2439
15.9k
    result = 0;
2440
15.9k
Fail:
2441
15.9k
    if (na)
2442
15.9k
        sortslice_memcpy(&dest, 0, &ssa, 0, na);
2443
15.9k
    return result;
2444
24.7k
CopyB:
2445
24.7k
    assert(na == 1 && nb > 0);
2446
    /* The last element of ssa belongs at the end of the merge. */
2447
24.7k
    sortslice_memmove(&dest, 0, &ssb, 0, nb);
2448
24.7k
    sortslice_copy(&dest, nb, &ssa, 0);
2449
24.7k
    return 0;
2450
15.9k
}
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
22.2k
{
2462
22.2k
    Py_ssize_t k;
2463
22.2k
    sortslice dest, basea, baseb;
2464
22.2k
    int result = -1;            /* guilty until proved innocent */
2465
22.2k
    Py_ssize_t min_gallop;
2466
2467
22.2k
    assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
2468
22.2k
    assert(ssa.keys + na == ssb.keys);
2469
22.2k
    if (MERGE_GETMEM(ms, nb) < 0)
2470
0
        return -1;
2471
22.2k
    dest = ssb;
2472
22.2k
    sortslice_advance(&dest, nb-1);
2473
22.2k
    sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
2474
22.2k
    basea = ssa;
2475
22.2k
    baseb = ms->a;
2476
22.2k
    ssb.keys = ms->a.keys + nb - 1;
2477
22.2k
    if (ssb.values != NULL)
2478
21.3k
        ssb.values = ms->a.values + nb - 1;
2479
22.2k
    sortslice_advance(&ssa, na - 1);
2480
2481
22.2k
    sortslice_copy_decr(&dest, &ssa);
2482
22.2k
    --na;
2483
22.2k
    if (na == 0)
2484
0
        goto Succeed;
2485
22.2k
    if (nb == 1)
2486
1.10k
        goto CopyA;
2487
2488
21.1k
    min_gallop = ms->min_gallop;
2489
31.7k
    for (;;) {
2490
31.7k
        Py_ssize_t acount = 0;          /* # of times A won in a row */
2491
31.7k
        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.61M
        for (;;) {
2497
2.61M
            assert(na > 0 && nb > 1);
2498
2.61M
            k = ISLT(ssb.keys[0], ssa.keys[0]);
2499
2.61M
            if (k) {
2500
1.30M
                if (k < 0)
2501
0
                    goto Fail;
2502
1.30M
                sortslice_copy_decr(&dest, &ssa);
2503
1.30M
                ++acount;
2504
1.30M
                bcount = 0;
2505
1.30M
                --na;
2506
1.30M
                if (na == 0)
2507
775
                    goto Succeed;
2508
1.30M
                if (acount >= min_gallop)
2509
14.4k
                    break;
2510
1.30M
            }
2511
1.30M
            else {
2512
1.30M
                sortslice_copy_decr(&dest, &ssb);
2513
1.30M
                ++bcount;
2514
1.30M
                acount = 0;
2515
1.30M
                --nb;
2516
1.30M
                if (nb == 1)
2517
497
                    goto CopyA;
2518
1.30M
                if (bcount >= min_gallop)
2519
15.9k
                    break;
2520
1.30M
            }
2521
2.61M
        }
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
30.4k
        ++min_gallop;
2529
52.1k
        do {
2530
52.1k
            assert(na > 0 && nb > 1);
2531
52.1k
            min_gallop -= min_gallop > 1;
2532
52.1k
            ms->min_gallop = min_gallop;
2533
52.1k
            k = gallop_right(ms, ssb.keys[0], basea.keys, na, na-1);
2534
52.1k
            if (k < 0)
2535
0
                goto Fail;
2536
52.1k
            k = na - k;
2537
52.1k
            acount = k;
2538
52.1k
            if (k) {
2539
32.6k
                sortslice_advance(&dest, -k);
2540
32.6k
                sortslice_advance(&ssa, -k);
2541
32.6k
                sortslice_memmove(&dest, 1, &ssa, 1, k);
2542
32.6k
                na -= k;
2543
32.6k
                if (na == 0)
2544
9.26k
                    goto Succeed;
2545
32.6k
            }
2546
42.9k
            sortslice_copy_decr(&dest, &ssb);
2547
42.9k
            --nb;
2548
42.9k
            if (nb == 1)
2549
876
                goto CopyA;
2550
2551
42.0k
            k = gallop_left(ms, ssa.keys[0], baseb.keys, nb, nb-1);
2552
42.0k
            if (k < 0)
2553
0
                goto Fail;
2554
42.0k
            k = nb - k;
2555
42.0k
            bcount = k;
2556
42.0k
            if (k) {
2557
35.4k
                sortslice_advance(&dest, -k);
2558
35.4k
                sortslice_advance(&ssb, -k);
2559
35.4k
                sortslice_memcpy(&dest, 1, &ssb, 1, k);
2560
35.4k
                nb -= k;
2561
35.4k
                if (nb == 1)
2562
9.00k
                    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
26.4k
                if (nb == 0)
2568
0
                    goto Succeed;
2569
26.4k
            }
2570
33.0k
            sortslice_copy_decr(&dest, &ssa);
2571
33.0k
            --na;
2572
33.0k
            if (na == 0)
2573
737
                goto Succeed;
2574
33.0k
        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
2575
10.5k
        ++min_gallop;           /* penalize it for leaving galloping mode */
2576
10.5k
        ms->min_gallop = min_gallop;
2577
10.5k
    }
2578
10.7k
Succeed:
2579
10.7k
    result = 0;
2580
10.7k
Fail:
2581
10.7k
    if (nb)
2582
10.7k
        sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
2583
10.7k
    return result;
2584
11.4k
CopyA:
2585
11.4k
    assert(nb == 1 && na > 0);
2586
    /* The first element of ssb belongs at the front of the merge. */
2587
11.4k
    sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
2588
11.4k
    sortslice_advance(&dest, -na);
2589
11.4k
    sortslice_advance(&ssa, -na);
2590
11.4k
    sortslice_copy(&dest, 0, &ssb, 0);
2591
11.4k
    return 0;
2592
10.7k
}
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
63.5k
{
2600
63.5k
    sortslice ssa, ssb;
2601
63.5k
    Py_ssize_t na, nb;
2602
63.5k
    Py_ssize_t k;
2603
2604
63.5k
    assert(ms != NULL);
2605
63.5k
    assert(ms->n >= 2);
2606
63.5k
    assert(i >= 0);
2607
63.5k
    assert(i == ms->n - 2 || i == ms->n - 3);
2608
2609
63.5k
    ssa = ms->pending[i].base;
2610
63.5k
    na = ms->pending[i].len;
2611
63.5k
    ssb = ms->pending[i+1].base;
2612
63.5k
    nb = ms->pending[i+1].len;
2613
63.5k
    assert(na > 0 && nb > 0);
2614
63.5k
    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
63.5k
    ms->pending[i].len = na + nb;
2621
63.5k
    if (i == ms->n - 3)
2622
458
        ms->pending[i+1] = ms->pending[i+2];
2623
63.5k
    --ms->n;
2624
2625
    /* Where does b start in a?  Elements in a before that can be
2626
     * ignored (already in place).
2627
     */
2628
63.5k
    k = gallop_right(ms, *ssb.keys, ssa.keys, na, 0);
2629
63.5k
    if (k < 0)
2630
0
        return -1;
2631
63.5k
    sortslice_advance(&ssa, k);
2632
63.5k
    na -= k;
2633
63.5k
    if (na == 0)
2634
499
        return 0;
2635
2636
    /* Where does a end in b?  Elements in b after that can be
2637
     * ignored (already in place).
2638
     */
2639
63.0k
    nb = gallop_left(ms, ssa.keys[na-1], ssb.keys, nb, nb-1);
2640
63.0k
    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
63.0k
    if (na <= nb)
2647
40.7k
        return merge_lo(ms, ssa, na, ssb, nb);
2648
22.2k
    else
2649
22.2k
        return merge_hi(ms, ssa, na, ssb, nb);
2650
63.0k
}
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
63.5k
{
2660
63.5k
    int result = 0;
2661
63.5k
    assert(s1 >= 0);
2662
63.5k
    assert(n1 > 0 && n2 > 0);
2663
63.5k
    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
63.5k
    Py_ssize_t a = 2 * s1 + n1;  /* 2*a */
2674
63.5k
    Py_ssize_t b = a + n1 + n2;  /* 2*b */
2675
    /* Emulate a/n and b/n one bit a time, until bits differ. */
2676
229k
    for (;;) {
2677
229k
        ++result;
2678
229k
        if (a >= n) {  /* both quotient bits are 1 */
2679
85.6k
            assert(b >= a);
2680
85.6k
            a -= n;
2681
85.6k
            b -= n;
2682
85.6k
        }
2683
143k
        else if (b >= n) {  /* a/n bit is 0, b/n bit is 1 */
2684
63.5k
            break;
2685
63.5k
        } /* else both quotient bits are 0 */
2686
229k
        assert(a < b && b < n);
2687
166k
        a <<= 1;
2688
166k
        b <<= 1;
2689
166k
    }
2690
63.5k
    return result;
2691
63.5k
}
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
255k
{
2707
255k
    assert(ms);
2708
255k
    if (ms->n) {
2709
63.5k
        assert(ms->n > 0);
2710
63.5k
        struct s_slice *p = ms->pending;
2711
63.5k
        Py_ssize_t s1 = p[ms->n - 1].base.keys - ms->basekeys; /* start index */
2712
63.5k
        Py_ssize_t n1 = p[ms->n - 1].len;
2713
63.5k
        int power = powerloop(s1, n1, n2, ms->listlen);
2714
101k
        while (ms->n > 1 && p[ms->n - 2].power > power) {
2715
37.5k
            if (merge_at(ms, ms->n - 2) < 0)
2716
0
                return -1;
2717
37.5k
        }
2718
63.5k
        assert(ms->n < 2 || p[ms->n - 2].power < power);
2719
63.5k
        p[ms->n - 1].power = power;
2720
63.5k
    }
2721
255k
    return 0;
2722
255k
}
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
191k
{
2732
191k
    struct s_slice *p = ms->pending;
2733
2734
191k
    assert(ms);
2735
217k
    while (ms->n > 1) {
2736
25.9k
        Py_ssize_t n = ms->n - 2;
2737
25.9k
        if (n > 0 && p[n-1].len < p[n+1].len)
2738
458
            --n;
2739
25.9k
        if (merge_at(ms, n) < 0)
2740
0
            return -1;
2741
25.9k
    }
2742
191k
    return 0;
2743
191k
}
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
255k
{
2749
255k
    ms->mr_current += ms->listlen;
2750
255k
    assert(ms->mr_current >= 0); /* no overflow */
2751
255k
    Py_ssize_t result = ms->mr_current >> ms->mr_e;
2752
255k
    ms->mr_current &= ms->mr_mask;
2753
255k
    return result;
2754
255k
}
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
6.44M
{
2780
6.44M
    PyObject *res_obj; int res;
2781
2782
    /* No assumptions, because we check first: */
2783
6.44M
    if (Py_TYPE(v)->tp_richcompare != ms->key_richcompare)
2784
0
        return PyObject_RichCompareBool(v, w, Py_LT);
2785
2786
6.44M
    assert(ms->key_richcompare != NULL);
2787
6.44M
    res_obj = (*(ms->key_richcompare))(v, w, Py_LT);
2788
2789
6.44M
    if (res_obj == Py_NotImplemented) {
2790
0
        Py_DECREF(res_obj);
2791
0
        return PyObject_RichCompareBool(v, w, Py_LT);
2792
0
    }
2793
6.44M
    if (res_obj == NULL)
2794
0
        return -1;
2795
2796
6.44M
    if (PyBool_Check(res_obj)) {
2797
6.44M
        res = (res_obj == Py_True);
2798
6.44M
        assert(_Py_IsImmortal(res_obj));
2799
6.44M
    }
2800
0
    else {
2801
0
        res = PyObject_IsTrue(res_obj);
2802
0
        Py_DECREF(res_obj);
2803
0
    }
2804
2805
    /* Note that we can't assert
2806
     *     res == PyObject_RichCompareBool(v, w, Py_LT);
2807
     * because of evil compare functions like this:
2808
     *     lambda a, b:  int(random.random() * 3) - 1)
2809
     * (which is actually in test_sort.py) */
2810
6.44M
    return res;
2811
6.44M
}
2812
2813
/* Latin string compare: safe for any two latin (one byte per char) strings. */
2814
static int
2815
unsafe_latin_compare(PyObject *v, PyObject *w, MergeState *ms)
2816
3.60M
{
2817
3.60M
    Py_ssize_t len;
2818
3.60M
    int res;
2819
2820
    /* Modified from Objects/unicodeobject.c:unicode_compare, assuming: */
2821
3.60M
    assert(Py_IS_TYPE(v, &PyUnicode_Type));
2822
3.60M
    assert(Py_IS_TYPE(w, &PyUnicode_Type));
2823
3.60M
    assert(PyUnicode_KIND(v) == PyUnicode_KIND(w));
2824
3.60M
    assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND);
2825
2826
3.60M
    len = Py_MIN(PyUnicode_GET_LENGTH(v), PyUnicode_GET_LENGTH(w));
2827
3.60M
    res = memcmp(PyUnicode_DATA(v), PyUnicode_DATA(w), len);
2828
2829
3.60M
    res = (res != 0 ?
2830
3.53M
           res < 0 :
2831
3.60M
           PyUnicode_GET_LENGTH(v) < PyUnicode_GET_LENGTH(w));
2832
2833
3.60M
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));;
2834
3.60M
    return res;
2835
3.60M
}
2836
2837
/* Bounded int compare: compare any two longs that fit in a single machine word. */
2838
static int
2839
unsafe_long_compare(PyObject *v, PyObject *w, MergeState *ms)
2840
8.74M
{
2841
8.74M
    PyLongObject *vl, *wl;
2842
8.74M
    intptr_t v0, w0;
2843
8.74M
    int res;
2844
2845
    /* Modified from Objects/longobject.c:long_compare, assuming: */
2846
8.74M
    assert(Py_IS_TYPE(v, &PyLong_Type));
2847
8.74M
    assert(Py_IS_TYPE(w, &PyLong_Type));
2848
8.74M
    assert(_PyLong_IsCompact((PyLongObject *)v));
2849
8.74M
    assert(_PyLong_IsCompact((PyLongObject *)w));
2850
2851
8.74M
    vl = (PyLongObject*)v;
2852
8.74M
    wl = (PyLongObject*)w;
2853
2854
8.74M
    v0 = _PyLong_CompactValue(vl);
2855
8.74M
    w0 = _PyLong_CompactValue(wl);
2856
2857
8.74M
    res = v0 < w0;
2858
8.74M
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2859
8.74M
    return res;
2860
8.74M
}
2861
2862
/* Float compare: compare any two floats. */
2863
static int
2864
unsafe_float_compare(PyObject *v, PyObject *w, MergeState *ms)
2865
0
{
2866
0
    int res;
2867
2868
    /* Modified from Objects/floatobject.c:float_richcompare, assuming: */
2869
0
    assert(Py_IS_TYPE(v, &PyFloat_Type));
2870
0
    assert(Py_IS_TYPE(w, &PyFloat_Type));
2871
2872
0
    res = PyFloat_AS_DOUBLE(v) < PyFloat_AS_DOUBLE(w);
2873
0
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2874
0
    return res;
2875
0
}
2876
2877
/* Tuple compare: compare *any* two tuples, using
2878
 * ms->tuple_elem_compare to compare the first elements, which is set
2879
 * using the same pre-sort check as we use for ms->key_compare,
2880
 * but run on the list [x[0] for x in L]. This allows us to optimize compares
2881
 * on two levels (as long as [x[0] for x in L] is type-homogeneous.) The idea is
2882
 * that most tuple compares don't involve x[1:]. */
2883
static int
2884
unsafe_tuple_compare(PyObject *v, PyObject *w, MergeState *ms)
2885
4.54M
{
2886
4.54M
    PyTupleObject *vt, *wt;
2887
4.54M
    Py_ssize_t i, vlen, wlen;
2888
4.54M
    int k;
2889
2890
    /* Modified from Objects/tupleobject.c:tuplerichcompare, assuming: */
2891
4.54M
    assert(Py_IS_TYPE(v, &PyTuple_Type));
2892
4.54M
    assert(Py_IS_TYPE(w, &PyTuple_Type));
2893
4.54M
    assert(Py_SIZE(v) > 0);
2894
4.54M
    assert(Py_SIZE(w) > 0);
2895
2896
4.54M
    vt = (PyTupleObject *)v;
2897
4.54M
    wt = (PyTupleObject *)w;
2898
2899
4.54M
    vlen = Py_SIZE(vt);
2900
4.54M
    wlen = Py_SIZE(wt);
2901
2902
6.76M
    for (i = 0; i < vlen && i < wlen; i++) {
2903
5.65M
        k = PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_EQ);
2904
5.65M
        if (k < 0)
2905
0
            return -1;
2906
5.65M
        if (!k)
2907
3.42M
            break;
2908
5.65M
    }
2909
2910
4.54M
    if (i >= vlen || i >= wlen)
2911
1.11M
        return vlen < wlen;
2912
2913
3.42M
    if (i == 0)
2914
3.42M
        return ms->tuple_elem_compare(vt->ob_item[i], wt->ob_item[i], ms);
2915
56
    else
2916
56
        return PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_LT);
2917
3.42M
}
2918
2919
/* An adaptive, stable, natural mergesort.  See listsort.txt.
2920
 * Returns Py_None on success, NULL on error.  Even in case of error, the
2921
 * list will be some permutation of its input state (nothing is lost or
2922
 * duplicated).
2923
 */
2924
/*[clinic input]
2925
@permit_long_docstring_body
2926
@critical_section
2927
list.sort
2928
2929
    *
2930
    key as keyfunc: object = None
2931
    reverse: bool = False
2932
2933
Sort the list in ascending order and return None.
2934
2935
The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
2936
order of two equal elements is maintained).
2937
2938
If a key function is given, apply it once to each list item and sort them,
2939
ascending or descending, according to their function values.
2940
2941
The reverse flag can be set to sort in descending order.
2942
[clinic start generated code]*/
2943
2944
static PyObject *
2945
list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
2946
/*[clinic end generated code: output=57b9f9c5e23fbe42 input=e4f6b6069181ad7d]*/
2947
2.94M
{
2948
2.94M
    MergeState ms;
2949
2.94M
    Py_ssize_t nremaining;
2950
2.94M
    Py_ssize_t minrun;
2951
2.94M
    sortslice lo;
2952
2.94M
    Py_ssize_t saved_ob_size, saved_allocated;
2953
2.94M
    PyObject **saved_ob_item;
2954
2.94M
    PyObject **final_ob_item;
2955
2.94M
    PyObject *result = NULL;            /* guilty until proved innocent */
2956
2.94M
    Py_ssize_t i;
2957
2.94M
    PyObject **keys;
2958
2959
2.94M
    assert(self != NULL);
2960
2.94M
    assert(PyList_Check(self));
2961
2.94M
    if (keyfunc == Py_None)
2962
2.31M
        keyfunc = NULL;
2963
2964
    /* The list is temporarily made empty, so that mutations performed
2965
     * by comparison functions can't affect the slice of memory we're
2966
     * sorting (allowing mutations during sorting is a core-dump
2967
     * factory, since ob_item may change).
2968
     */
2969
2.94M
    saved_ob_size = Py_SIZE(self);
2970
2.94M
    saved_ob_item = self->ob_item;
2971
2.94M
    saved_allocated = self->allocated;
2972
2.94M
    Py_SET_SIZE(self, 0);
2973
2.94M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, NULL);
2974
2.94M
    self->allocated = -1; /* any operation will reset it to >= 0 */
2975
2976
2.94M
    if (keyfunc == NULL) {
2977
2.33M
        keys = NULL;
2978
2.33M
        lo.keys = saved_ob_item;
2979
2.33M
        lo.values = NULL;
2980
2.33M
    }
2981
603k
    else {
2982
603k
        if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
2983
            /* Leverage stack space we allocated but won't otherwise use */
2984
600k
            keys = &ms.temparray[saved_ob_size+1];
2985
3.88k
        else {
2986
3.88k
            keys = PyMem_Malloc(sizeof(PyObject *) * saved_ob_size);
2987
3.88k
            if (keys == NULL) {
2988
0
                PyErr_NoMemory();
2989
0
                goto keyfunc_fail;
2990
0
            }
2991
3.88k
        }
2992
2993
5.01M
        for (i = 0; i < saved_ob_size ; i++) {
2994
4.41M
            keys[i] = PyObject_CallOneArg(keyfunc, saved_ob_item[i]);
2995
4.41M
            if (keys[i] == NULL) {
2996
0
                for (i=i-1 ; i>=0 ; i--)
2997
0
                    Py_DECREF(keys[i]);
2998
0
                if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
2999
0
                    PyMem_Free(keys);
3000
0
                goto keyfunc_fail;
3001
0
            }
3002
4.41M
        }
3003
3004
603k
        lo.keys = keys;
3005
603k
        lo.values = saved_ob_item;
3006
603k
    }
3007
3008
3009
    /* The pre-sort check: here's where we decide which compare function to use.
3010
     * How much optimization is safe? We test for homogeneity with respect to
3011
     * several properties that are expensive to check at compare-time, and
3012
     * set ms appropriately. */
3013
2.94M
    if (saved_ob_size > 1) {
3014
        /* Assume the first element is representative of the whole list. */
3015
191k
        int keys_are_in_tuples = (Py_IS_TYPE(lo.keys[0], &PyTuple_Type) &&
3016
228
                                  Py_SIZE(lo.keys[0]) > 0);
3017
3018
191k
        PyTypeObject* key_type = (keys_are_in_tuples ?
3019
228
                                  Py_TYPE(PyTuple_GET_ITEM(lo.keys[0], 0)) :
3020
191k
                                  Py_TYPE(lo.keys[0]));
3021
3022
191k
        int keys_are_all_same_type = 1;
3023
191k
        int strings_are_latin = 1;
3024
191k
        int ints_are_bounded = 1;
3025
3026
        /* Prove that assumption by checking every key. */
3027
7.43M
        for (i=0; i < saved_ob_size; i++) {
3028
3029
7.24M
            if (keys_are_in_tuples &&
3030
2.27M
                !(Py_IS_TYPE(lo.keys[i], &PyTuple_Type) && Py_SIZE(lo.keys[i]) != 0)) {
3031
0
                keys_are_in_tuples = 0;
3032
0
                keys_are_all_same_type = 0;
3033
0
                break;
3034
0
            }
3035
3036
            /* Note: for lists of tuples, key is the first element of the tuple
3037
             * lo.keys[i], not lo.keys[i] itself! We verify type-homogeneity
3038
             * for lists of tuples in the if-statement directly above. */
3039
7.24M
            PyObject *key = (keys_are_in_tuples ?
3040
2.27M
                             PyTuple_GET_ITEM(lo.keys[i], 0) :
3041
7.24M
                             lo.keys[i]);
3042
3043
7.24M
            if (!Py_IS_TYPE(key, key_type)) {
3044
4
                keys_are_all_same_type = 0;
3045
                /* If keys are in tuple we must loop over the whole list to make
3046
                   sure all items are tuples */
3047
4
                if (!keys_are_in_tuples) {
3048
4
                    break;
3049
4
                }
3050
4
            }
3051
3052
7.24M
            if (keys_are_all_same_type) {
3053
7.24M
                if (key_type == &PyLong_Type &&
3054
6.16M
                    ints_are_bounded &&
3055
4.46M
                    !_PyLong_IsCompact((PyLongObject *)key)) {
3056
3057
6.51k
                    ints_are_bounded = 0;
3058
6.51k
                }
3059
7.23M
                else if (key_type == &PyUnicode_Type &&
3060
891k
                         strings_are_latin &&
3061
834k
                         PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) {
3062
3063
5.03k
                        strings_are_latin = 0;
3064
5.03k
                    }
3065
7.24M
                }
3066
7.24M
            }
3067
3068
        /* Choose the best compare, given what we now know about the keys. */
3069
191k
        if (keys_are_all_same_type) {
3070
3071
191k
            if (key_type == &PyUnicode_Type && strings_are_latin) {
3072
77.5k
                ms.key_compare = unsafe_latin_compare;
3073
77.5k
            }
3074
114k
            else if (key_type == &PyLong_Type && ints_are_bounded) {
3075
77.3k
                ms.key_compare = unsafe_long_compare;
3076
77.3k
            }
3077
36.7k
            else if (key_type == &PyFloat_Type) {
3078
0
                ms.key_compare = unsafe_float_compare;
3079
0
            }
3080
36.7k
            else if ((ms.key_richcompare = key_type->tp_richcompare) != NULL) {
3081
36.7k
                ms.key_compare = unsafe_object_compare;
3082
36.7k
            }
3083
0
            else {
3084
0
                ms.key_compare = safe_object_compare;
3085
0
            }
3086
191k
        }
3087
4
        else {
3088
4
            ms.key_compare = safe_object_compare;
3089
4
        }
3090
3091
191k
        if (keys_are_in_tuples) {
3092
            /* Make sure we're not dealing with tuples of tuples
3093
             * (remember: here, key_type refers list [key[0] for key in keys]) */
3094
228
            if (key_type == &PyTuple_Type) {
3095
0
                ms.tuple_elem_compare = safe_object_compare;
3096
0
            }
3097
228
            else {
3098
228
                ms.tuple_elem_compare = ms.key_compare;
3099
228
            }
3100
3101
228
            ms.key_compare = unsafe_tuple_compare;
3102
228
        }
3103
191k
    }
3104
    /* End of pre-sort check: ms is now set properly! */
3105
3106
2.94M
    merge_init(&ms, saved_ob_size, keys != NULL, &lo);
3107
3108
2.94M
    nremaining = saved_ob_size;
3109
2.94M
    if (nremaining < 2)
3110
2.75M
        goto succeed;
3111
3112
    /* Reverse sort stability achieved by initially reversing the list,
3113
    applying a stable forward sort, then reversing the final result. */
3114
191k
    if (reverse) {
3115
122
        if (keys != NULL)
3116
0
            reverse_slice(&keys[0], &keys[saved_ob_size]);
3117
122
        reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
3118
122
    }
3119
3120
    /* March over the array once, left to right, finding natural runs,
3121
     * and extending short natural runs to minrun elements.
3122
     */
3123
255k
    do {
3124
255k
        Py_ssize_t n;
3125
3126
        /* Identify next run. */
3127
255k
        n = count_run(&ms, &lo, nremaining);
3128
255k
        if (n < 0)
3129
0
            goto fail;
3130
        /* If short, extend to min(minrun, nremaining). */
3131
255k
        minrun = minrun_next(&ms);
3132
255k
        if (n < minrun) {
3133
133k
            const Py_ssize_t force = nremaining <= minrun ?
3134
86.8k
                              nremaining : minrun;
3135
133k
            if (binarysort(&ms, &lo, force, n) < 0)
3136
0
                goto fail;
3137
133k
            n = force;
3138
133k
        }
3139
        /* Maybe merge pending runs. */
3140
255k
        assert(ms.n == 0 || ms.pending[ms.n -1].base.keys +
3141
255k
                            ms.pending[ms.n-1].len == lo.keys);
3142
255k
        if (found_new_run(&ms, n) < 0)
3143
0
            goto fail;
3144
        /* Push new run on stack. */
3145
255k
        assert(ms.n < MAX_MERGE_PENDING);
3146
255k
        ms.pending[ms.n].base = lo;
3147
255k
        ms.pending[ms.n].len = n;
3148
255k
        ++ms.n;
3149
        /* Advance to find next run. */
3150
255k
        sortslice_advance(&lo, n);
3151
255k
        nremaining -= n;
3152
255k
    } while (nremaining);
3153
3154
191k
    if (merge_force_collapse(&ms) < 0)
3155
0
        goto fail;
3156
191k
    assert(ms.n == 1);
3157
191k
    assert(keys == NULL
3158
191k
           ? ms.pending[0].base.keys == saved_ob_item
3159
191k
           : ms.pending[0].base.keys == &keys[0]);
3160
191k
    assert(ms.pending[0].len == saved_ob_size);
3161
191k
    lo = ms.pending[0].base;
3162
3163
2.94M
succeed:
3164
2.94M
    result = Py_None;
3165
2.94M
fail:
3166
2.94M
    if (keys != NULL) {
3167
5.01M
        for (i = 0; i < saved_ob_size; i++)
3168
4.41M
            Py_DECREF(keys[i]);
3169
603k
        if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
3170
3.88k
            PyMem_Free(keys);
3171
603k
    }
3172
3173
2.94M
    if (self->allocated != -1 && result != NULL) {
3174
        /* The user mucked with the list during the sort,
3175
         * and we don't already have another error to report.
3176
         */
3177
0
        PyErr_SetString(PyExc_ValueError, "list modified during sort");
3178
0
        result = NULL;
3179
0
    }
3180
3181
2.94M
    if (reverse && saved_ob_size > 1)
3182
122
        reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
3183
3184
2.94M
    merge_freemem(&ms);
3185
3186
2.94M
keyfunc_fail:
3187
2.94M
    final_ob_item = self->ob_item;
3188
2.94M
    i = Py_SIZE(self);
3189
2.94M
    Py_SET_SIZE(self, saved_ob_size);
3190
2.94M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, saved_ob_item);
3191
2.94M
    FT_ATOMIC_STORE_SSIZE_RELAXED(self->allocated, saved_allocated);
3192
2.94M
    if (final_ob_item != NULL) {
3193
        /* we cannot use list_clear() for this because it does not
3194
           guarantee that the list is really empty when it returns */
3195
0
        while (--i >= 0) {
3196
0
            Py_XDECREF(final_ob_item[i]);
3197
0
        }
3198
#ifdef Py_GIL_DISABLED
3199
        ensure_shared_on_resize(self);
3200
        bool use_qsbr = _PyObject_GC_IS_SHARED(self);
3201
#else
3202
0
        bool use_qsbr = false;
3203
0
#endif
3204
0
        free_list_items(final_ob_item, use_qsbr);
3205
0
    }
3206
2.94M
    return Py_XNewRef(result);
3207
2.94M
}
3208
#undef IFLT
3209
#undef ISLT
3210
3211
int
3212
PyList_Sort(PyObject *v)
3213
20.0k
{
3214
20.0k
    if (v == NULL || !PyList_Check(v)) {
3215
0
        PyErr_BadInternalCall();
3216
0
        return -1;
3217
0
    }
3218
20.0k
    Py_BEGIN_CRITICAL_SECTION(v);
3219
20.0k
    v = list_sort_impl((PyListObject *)v, NULL, 0);
3220
20.0k
    Py_END_CRITICAL_SECTION();
3221
20.0k
    if (v == NULL)
3222
0
        return -1;
3223
20.0k
    Py_DECREF(v);
3224
20.0k
    return 0;
3225
20.0k
}
3226
3227
/*[clinic input]
3228
@critical_section
3229
list.reverse
3230
3231
Reverse *IN PLACE*.
3232
[clinic start generated code]*/
3233
3234
static PyObject *
3235
list_reverse_impl(PyListObject *self)
3236
/*[clinic end generated code: output=482544fc451abea9 input=04ac8e0c6a66e4d9]*/
3237
0
{
3238
0
    if (Py_SIZE(self) > 1)
3239
0
        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
3240
0
    Py_RETURN_NONE;
3241
0
}
3242
3243
int
3244
PyList_Reverse(PyObject *v)
3245
78
{
3246
78
    PyListObject *self = (PyListObject *)v;
3247
3248
78
    if (v == NULL || !PyList_Check(v)) {
3249
0
        PyErr_BadInternalCall();
3250
0
        return -1;
3251
0
    }
3252
78
    Py_BEGIN_CRITICAL_SECTION(self);
3253
78
    if (Py_SIZE(self) > 1) {
3254
78
        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
3255
78
    }
3256
78
    Py_END_CRITICAL_SECTION()
3257
78
    return 0;
3258
78
}
3259
3260
PyObject *
3261
PyList_AsTuple(PyObject *v)
3262
268k
{
3263
268k
    if (v == NULL || !PyList_Check(v)) {
3264
0
        PyErr_BadInternalCall();
3265
0
        return NULL;
3266
0
    }
3267
268k
    PyObject *ret;
3268
268k
    PyListObject *self = (PyListObject *)v;
3269
268k
    Py_BEGIN_CRITICAL_SECTION(self);
3270
268k
    ret = PyTuple_FromArray(self->ob_item, Py_SIZE(v));
3271
268k
    Py_END_CRITICAL_SECTION();
3272
268k
    return ret;
3273
268k
}
3274
3275
PyObject *
3276
_PyList_AsTupleAndClear(PyListObject *self)
3277
879
{
3278
879
    assert(self != NULL);
3279
879
    PyObject *ret;
3280
879
    if (self->ob_item == NULL) {
3281
0
        return PyTuple_New(0);
3282
0
    }
3283
879
    Py_BEGIN_CRITICAL_SECTION(self);
3284
879
    PyObject **items = self->ob_item;
3285
879
    Py_ssize_t size = Py_SIZE(self);
3286
879
    Py_SET_SIZE(self, 0);
3287
879
    ret = _PyTuple_FromArraySteal(items, size);
3288
879
    Py_END_CRITICAL_SECTION();
3289
879
    return ret;
3290
879
}
3291
3292
PyObject *
3293
_PyList_FromStackRefStealOnSuccess(const _PyStackRef *src, Py_ssize_t n)
3294
97.4M
{
3295
97.4M
    if (n == 0) {
3296
84.8M
        return PyList_New(0);
3297
84.8M
    }
3298
3299
12.6M
    PyListObject *list = (PyListObject *)PyList_New(n);
3300
12.6M
    if (list == NULL) {
3301
0
        return NULL;
3302
0
    }
3303
3304
12.6M
    PyObject **dst = list->ob_item;
3305
29.4M
    for (Py_ssize_t i = 0; i < n; i++) {
3306
16.7M
        dst[i] = PyStackRef_AsPyObjectSteal(src[i]);
3307
16.7M
    }
3308
3309
12.6M
    return (PyObject *)list;
3310
12.6M
}
3311
3312
/*[clinic input]
3313
list.index
3314
3315
    value: object
3316
    start: slice_index(accept={int}) = 0
3317
    stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
3318
    /
3319
3320
Return first index of value.
3321
3322
Raises ValueError if the value is not present.
3323
[clinic start generated code]*/
3324
3325
static PyObject *
3326
list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start,
3327
                Py_ssize_t stop)
3328
/*[clinic end generated code: output=ec51b88787e4e481 input=40ec5826303a0eb1]*/
3329
0
{
3330
0
    if (start < 0) {
3331
0
        start += Py_SIZE(self);
3332
0
        if (start < 0)
3333
0
            start = 0;
3334
0
    }
3335
0
    if (stop < 0) {
3336
0
        stop += Py_SIZE(self);
3337
0
        if (stop < 0)
3338
0
            stop = 0;
3339
0
    }
3340
0
    for (Py_ssize_t i = start; i < stop; i++) {
3341
0
        PyObject *obj = list_get_item_ref(self, i);
3342
0
        if (obj == NULL) {
3343
            // out-of-bounds
3344
0
            break;
3345
0
        }
3346
0
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3347
0
        Py_DECREF(obj);
3348
0
        if (cmp > 0)
3349
0
            return PyLong_FromSsize_t(i);
3350
0
        else if (cmp < 0)
3351
0
            return NULL;
3352
0
    }
3353
0
    PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
3354
0
    return NULL;
3355
0
}
3356
3357
/*[clinic input]
3358
list.count
3359
3360
     value: object
3361
     /
3362
3363
Return number of occurrences of value.
3364
[clinic start generated code]*/
3365
3366
static PyObject *
3367
list_count_impl(PyListObject *self, PyObject *value)
3368
/*[clinic end generated code: output=eff66f14aef2df86 input=3bdc3a5e6f749565]*/
3369
24
{
3370
24
    Py_ssize_t count = 0;
3371
144
    for (Py_ssize_t i = 0; ; i++) {
3372
144
        PyObject *obj = list_get_item_ref(self, i);
3373
144
        if (obj == NULL) {
3374
            // out-of-bounds
3375
24
            break;
3376
24
        }
3377
120
        if (obj == value) {
3378
96
           count++;
3379
96
           Py_DECREF(obj);
3380
96
           continue;
3381
96
        }
3382
24
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3383
24
        Py_DECREF(obj);
3384
24
        if (cmp > 0)
3385
0
            count++;
3386
24
        else if (cmp < 0)
3387
0
            return NULL;
3388
24
    }
3389
24
    return PyLong_FromSsize_t(count);
3390
24
}
3391
3392
/*[clinic input]
3393
@critical_section
3394
list.remove
3395
3396
     value: object
3397
     /
3398
3399
Remove first occurrence of value.
3400
3401
Raises ValueError if the value is not present.
3402
[clinic start generated code]*/
3403
3404
static PyObject *
3405
list_remove_impl(PyListObject *self, PyObject *value)
3406
/*[clinic end generated code: output=b9b76a6633b18778 input=26c813dbb95aa93b]*/
3407
15.0k
{
3408
15.0k
    Py_ssize_t i;
3409
3410
15.0k
    for (i = 0; i < Py_SIZE(self); i++) {
3411
15.0k
        PyObject *obj = self->ob_item[i];
3412
15.0k
        Py_INCREF(obj);
3413
15.0k
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3414
15.0k
        Py_DECREF(obj);
3415
15.0k
        if (cmp > 0) {
3416
15.0k
            if (list_ass_slice_lock_held(self, i, i+1, NULL) == 0)
3417
15.0k
                Py_RETURN_NONE;
3418
0
            return NULL;
3419
15.0k
        }
3420
24
        else if (cmp < 0)
3421
0
            return NULL;
3422
15.0k
    }
3423
2
    PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
3424
2
    return NULL;
3425
15.0k
}
3426
3427
static int
3428
list_traverse(PyObject *self, visitproc visit, void *arg)
3429
51.2M
{
3430
51.2M
    PyListObject *o = (PyListObject *)self;
3431
51.2M
    Py_ssize_t i;
3432
3433
167M
    for (i = Py_SIZE(o); --i >= 0; )
3434
116M
        Py_VISIT(o->ob_item[i]);
3435
51.2M
    return 0;
3436
51.2M
}
3437
3438
static PyObject *
3439
list_richcompare_impl(PyObject *v, PyObject *w, int op)
3440
221k
{
3441
221k
    PyListObject *vl, *wl;
3442
221k
    Py_ssize_t i;
3443
3444
221k
    if (!PyList_Check(v) || !PyList_Check(w))
3445
2.17k
        Py_RETURN_NOTIMPLEMENTED;
3446
3447
219k
    vl = (PyListObject *)v;
3448
219k
    wl = (PyListObject *)w;
3449
3450
219k
    if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
3451
        /* Shortcut: if the lengths differ, the lists differ */
3452
109k
        if (op == Py_EQ)
3453
109k
            Py_RETURN_FALSE;
3454
0
        else
3455
0
            Py_RETURN_TRUE;
3456
109k
    }
3457
3458
    /* Search for the first index where items are different */
3459
146k
    for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
3460
132k
        PyObject *vitem = vl->ob_item[i];
3461
132k
        PyObject *witem = wl->ob_item[i];
3462
132k
        if (vitem == witem) {
3463
35.7k
            continue;
3464
35.7k
        }
3465
3466
96.3k
        Py_INCREF(vitem);
3467
96.3k
        Py_INCREF(witem);
3468
96.3k
        int k = PyObject_RichCompareBool(vitem, witem, Py_EQ);
3469
96.3k
        Py_DECREF(vitem);
3470
96.3k
        Py_DECREF(witem);
3471
96.3k
        if (k < 0)
3472
0
            return NULL;
3473
96.3k
        if (!k)
3474
95.5k
            break;
3475
96.3k
    }
3476
3477
110k
    if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
3478
        /* No more items to compare -- compare sizes */
3479
14.6k
        Py_RETURN_RICHCOMPARE(Py_SIZE(vl), Py_SIZE(wl), op);
3480
14.6k
    }
3481
3482
    /* We have an item that differs -- shortcuts for EQ/NE */
3483
95.5k
    if (op == Py_EQ) {
3484
95.4k
        Py_RETURN_FALSE;
3485
95.4k
    }
3486
30
    if (op == Py_NE) {
3487
30
        Py_RETURN_TRUE;
3488
30
    }
3489
3490
    /* Compare the final item again using the proper operator */
3491
0
    PyObject *vitem = vl->ob_item[i];
3492
0
    PyObject *witem = wl->ob_item[i];
3493
0
    Py_INCREF(vitem);
3494
0
    Py_INCREF(witem);
3495
0
    PyObject *result = PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
3496
0
    Py_DECREF(vitem);
3497
0
    Py_DECREF(witem);
3498
0
    return result;
3499
30
}
3500
3501
static PyObject *
3502
list_richcompare(PyObject *v, PyObject *w, int op)
3503
221k
{
3504
221k
    PyObject *ret;
3505
221k
    Py_BEGIN_CRITICAL_SECTION2(v, w);
3506
221k
    ret = list_richcompare_impl(v, w, op);
3507
221k
    Py_END_CRITICAL_SECTION2()
3508
221k
    return ret;
3509
221k
}
3510
3511
/*[clinic input]
3512
list.__init__
3513
3514
    iterable: object(c_default="NULL") = ()
3515
    /
3516
3517
Built-in mutable sequence.
3518
3519
If no argument is given, the constructor creates a new empty list.
3520
The argument must be an iterable if specified.
3521
[clinic start generated code]*/
3522
3523
static int
3524
list___init___impl(PyListObject *self, PyObject *iterable)
3525
/*[clinic end generated code: output=0f3c21379d01de48 input=b3f3fe7206af8f6b]*/
3526
21.1M
{
3527
    /* Verify list invariants established by PyType_GenericAlloc() */
3528
21.1M
    assert(0 <= Py_SIZE(self));
3529
21.1M
    assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
3530
21.1M
    assert(self->ob_item != NULL ||
3531
21.1M
           self->allocated == 0 || self->allocated == -1);
3532
3533
    /* Empty previous contents */
3534
21.1M
    if (self->ob_item != NULL) {
3535
0
        Py_BEGIN_CRITICAL_SECTION(self);
3536
0
        list_clear(self);
3537
0
        Py_END_CRITICAL_SECTION();
3538
0
    }
3539
21.1M
    if (iterable != NULL) {
3540
10.2M
        if (_list_extend(self, iterable) < 0) {
3541
0
            return -1;
3542
0
        }
3543
10.2M
    }
3544
21.1M
    return 0;
3545
21.1M
}
3546
3547
static PyObject *
3548
list_vectorcall(PyObject *type, PyObject * const*args,
3549
                size_t nargsf, PyObject *kwnames)
3550
10.2M
{
3551
10.2M
    if (!_PyArg_NoKwnames("list", kwnames)) {
3552
0
        return NULL;
3553
0
    }
3554
10.2M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
3555
10.2M
    if (!_PyArg_CheckPositional("list", nargs, 0, 1)) {
3556
0
        return NULL;
3557
0
    }
3558
3559
10.2M
    PyObject *list = PyType_GenericAlloc(_PyType_CAST(type), 0);
3560
10.2M
    if (list == NULL) {
3561
0
        return NULL;
3562
0
    }
3563
10.2M
    if (nargs) {
3564
10.2M
        if (list___init___impl((PyListObject *)list, args[0])) {
3565
0
            Py_DECREF(list);
3566
0
            return NULL;
3567
0
        }
3568
10.2M
    }
3569
10.2M
    return list;
3570
10.2M
}
3571
3572
3573
/*[clinic input]
3574
list.__sizeof__
3575
3576
Return the size of the list in memory, in bytes.
3577
[clinic start generated code]*/
3578
3579
static PyObject *
3580
list___sizeof___impl(PyListObject *self)
3581
/*[clinic end generated code: output=3417541f95f9a53e input=b8030a5d5ce8a187]*/
3582
0
{
3583
0
    size_t res = _PyObject_SIZE(Py_TYPE(self));
3584
#ifdef Py_GIL_DISABLED
3585
    PyObject **ob_item = _Py_atomic_load_ptr(&self->ob_item);
3586
    if (ob_item != NULL) {
3587
        res += list_capacity(ob_item) * sizeof(PyObject *);
3588
    }
3589
#else
3590
0
    res += (size_t)self->allocated * sizeof(PyObject *);
3591
0
#endif
3592
0
    return PyLong_FromSize_t(res);
3593
0
}
3594
3595
static PyObject *list_iter(PyObject *seq);
3596
static PyObject *list_subscript(PyObject*, PyObject*);
3597
3598
static PyMethodDef list_methods[] = {
3599
    {"__getitem__", list_subscript, METH_O|METH_COEXIST,
3600
     PyDoc_STR("__getitem__($self, index, /)\n--\n\nReturn self[index].")},
3601
    LIST___REVERSED___METHODDEF
3602
    LIST___SIZEOF___METHODDEF
3603
    PY_LIST_CLEAR_METHODDEF
3604
    LIST_COPY_METHODDEF
3605
    LIST_APPEND_METHODDEF
3606
    LIST_INSERT_METHODDEF
3607
    LIST_EXTEND_METHODDEF
3608
    LIST_POP_METHODDEF
3609
    LIST_REMOVE_METHODDEF
3610
    LIST_INDEX_METHODDEF
3611
    LIST_COUNT_METHODDEF
3612
    LIST_REVERSE_METHODDEF
3613
    LIST_SORT_METHODDEF
3614
    {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
3615
    {NULL,              NULL}           /* sentinel */
3616
};
3617
3618
static PySequenceMethods list_as_sequence = {
3619
    list_length,                                /* sq_length */
3620
    list_concat,                                /* sq_concat */
3621
    list_repeat,                                /* sq_repeat */
3622
    list_item,                                  /* sq_item */
3623
    0,                                          /* sq_slice */
3624
    list_ass_item,                              /* sq_ass_item */
3625
    0,                                          /* sq_ass_slice */
3626
    list_contains,                              /* sq_contains */
3627
    list_inplace_concat,                        /* sq_inplace_concat */
3628
    list_inplace_repeat,                        /* sq_inplace_repeat */
3629
};
3630
3631
static inline PyObject *
3632
list_slice_step_lock_held(PyListObject *a, Py_ssize_t start, Py_ssize_t step, Py_ssize_t len)
3633
601
{
3634
601
    PyListObject *np = (PyListObject *)list_new_prealloc(len);
3635
601
    if (np == NULL) {
3636
0
        return NULL;
3637
0
    }
3638
601
    size_t cur;
3639
601
    Py_ssize_t i;
3640
601
    PyObject **src = a->ob_item;
3641
601
    PyObject **dest = np->ob_item;
3642
5.68k
    for (cur = start, i = 0; i < len;
3643
5.08k
            cur += (size_t)step, i++) {
3644
5.08k
        PyObject *v = src[cur];
3645
5.08k
        dest[i] = Py_NewRef(v);
3646
5.08k
    }
3647
601
    Py_SET_SIZE(np, len);
3648
601
    return (PyObject *)np;
3649
601
}
3650
3651
static PyObject *
3652
list_slice_wrap(PyListObject *aa, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t step)
3653
2.85M
{
3654
2.85M
    PyObject *res = NULL;
3655
2.85M
    Py_BEGIN_CRITICAL_SECTION(aa);
3656
2.85M
    Py_ssize_t len = PySlice_AdjustIndices(Py_SIZE(aa), &start, &stop, step);
3657
2.85M
    if (len <= 0) {
3658
425k
        res = PyList_New(0);
3659
425k
    }
3660
2.42M
    else if (step == 1) {
3661
2.42M
        res = list_slice_lock_held(aa, start, stop);
3662
2.42M
    }
3663
601
    else {
3664
601
        res = list_slice_step_lock_held(aa, start, step, len);
3665
601
    }
3666
2.85M
    Py_END_CRITICAL_SECTION();
3667
2.85M
    return res;
3668
2.85M
}
3669
3670
static inline PyObject*
3671
list_slice_subscript(PyObject* self, PyObject* item)
3672
2.85M
{
3673
2.85M
    assert(PyList_Check(self));
3674
2.85M
    assert(PySlice_Check(item));
3675
2.85M
    Py_ssize_t start, stop, step;
3676
2.85M
    if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
3677
0
        return NULL;
3678
0
    }
3679
2.85M
    return list_slice_wrap((PyListObject *)self, start, stop, step);
3680
2.85M
}
3681
3682
PyObject *
3683
_PyList_SliceSubscript(PyObject* _self, PyObject* item)
3684
2.85M
{
3685
2.85M
    return list_slice_subscript(_self, item);
3686
2.85M
}
3687
3688
static PyObject *
3689
list_subscript(PyObject* _self, PyObject* item)
3690
24.0M
{
3691
24.0M
    PyListObject* self = (PyListObject*)_self;
3692
24.0M
    if (_PyIndex_Check(item)) {
3693
24.0M
        Py_ssize_t i;
3694
24.0M
        i = PyNumber_AsSsize_t(item, PyExc_IndexError);
3695
24.0M
        if (i == -1 && PyErr_Occurred())
3696
22
            return NULL;
3697
24.0M
        if (i < 0)
3698
18.7M
            i += PyList_GET_SIZE(self);
3699
24.0M
        return list_item((PyObject *)self, i);
3700
24.0M
    }
3701
278
    else if (PySlice_Check(item)) {
3702
278
        return list_slice_subscript(_self, item);
3703
278
    }
3704
0
    else {
3705
0
        PyErr_Format(PyExc_TypeError,
3706
0
                     "list indices must be integers or slices, not %.200s",
3707
0
                     Py_TYPE(item)->tp_name);
3708
0
        return NULL;
3709
0
    }
3710
24.0M
}
3711
3712
static Py_ssize_t
3713
adjust_slice_indexes(PyListObject *lst,
3714
                     Py_ssize_t *start, Py_ssize_t *stop,
3715
                     Py_ssize_t step)
3716
256k
{
3717
256k
    Py_ssize_t slicelength = PySlice_AdjustIndices(Py_SIZE(lst), start, stop,
3718
256k
                                                   step);
3719
3720
    /* Make sure s[5:2] = [..] inserts at the right place:
3721
        before 5, not before 2. */
3722
256k
    if ((step < 0 && *start < *stop) ||
3723
256k
        (step > 0 && *start > *stop))
3724
0
        *stop = *start;
3725
3726
256k
    return slicelength;
3727
256k
}
3728
3729
static int
3730
list_ass_subscript_lock_held(PyObject *_self, PyObject *item, PyObject *value)
3731
4.02M
{
3732
4.02M
    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(_self);
3733
3734
4.02M
    PyListObject *self = (PyListObject *)_self;
3735
4.02M
    if (_PyIndex_Check(item)) {
3736
3.76M
        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
3737
3.76M
        if (i == -1 && PyErr_Occurred())
3738
0
            return -1;
3739
3.76M
        if (i < 0)
3740
3.76M
            i += PyList_GET_SIZE(self);
3741
3.76M
        return list_ass_item_lock_held(self, i, value);
3742
3.76M
    }
3743
256k
    else if (PySlice_Check(item)) {
3744
256k
        Py_ssize_t start, stop, step;
3745
3746
256k
        if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
3747
0
            return -1;
3748
0
        }
3749
3750
256k
        if (value == NULL) {
3751
            /* delete slice */
3752
134
            PyObject **garbage;
3753
134
            size_t cur;
3754
134
            Py_ssize_t i;
3755
134
            int res;
3756
3757
134
            Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop,
3758
134
                                                          step);
3759
3760
134
            if (step == 1)
3761
134
                return list_ass_slice_lock_held(self, start, stop, value);
3762
3763
0
            if (slicelength <= 0)
3764
0
                return 0;
3765
3766
0
            if (step < 0) {
3767
0
                stop = start + 1;
3768
0
                start = stop + step*(slicelength - 1) - 1;
3769
0
                step = -step;
3770
0
            }
3771
3772
0
            garbage = (PyObject**)
3773
0
                PyMem_Malloc(slicelength*sizeof(PyObject*));
3774
0
            if (!garbage) {
3775
0
                PyErr_NoMemory();
3776
0
                return -1;
3777
0
            }
3778
3779
            /* drawing pictures might help understand these for
3780
               loops. Basically, we memmove the parts of the
3781
               list that are *not* part of the slice: step-1
3782
               items for each item that is part of the slice,
3783
               and then tail end of the list that was not
3784
               covered by the slice */
3785
0
            for (cur = start, i = 0;
3786
0
                 cur < (size_t)stop;
3787
0
                 cur += step, i++) {
3788
0
                Py_ssize_t lim = step - 1;
3789
3790
0
                garbage[i] = PyList_GET_ITEM(self, cur);
3791
3792
0
                if (cur + step >= (size_t)Py_SIZE(self)) {
3793
0
                    lim = Py_SIZE(self) - cur - 1;
3794
0
                }
3795
3796
0
                memmove(self->ob_item + cur - i,
3797
0
                    self->ob_item + cur + 1,
3798
0
                    lim * sizeof(PyObject *));
3799
0
            }
3800
0
            cur = start + (size_t)slicelength * step;
3801
0
            if (cur < (size_t)Py_SIZE(self)) {
3802
0
                memmove(self->ob_item + cur - slicelength,
3803
0
                    self->ob_item + cur,
3804
0
                    (Py_SIZE(self) - cur) *
3805
0
                     sizeof(PyObject *));
3806
0
            }
3807
3808
0
            Py_SET_SIZE(self, Py_SIZE(self) - slicelength);
3809
0
            res = list_resize(self, Py_SIZE(self));
3810
3811
0
            for (i = 0; i < slicelength; i++) {
3812
0
                Py_DECREF(garbage[i]);
3813
0
            }
3814
0
            PyMem_Free(garbage);
3815
3816
0
            return res;
3817
0
        }
3818
256k
        else {
3819
            /* assign slice */
3820
256k
            PyObject *ins, *seq;
3821
256k
            PyObject **garbage, **seqitems, **selfitems;
3822
256k
            Py_ssize_t i;
3823
256k
            size_t cur;
3824
3825
            /* protect against a[::-1] = a */
3826
256k
            if (self == (PyListObject*)value) {
3827
0
                seq = list_slice_lock_held((PyListObject *)value, 0,
3828
0
                                            Py_SIZE(value));
3829
0
            }
3830
256k
            else {
3831
256k
                seq = PySequence_Fast(value,
3832
256k
                                      "must assign iterable "
3833
256k
                                      "to extended slice");
3834
256k
            }
3835
256k
            if (!seq)
3836
0
                return -1;
3837
3838
256k
            Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop,
3839
256k
                                                          step);
3840
3841
256k
            if (step == 1) {
3842
256k
                int res = list_ass_slice_lock_held(self, start, stop, seq);
3843
256k
                Py_DECREF(seq);
3844
256k
                return res;
3845
256k
            }
3846
3847
0
            if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
3848
0
                PyErr_Format(PyExc_ValueError,
3849
0
                    "attempt to assign sequence of "
3850
0
                    "size %zd to extended slice of "
3851
0
                    "size %zd",
3852
0
                         PySequence_Fast_GET_SIZE(seq),
3853
0
                         slicelength);
3854
0
                Py_DECREF(seq);
3855
0
                return -1;
3856
0
            }
3857
3858
0
            if (!slicelength) {
3859
0
                Py_DECREF(seq);
3860
0
                return 0;
3861
0
            }
3862
3863
0
            garbage = (PyObject**)
3864
0
                PyMem_Malloc(slicelength*sizeof(PyObject*));
3865
0
            if (!garbage) {
3866
0
                Py_DECREF(seq);
3867
0
                PyErr_NoMemory();
3868
0
                return -1;
3869
0
            }
3870
3871
0
            selfitems = self->ob_item;
3872
0
            seqitems = PySequence_Fast_ITEMS(seq);
3873
0
            for (cur = start, i = 0; i < slicelength;
3874
0
                 cur += (size_t)step, i++) {
3875
0
                garbage[i] = selfitems[cur];
3876
0
                ins = Py_NewRef(seqitems[i]);
3877
0
                FT_ATOMIC_STORE_PTR_RELEASE(selfitems[cur], ins);
3878
0
            }
3879
3880
0
            for (i = 0; i < slicelength; i++) {
3881
0
                Py_DECREF(garbage[i]);
3882
0
            }
3883
3884
0
            PyMem_Free(garbage);
3885
0
            Py_DECREF(seq);
3886
3887
0
            return 0;
3888
0
        }
3889
256k
    }
3890
0
    else {
3891
0
        PyErr_Format(PyExc_TypeError,
3892
0
                     "list indices must be integers or slices, not %.200s",
3893
0
                     Py_TYPE(item)->tp_name);
3894
0
        return -1;
3895
0
    }
3896
4.02M
}
3897
3898
static int
3899
list_ass_subscript(PyObject *self, PyObject *item, PyObject *value)
3900
4.02M
{
3901
4.02M
    int res;
3902
#ifdef Py_GIL_DISABLED
3903
    if (PySlice_Check(item) && value != NULL && PyList_CheckExact(value)) {
3904
        Py_BEGIN_CRITICAL_SECTION2(self, value);
3905
        res = list_ass_subscript_lock_held(self, item, value);
3906
        Py_END_CRITICAL_SECTION2();
3907
        return res;
3908
    }
3909
#endif
3910
4.02M
    Py_BEGIN_CRITICAL_SECTION(self);
3911
4.02M
    res = list_ass_subscript_lock_held(self, item, value);
3912
4.02M
    Py_END_CRITICAL_SECTION();
3913
4.02M
    return res;
3914
4.02M
}
3915
3916
static PyMappingMethods list_as_mapping = {
3917
    list_length,
3918
    list_subscript,
3919
    list_ass_subscript
3920
};
3921
3922
PyTypeObject PyList_Type = {
3923
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
3924
    "list",
3925
    sizeof(PyListObject),
3926
    0,
3927
    list_dealloc,                               /* tp_dealloc */
3928
    0,                                          /* tp_vectorcall_offset */
3929
    0,                                          /* tp_getattr */
3930
    0,                                          /* tp_setattr */
3931
    0,                                          /* tp_as_async */
3932
    list_repr,                                  /* tp_repr */
3933
    0,                                          /* tp_as_number */
3934
    &list_as_sequence,                          /* tp_as_sequence */
3935
    &list_as_mapping,                           /* tp_as_mapping */
3936
    PyObject_HashNotImplemented,                /* tp_hash */
3937
    0,                                          /* tp_call */
3938
    0,                                          /* tp_str */
3939
    PyObject_GenericGetAttr,                    /* tp_getattro */
3940
    0,                                          /* tp_setattro */
3941
    0,                                          /* tp_as_buffer */
3942
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3943
        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS |
3944
        _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_SEQUENCE,  /* tp_flags */
3945
    list___init____doc__,                       /* tp_doc */
3946
    list_traverse,                              /* tp_traverse */
3947
    list_clear_slot,                            /* tp_clear */
3948
    list_richcompare,                           /* tp_richcompare */
3949
    0,                                          /* tp_weaklistoffset */
3950
    list_iter,                                  /* tp_iter */
3951
    0,                                          /* tp_iternext */
3952
    list_methods,                               /* tp_methods */
3953
    0,                                          /* tp_members */
3954
    0,                                          /* tp_getset */
3955
    0,                                          /* tp_base */
3956
    0,                                          /* tp_dict */
3957
    0,                                          /* tp_descr_get */
3958
    0,                                          /* tp_descr_set */
3959
    0,                                          /* tp_dictoffset */
3960
    list___init__,                              /* tp_init */
3961
    PyType_GenericAlloc,                        /* tp_alloc */
3962
    PyType_GenericNew,                          /* tp_new */
3963
    PyObject_GC_Del,                            /* tp_free */
3964
    .tp_vectorcall = list_vectorcall,
3965
    .tp_version_tag = _Py_TYPE_VERSION_LIST,
3966
};
3967
3968
/*********************** List Iterator **************************/
3969
3970
static void listiter_dealloc(PyObject *);
3971
static int listiter_traverse(PyObject *, visitproc, void *);
3972
static PyObject *listiter_next(PyObject *);
3973
static PyObject *listiter_len(PyObject *, PyObject *);
3974
static PyObject *listiter_reduce_general(void *_it, int forward);
3975
static PyObject *listiter_reduce(PyObject *, PyObject *);
3976
static PyObject *listiter_setstate(PyObject *, PyObject *state);
3977
3978
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
3979
PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3980
PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3981
3982
static PyMethodDef listiter_methods[] = {
3983
    {"__length_hint__", listiter_len, METH_NOARGS, length_hint_doc},
3984
    {"__reduce__", listiter_reduce, METH_NOARGS, reduce_doc},
3985
    {"__setstate__", listiter_setstate, METH_O, setstate_doc},
3986
    {NULL,              NULL}           /* sentinel */
3987
};
3988
3989
PyTypeObject PyListIter_Type = {
3990
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
3991
    "list_iterator",                            /* tp_name */
3992
    sizeof(_PyListIterObject),                  /* tp_basicsize */
3993
    0,                                          /* tp_itemsize */
3994
    /* methods */
3995
    listiter_dealloc,               /* tp_dealloc */
3996
    0,                                          /* tp_vectorcall_offset */
3997
    0,                                          /* tp_getattr */
3998
    0,                                          /* tp_setattr */
3999
    0,                                          /* tp_as_async */
4000
    0,                                          /* tp_repr */
4001
    0,                                          /* tp_as_number */
4002
    0,                                          /* tp_as_sequence */
4003
    0,                                          /* tp_as_mapping */
4004
    0,                                          /* tp_hash */
4005
    0,                                          /* tp_call */
4006
    0,                                          /* tp_str */
4007
    PyObject_GenericGetAttr,                    /* tp_getattro */
4008
    0,                                          /* tp_setattro */
4009
    0,                                          /* tp_as_buffer */
4010
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4011
    0,                                          /* tp_doc */
4012
    listiter_traverse,                          /* tp_traverse */
4013
    0,                                          /* tp_clear */
4014
    0,                                          /* tp_richcompare */
4015
    0,                                          /* tp_weaklistoffset */
4016
    PyObject_SelfIter,                          /* tp_iter */
4017
    listiter_next,                              /* tp_iternext */
4018
    listiter_methods,                           /* tp_methods */
4019
    0,                                          /* tp_members */
4020
};
4021
4022
4023
static PyObject *
4024
list_iter(PyObject *seq)
4025
29.6M
{
4026
29.6M
    if (!PyList_Check(seq)) {
4027
0
        PyErr_BadInternalCall();
4028
0
        return NULL;
4029
0
    }
4030
29.6M
    _PyListIterObject *it = _Py_FREELIST_POP(_PyListIterObject, list_iters);
4031
29.6M
    if (it == NULL) {
4032
3.01M
        it = PyObject_GC_New(_PyListIterObject, &PyListIter_Type);
4033
3.01M
        if (it == NULL) {
4034
0
            return NULL;
4035
0
        }
4036
3.01M
    }
4037
29.6M
    it->it_index = 0;
4038
29.6M
    it->it_seq = (PyListObject *)Py_NewRef(seq);
4039
29.6M
    _PyObject_GC_TRACK(it);
4040
29.6M
    return (PyObject *)it;
4041
29.6M
}
4042
4043
static void
4044
listiter_dealloc(PyObject *self)
4045
29.6M
{
4046
29.6M
    _PyListIterObject *it = (_PyListIterObject *)self;
4047
29.6M
    _PyObject_GC_UNTRACK(it);
4048
29.6M
    Py_XDECREF(it->it_seq);
4049
29.6M
    assert(Py_IS_TYPE(self, &PyListIter_Type));
4050
29.6M
    _Py_FREELIST_FREE(list_iters, it, PyObject_GC_Del);
4051
29.6M
}
4052
4053
static int
4054
listiter_traverse(PyObject *it, visitproc visit, void *arg)
4055
845k
{
4056
845k
    Py_VISIT(((_PyListIterObject *)it)->it_seq);
4057
845k
    return 0;
4058
845k
}
4059
4060
static PyObject *
4061
listiter_next(PyObject *self)
4062
127M
{
4063
127M
    _PyListIterObject *it = (_PyListIterObject *)self;
4064
127M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4065
127M
    if (index < 0) {
4066
162
        return NULL;
4067
162
    }
4068
4069
127M
    PyObject *item = list_get_item_ref(it->it_seq, index);
4070
127M
    if (item == NULL) {
4071
        // out-of-bounds
4072
29.1M
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, -1);
4073
29.1M
#ifndef Py_GIL_DISABLED
4074
29.1M
        PyListObject *seq = it->it_seq;
4075
29.1M
        it->it_seq = NULL;
4076
29.1M
        Py_DECREF(seq);
4077
29.1M
#endif
4078
29.1M
        return NULL;
4079
29.1M
    }
4080
98.1M
    FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index + 1);
4081
98.1M
    return item;
4082
127M
}
4083
4084
static PyObject *
4085
listiter_len(PyObject *self, PyObject *Py_UNUSED(ignored))
4086
1.53M
{
4087
1.53M
    assert(self != NULL);
4088
1.53M
    _PyListIterObject *it = (_PyListIterObject *)self;
4089
1.53M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4090
1.53M
    if (index >= 0) {
4091
1.53M
        Py_ssize_t len = PyList_GET_SIZE(it->it_seq) - index;
4092
1.53M
        if (len >= 0)
4093
1.53M
            return PyLong_FromSsize_t(len);
4094
1.53M
    }
4095
0
    return PyLong_FromLong(0);
4096
1.53M
}
4097
4098
static PyObject *
4099
listiter_reduce(PyObject *it, PyObject *Py_UNUSED(ignored))
4100
0
{
4101
0
    return listiter_reduce_general(it, 1);
4102
0
}
4103
4104
static PyObject *
4105
listiter_setstate(PyObject *self, PyObject *state)
4106
0
{
4107
0
    _PyListIterObject *it = (_PyListIterObject *)self;
4108
0
    Py_ssize_t index = PyLong_AsSsize_t(state);
4109
0
    if (index == -1 && PyErr_Occurred())
4110
0
        return NULL;
4111
0
    if (it->it_seq != NULL) {
4112
0
        if (index < -1)
4113
0
            index = -1;
4114
0
        else if (index > PyList_GET_SIZE(it->it_seq))
4115
0
            index = PyList_GET_SIZE(it->it_seq); /* iterator exhausted */
4116
0
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index);
4117
0
    }
4118
0
    Py_RETURN_NONE;
4119
0
}
4120
4121
/*********************** List Reverse Iterator **************************/
4122
4123
typedef struct {
4124
    PyObject_HEAD
4125
    Py_ssize_t it_index;
4126
    PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
4127
} listreviterobject;
4128
4129
static void listreviter_dealloc(PyObject *);
4130
static int listreviter_traverse(PyObject *, visitproc, void *);
4131
static PyObject *listreviter_next(PyObject *);
4132
static PyObject *listreviter_len(PyObject *, PyObject *);
4133
static PyObject *listreviter_reduce(PyObject *, PyObject *);
4134
static PyObject *listreviter_setstate(PyObject *, PyObject *);
4135
4136
static PyMethodDef listreviter_methods[] = {
4137
    {"__length_hint__", listreviter_len, METH_NOARGS, length_hint_doc},
4138
    {"__reduce__", listreviter_reduce, METH_NOARGS, reduce_doc},
4139
    {"__setstate__", listreviter_setstate, METH_O, setstate_doc},
4140
    {NULL,              NULL}           /* sentinel */
4141
};
4142
4143
PyTypeObject PyListRevIter_Type = {
4144
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
4145
    "list_reverseiterator",                     /* tp_name */
4146
    sizeof(listreviterobject),                  /* tp_basicsize */
4147
    0,                                          /* tp_itemsize */
4148
    /* methods */
4149
    listreviter_dealloc,                        /* tp_dealloc */
4150
    0,                                          /* tp_vectorcall_offset */
4151
    0,                                          /* tp_getattr */
4152
    0,                                          /* tp_setattr */
4153
    0,                                          /* tp_as_async */
4154
    0,                                          /* tp_repr */
4155
    0,                                          /* tp_as_number */
4156
    0,                                          /* tp_as_sequence */
4157
    0,                                          /* tp_as_mapping */
4158
    0,                                          /* tp_hash */
4159
    0,                                          /* tp_call */
4160
    0,                                          /* tp_str */
4161
    PyObject_GenericGetAttr,                    /* tp_getattro */
4162
    0,                                          /* tp_setattro */
4163
    0,                                          /* tp_as_buffer */
4164
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4165
    0,                                          /* tp_doc */
4166
    listreviter_traverse,                       /* tp_traverse */
4167
    0,                                          /* tp_clear */
4168
    0,                                          /* tp_richcompare */
4169
    0,                                          /* tp_weaklistoffset */
4170
    PyObject_SelfIter,                          /* tp_iter */
4171
    listreviter_next,                           /* tp_iternext */
4172
    listreviter_methods,                /* tp_methods */
4173
    0,
4174
};
4175
4176
/*[clinic input]
4177
list.__reversed__
4178
4179
Return a reverse iterator over the list.
4180
[clinic start generated code]*/
4181
4182
static PyObject *
4183
list___reversed___impl(PyListObject *self)
4184
/*[clinic end generated code: output=b166f073208c888c input=eadb6e17f8a6a280]*/
4185
39.2M
{
4186
39.2M
    listreviterobject *it;
4187
4188
39.2M
    it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
4189
39.2M
    if (it == NULL)
4190
0
        return NULL;
4191
39.2M
    assert(PyList_Check(self));
4192
39.2M
    it->it_index = PyList_GET_SIZE(self) - 1;
4193
39.2M
    it->it_seq = (PyListObject*)Py_NewRef(self);
4194
39.2M
    PyObject_GC_Track(it);
4195
39.2M
    return (PyObject *)it;
4196
39.2M
}
4197
4198
static void
4199
listreviter_dealloc(PyObject *self)
4200
39.2M
{
4201
39.2M
    listreviterobject *it = (listreviterobject *)self;
4202
39.2M
    PyObject_GC_UnTrack(it);
4203
39.2M
    Py_XDECREF(it->it_seq);
4204
39.2M
    PyObject_GC_Del(it);
4205
39.2M
}
4206
4207
static int
4208
listreviter_traverse(PyObject *it, visitproc visit, void *arg)
4209
893
{
4210
893
    Py_VISIT(((listreviterobject *)it)->it_seq);
4211
893
    return 0;
4212
893
}
4213
4214
static PyObject *
4215
listreviter_next(PyObject *self)
4216
47.7M
{
4217
47.7M
    listreviterobject *it = (listreviterobject *)self;
4218
47.7M
    assert(it != NULL);
4219
47.7M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4220
47.7M
    if (index < 0) {
4221
25.0M
        return NULL;
4222
25.0M
    }
4223
4224
22.6M
    PyListObject *seq = it->it_seq;
4225
22.6M
    assert(PyList_Check(seq));
4226
22.6M
    PyObject *item = list_get_item_ref(seq, index);
4227
22.6M
    if (item != NULL) {
4228
22.6M
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index - 1);
4229
22.6M
        return item;
4230
22.6M
    }
4231
0
    FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, -1);
4232
0
#ifndef Py_GIL_DISABLED
4233
0
    it->it_seq = NULL;
4234
0
    Py_DECREF(seq);
4235
0
#endif
4236
0
    return NULL;
4237
22.6M
}
4238
4239
static PyObject *
4240
listreviter_len(PyObject *self, PyObject *Py_UNUSED(ignored))
4241
0
{
4242
0
    listreviterobject *it = (listreviterobject *)self;
4243
0
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4244
0
    Py_ssize_t len = index + 1;
4245
0
    if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
4246
0
        len = 0;
4247
0
    return PyLong_FromSsize_t(len);
4248
0
}
4249
4250
static PyObject *
4251
listreviter_reduce(PyObject *it, PyObject *Py_UNUSED(ignored))
4252
0
{
4253
0
    return listiter_reduce_general(it, 0);
4254
0
}
4255
4256
static PyObject *
4257
listreviter_setstate(PyObject *self, PyObject *state)
4258
0
{
4259
0
    listreviterobject *it = (listreviterobject *)self;
4260
0
    Py_ssize_t index = PyLong_AsSsize_t(state);
4261
0
    if (index == -1 && PyErr_Occurred())
4262
0
        return NULL;
4263
0
    if (it->it_seq != NULL) {
4264
0
        if (index < -1)
4265
0
            index = -1;
4266
0
        else if (index > PyList_GET_SIZE(it->it_seq) - 1)
4267
0
            index = PyList_GET_SIZE(it->it_seq) - 1;
4268
0
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index);
4269
0
    }
4270
0
    Py_RETURN_NONE;
4271
0
}
4272
4273
/* common pickling support */
4274
4275
static PyObject *
4276
listiter_reduce_general(void *_it, int forward)
4277
0
{
4278
0
    PyObject *list;
4279
0
    PyObject *iter;
4280
4281
    /* _PyEval_GetBuiltin can invoke arbitrary code,
4282
     * call must be before access of iterator pointers.
4283
     * see issue #101765 */
4284
4285
0
    if (forward) {
4286
0
        iter = _PyEval_GetBuiltin(&_Py_ID(iter));
4287
0
        _PyListIterObject *it = (_PyListIterObject *)_it;
4288
0
        Py_ssize_t idx = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4289
0
        if (idx >= 0) {
4290
0
            return Py_BuildValue("N(O)n", iter, it->it_seq, idx);
4291
0
        }
4292
0
    } else {
4293
0
        iter = _PyEval_GetBuiltin(&_Py_ID(reversed));
4294
0
        listreviterobject *it = (listreviterobject *)_it;
4295
0
        Py_ssize_t idx = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4296
0
        if (idx >= 0) {
4297
0
            return Py_BuildValue("N(O)n", iter, it->it_seq, idx);
4298
0
        }
4299
0
    }
4300
    /* empty iterator, create an empty list */
4301
0
    list = PyList_New(0);
4302
0
    if (list == NULL) {
4303
0
        Py_DECREF(iter);
4304
0
        return NULL;
4305
0
    }
4306
0
    return Py_BuildValue("N(N)", iter, list);
4307
0
}