Coverage Report

Created: 2026-07-16 07:04

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