Coverage Report

Created: 2026-05-30 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Objects/listobject.c
Line
Count
Source
1
/* List object implementation */
2
3
#include "Python.h"
4
#include "pycore_abstract.h"      // _PyIndex_Check()
5
#include "pycore_ceval.h"         // _PyEval_GetBuiltin()
6
#include "pycore_critical_section.h"  // _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED()
7
#include "pycore_dict.h"          // _PyDictViewObject
8
#include "pycore_freelist.h"      // _Py_FREELIST_FREE(), _Py_FREELIST_POP()
9
#include "pycore_interp.h"        // PyInterpreterState.list
10
#include "pycore_list.h"          // struct _Py_list_freelist, _PyListIterObject
11
#include "pycore_long.h"          // _PyLong_DigitCount
12
#include "pycore_modsupport.h"    // _PyArg_NoKwnames()
13
#include "pycore_object.h"        // _PyObject_GC_TRACK(), _PyDebugAllocatorStats()
14
#include "pycore_pyatomic_ft_wrappers.h"
15
#include "pycore_setobject.h"     // _PySet_NextEntry()
16
#include "pycore_stackref.h"      // _Py_TryIncrefCompareStackRef()
17
#include "pycore_tuple.h"         // _PyTuple_FromArraySteal()
18
#include "pycore_typeobject.h"    // _Py_TYPE_VERSION_LIST
19
#include <stddef.h>
20
21
/*[clinic input]
22
class list "PyListObject *" "&PyList_Type"
23
[clinic start generated code]*/
24
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f9b222678f9f71e0]*/
25
26
#include "clinic/listobject.c.h"
27
28
_Py_DECLARE_STR(list_err, "list index out of range");
29
30
#ifdef Py_GIL_DISABLED
31
typedef struct {
32
    Py_ssize_t allocated;
33
    PyObject *ob_item[];
34
} _PyListArray;
35
36
static _PyListArray *
37
list_allocate_array(size_t capacity)
38
{
39
    if (capacity > PY_SSIZE_T_MAX/sizeof(PyObject*) - 1) {
40
        return NULL;
41
    }
42
    _PyListArray *array = PyMem_Malloc(sizeof(_PyListArray) + capacity * sizeof(PyObject *));
43
    if (array == NULL) {
44
        return NULL;
45
    }
46
    array->allocated = capacity;
47
    return array;
48
}
49
50
static Py_ssize_t
51
list_capacity(PyObject **items)
52
{
53
    _PyListArray *array = _Py_CONTAINER_OF(items, _PyListArray, ob_item);
54
    return array->allocated;
55
}
56
#endif
57
58
static void
59
free_list_items(PyObject** items, bool use_qsbr)
60
129M
{
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
129M
    PyMem_Free(items);
72
129M
#endif
73
129M
}
74
75
static void
76
ensure_shared_on_resize(PyListObject *self)
77
95.3M
{
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
95.3M
}
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
105M
{
106
105M
    size_t new_allocated, target_bytes;
107
105M
    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
105M
    if (allocated >= newsize && newsize >= (allocated >> 1)) {
114
10.2M
        assert(self->ob_item != NULL || newsize == 0);
115
10.2M
        Py_SET_SIZE(self, newsize);
116
10.2M
        return 0;
117
10.2M
    }
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
95.3M
    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
95.3M
    if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize))
134
287k
        new_allocated = ((size_t)newsize + 3) & ~(size_t)3;
135
136
95.3M
    if (newsize == 0)
137
29.2k
        new_allocated = 0;
138
139
95.3M
    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
95.3M
    PyObject **items;
173
95.3M
    if (new_allocated <= (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {
174
95.3M
        target_bytes = new_allocated * sizeof(PyObject *);
175
95.3M
        items = (PyObject **)PyMem_Realloc(self->ob_item, target_bytes);
176
95.3M
    }
177
0
    else {
178
        // integer overflow
179
0
        items = NULL;
180
0
    }
181
95.3M
    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
95.3M
    self->ob_item = items;
191
95.3M
    Py_SET_SIZE(self, newsize);
192
95.3M
    self->allocated = new_allocated;
193
95.3M
#endif
194
95.3M
    return 0;
195
95.3M
}
196
197
static int
198
list_preallocate_exact(PyListObject *self, Py_ssize_t size)
199
7.71M
{
200
7.71M
    PyObject **items;
201
7.71M
    assert(self->ob_item == NULL);
202
7.71M
    assert(size > 0);
203
204
    /* Since the Python memory allocator has granularity of 16 bytes on 64-bit
205
     * platforms (8 on 32-bit), there is no benefit of allocating space for
206
     * the odd number of items, and there is no drawback of rounding the
207
     * allocated size up to the nearest even number.
208
     */
209
7.71M
    size = (size + 1) & ~(size_t)1;
210
#ifdef Py_GIL_DISABLED
211
    _PyListArray *array = list_allocate_array(size);
212
    if (array == NULL) {
213
        PyErr_NoMemory();
214
        return -1;
215
    }
216
    items = array->ob_item;
217
    memset(items, 0, size * sizeof(PyObject *));
218
#else
219
7.71M
    items = PyMem_New(PyObject*, size);
220
7.71M
    if (items == NULL) {
221
0
        PyErr_NoMemory();
222
0
        return -1;
223
0
    }
224
7.71M
#endif
225
7.71M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, items);
226
7.71M
    self->allocated = size;
227
7.71M
    return 0;
228
7.71M
}
229
230
/* Print summary info about the state of the optimized allocator */
231
void
232
_PyList_DebugMallocStats(FILE *out)
233
0
{
234
0
    _PyDebugAllocatorStats(out,
235
0
                           "free PyListObject",
236
0
                            _Py_FREELIST_SIZE(lists),
237
0
                           _PyType_PreHeaderSize(&PyList_Type) + sizeof(PyListObject));
238
0
}
239
240
PyObject *
241
PyList_New(Py_ssize_t size)
242
216M
{
243
216M
    if (size < 0) {
244
0
        PyErr_BadInternalCall();
245
0
        return NULL;
246
0
    }
247
248
216M
    PyListObject *op = _Py_FREELIST_POP(PyListObject, lists);
249
216M
    if (op == NULL) {
250
44.8M
        op = PyObject_GC_New(PyListObject, &PyList_Type);
251
44.8M
        if (op == NULL) {
252
0
            return NULL;
253
0
        }
254
44.8M
    }
255
216M
    if (size <= 0) {
256
175M
        op->ob_item = NULL;
257
175M
    }
258
40.9M
    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
40.9M
        op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));
269
40.9M
#endif
270
40.9M
        if (op->ob_item == NULL) {
271
0
            Py_DECREF(op);
272
0
            return PyErr_NoMemory();
273
0
        }
274
40.9M
    }
275
216M
    Py_SET_SIZE(op, size);
276
216M
    op->allocated = size;
277
216M
    _PyObject_GC_TRACK(op);
278
216M
    return (PyObject *) op;
279
216M
}
280
281
static PyObject *
282
list_new_prealloc(Py_ssize_t size)
283
15.9M
{
284
15.9M
    assert(size > 0);
285
15.9M
    PyListObject *op = (PyListObject *) PyList_New(0);
286
15.9M
    if (op == NULL) {
287
0
        return NULL;
288
0
    }
289
15.9M
    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
15.9M
    op->ob_item = PyMem_New(PyObject *, size);
299
15.9M
    if (op->ob_item == NULL) {
300
0
        Py_DECREF(op);
301
0
        return PyErr_NoMemory();
302
0
    }
303
15.9M
#endif
304
15.9M
    op->allocated = size;
305
15.9M
    return (PyObject *) op;
306
15.9M
}
307
308
Py_ssize_t
309
PyList_Size(PyObject *op)
310
83.2k
{
311
83.2k
    if (!PyList_Check(op)) {
312
0
        PyErr_BadInternalCall();
313
0
        return -1;
314
0
    }
315
83.2k
    else {
316
83.2k
        return PyList_GET_SIZE(op);
317
83.2k
    }
318
83.2k
}
319
320
static inline int
321
valid_index(Py_ssize_t i, Py_ssize_t limit)
322
237M
{
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
237M
    return (size_t) i < (size_t) limit;
331
237M
}
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
169M
{
383
169M
    if (!valid_index(i, Py_SIZE(op))) {
384
29.2M
        return NULL;
385
29.2M
    }
386
140M
    return Py_NewRef(PyList_GET_ITEM(op, i));
387
169M
}
388
#endif
389
390
PyObject *
391
PyList_GetItem(PyObject *op, Py_ssize_t i)
392
144
{
393
144
    if (!PyList_Check(op)) {
394
0
        PyErr_BadInternalCall();
395
0
        return NULL;
396
0
    }
397
144
    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
144
    return ((PyListObject *)op) -> ob_item[i];
403
144
}
404
405
PyObject *
406
PyList_GetItemRef(PyObject *op, Py_ssize_t i)
407
77.9k
{
408
77.9k
    if (!PyList_Check(op)) {
409
0
        PyErr_SetString(PyExc_TypeError, "expected a list");
410
0
        return NULL;
411
0
    }
412
77.9k
    PyObject *item = list_get_item_ref((PyListObject *)op, i);
413
77.9k
    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
77.9k
    return item;
419
77.9k
}
420
421
PyObject *
422
_PyList_GetItemRef(PyListObject *list, Py_ssize_t i)
423
1.07M
{
424
1.07M
    return list_get_item_ref(list, i);
425
1.07M
}
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
13.2M
{
457
13.2M
    if (!PyList_Check(op)) {
458
0
        Py_XDECREF(newitem);
459
0
        PyErr_BadInternalCall();
460
0
        return -1;
461
0
    }
462
13.2M
    int ret;
463
13.2M
    PyListObject *self = ((PyListObject *)op);
464
13.2M
    Py_BEGIN_CRITICAL_SECTION(self);
465
13.2M
    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
13.2M
    PyObject *tmp = self->ob_item[i];
473
13.2M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[i], newitem);
474
13.2M
    Py_XDECREF(tmp);
475
13.2M
    ret = 0;
476
13.2M
end:;
477
13.2M
    Py_END_CRITICAL_SECTION();
478
13.2M
    return ret;
479
13.2M
}
480
481
static int
482
ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
483
1.61k
{
484
1.61k
    Py_ssize_t i, n = Py_SIZE(self);
485
1.61k
    PyObject **items;
486
1.61k
    if (v == NULL) {
487
0
        PyErr_BadInternalCall();
488
0
        return -1;
489
0
    }
490
491
1.61k
    assert((size_t)n + 1 < PY_SSIZE_T_MAX);
492
1.61k
    if (list_resize(self, n+1) < 0)
493
0
        return -1;
494
495
1.61k
    if (where < 0) {
496
0
        where += n;
497
0
        if (where < 0)
498
0
            where = 0;
499
0
    }
500
1.61k
    if (where > n)
501
0
        where = n;
502
1.61k
    items = self->ob_item;
503
11.2k
    for (i = n; --i >= where; )
504
9.62k
        FT_ATOMIC_STORE_PTR_RELEASE(items[i+1], items[i]);
505
1.61k
    FT_ATOMIC_STORE_PTR_RELEASE(items[where], Py_NewRef(v));
506
1.61k
    return 0;
507
1.61k
}
508
509
int
510
PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
511
43
{
512
43
    if (!PyList_Check(op)) {
513
0
        PyErr_BadInternalCall();
514
0
        return -1;
515
0
    }
516
43
    PyListObject *self = (PyListObject *)op;
517
43
    int err;
518
43
    Py_BEGIN_CRITICAL_SECTION(self);
519
43
    err = ins1(self, where, newitem);
520
43
    Py_END_CRITICAL_SECTION();
521
43
    return err;
522
43
}
523
524
/* internal, used by _PyList_AppendTakeRef */
525
int
526
_PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem)
527
72.2M
{
528
72.2M
    Py_ssize_t len = Py_SIZE(self);
529
72.2M
    assert(self->allocated == -1 || self->allocated == len);
530
72.2M
    if (list_resize(self, len + 1) < 0) {
531
0
        Py_DECREF(newitem);
532
0
        return -1;
533
0
    }
534
72.2M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[len], newitem);
535
72.2M
    return 0;
536
72.2M
}
537
538
int
539
PyList_Append(PyObject *op, PyObject *newitem)
540
223M
{
541
223M
    if (PyList_Check(op) && (newitem != NULL)) {
542
223M
        int ret;
543
223M
        Py_BEGIN_CRITICAL_SECTION(op);
544
223M
        ret = _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
545
223M
        Py_END_CRITICAL_SECTION();
546
223M
        return ret;
547
223M
    }
548
0
    PyErr_BadInternalCall();
549
0
    return -1;
550
223M
}
551
552
/* Methods */
553
554
static void
555
list_dealloc(PyObject *self)
556
237M
{
557
237M
    PyListObject *op = (PyListObject *)self;
558
237M
    Py_ssize_t i;
559
237M
    PyObject_GC_UnTrack(op);
560
237M
    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
120M
        i = Py_SIZE(op);
566
1.67G
        while (--i >= 0) {
567
1.55G
            Py_XDECREF(op->ob_item[i]);
568
1.55G
        }
569
120M
        free_list_items(op->ob_item, false);
570
120M
        op->ob_item = NULL;
571
120M
    }
572
237M
    if (PyList_CheckExact(op)) {
573
226M
        _Py_FREELIST_FREE(lists, op, PyObject_GC_Del);
574
226M
    }
575
10.3M
    else {
576
10.3M
        PyObject_GC_Del(op);
577
10.3M
    }
578
237M
}
579
580
static PyObject *
581
list_repr_impl(PyListObject *v)
582
3.53M
{
583
3.53M
    int res = Py_ReprEnter((PyObject*)v);
584
3.53M
    if (res != 0) {
585
0
        return (res > 0 ? PyUnicode_FromString("[...]") : NULL);
586
0
    }
587
588
    /* "[" + "1" + ", 2" * (len - 1) + "]" */
589
3.53M
    Py_ssize_t prealloc = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1;
590
3.53M
    PyUnicodeWriter *writer = PyUnicodeWriter_Create(prealloc);
591
3.53M
    PyObject *item = NULL;
592
3.53M
    if (writer == NULL) {
593
0
        goto error;
594
0
    }
595
596
3.53M
    if (PyUnicodeWriter_WriteChar(writer, '[') < 0) {
597
0
        goto error;
598
0
    }
599
600
    /* Do repr() on each element.  Note that this may mutate the list,
601
       so must refetch the list size on each iteration. */
602
10.9M
    for (Py_ssize_t i = 0; i < Py_SIZE(v); ++i) {
603
        /* Hold a strong reference since repr(item) can mutate the list */
604
7.40M
        item = Py_XNewRef(v->ob_item[i]);
605
606
7.40M
        if (i > 0) {
607
3.87M
            if (PyUnicodeWriter_WriteChar(writer, ',') < 0) {
608
0
                goto error;
609
0
            }
610
3.87M
            if (PyUnicodeWriter_WriteChar(writer, ' ') < 0) {
611
0
                goto error;
612
0
            }
613
3.87M
        }
614
615
7.40M
        if (PyUnicodeWriter_WriteRepr(writer, item) < 0) {
616
0
            goto error;
617
0
        }
618
7.40M
        Py_CLEAR(item);
619
7.40M
    }
620
621
3.53M
    if (PyUnicodeWriter_WriteChar(writer, ']') < 0) {
622
0
        goto error;
623
0
    }
624
625
3.53M
    Py_ReprLeave((PyObject *)v);
626
3.53M
    return PyUnicodeWriter_Finish(writer);
627
628
0
error:
629
0
    Py_XDECREF(item);
630
0
    PyUnicodeWriter_Discard(writer);
631
0
    Py_ReprLeave((PyObject *)v);
632
0
    return NULL;
633
3.53M
}
634
635
static PyObject *
636
list_repr(PyObject *self)
637
3.64M
{
638
3.64M
    if (PyList_GET_SIZE(self) == 0) {
639
112k
        return PyUnicode_FromString("[]");
640
112k
    }
641
3.53M
    PyListObject *v = (PyListObject *)self;
642
3.53M
    PyObject *ret = NULL;
643
3.53M
    Py_BEGIN_CRITICAL_SECTION(v);
644
3.53M
    ret = list_repr_impl(v);
645
3.53M
    Py_END_CRITICAL_SECTION();
646
3.53M
    return ret;
647
3.64M
}
648
649
static Py_ssize_t
650
list_length(PyObject *a)
651
45.0M
{
652
45.0M
    return PyList_GET_SIZE(a);
653
45.0M
}
654
655
static int
656
list_contains(PyObject *aa, PyObject *el)
657
8.10k
{
658
659
63.4k
    for (Py_ssize_t i = 0; ; i++) {
660
63.4k
        PyObject *item = list_get_item_ref((PyListObject *)aa, i);
661
63.4k
        if (item == NULL) {
662
            // out-of-bounds
663
6.36k
            return 0;
664
6.36k
        }
665
57.0k
        int cmp = PyObject_RichCompareBool(item, el, Py_EQ);
666
57.0k
        Py_DECREF(item);
667
57.0k
        if (cmp != 0) {
668
1.74k
            return cmp;
669
1.74k
        }
670
57.0k
    }
671
0
    return 0;
672
8.10k
}
673
674
static PyObject *
675
list_item(PyObject *aa, Py_ssize_t i)
676
28.3M
{
677
28.3M
    PyListObject *a = (PyListObject *)aa;
678
28.3M
    if (!valid_index(i, PyList_GET_SIZE(a))) {
679
2.38M
        PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
680
2.38M
        return NULL;
681
2.38M
    }
682
26.0M
    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
26.0M
    item = Py_NewRef(a->ob_item[i]);
691
26.0M
#endif
692
26.0M
    return item;
693
28.3M
}
694
695
static PyObject *
696
list_slice_lock_held(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
697
3.06M
{
698
3.06M
    PyListObject *np;
699
3.06M
    PyObject **src, **dest;
700
3.06M
    Py_ssize_t i, len;
701
3.06M
    len = ihigh - ilow;
702
3.06M
    if (len <= 0) {
703
1.68k
        return PyList_New(0);
704
1.68k
    }
705
3.05M
    np = (PyListObject *) list_new_prealloc(len);
706
3.05M
    if (np == NULL)
707
0
        return NULL;
708
709
3.05M
    src = a->ob_item + ilow;
710
3.05M
    dest = np->ob_item;
711
18.2M
    for (i = 0; i < len; i++) {
712
15.1M
        PyObject *v = src[i];
713
15.1M
        dest[i] = Py_NewRef(v);
714
15.1M
    }
715
3.05M
    Py_SET_SIZE(np, len);
716
3.05M
    return (PyObject *)np;
717
3.05M
}
718
719
PyObject *
720
_PyList_BinarySlice(PyObject *container, PyObject *start, PyObject *stop)
721
111k
{
722
111k
    assert(PyList_CheckExact(container));
723
111k
    Py_ssize_t istart = 0;
724
111k
    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
111k
    if (!_PyEval_SliceIndex(start, &istart)) {
729
0
        return NULL;
730
0
    }
731
111k
    if (!_PyEval_SliceIndex(stop, &istop)) {
732
0
        return NULL;
733
0
    }
734
111k
    PyObject *ret;
735
111k
    Py_BEGIN_CRITICAL_SECTION(container);
736
111k
    Py_ssize_t len = Py_SIZE(container);
737
111k
    PySlice_AdjustIndices(len, &istart, &istop, 1);
738
111k
    ret = list_slice_lock_held((PyListObject *)container, istart, istop);
739
111k
    Py_END_CRITICAL_SECTION();
740
111k
    return ret;
741
111k
}
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
19.7M
{
772
19.7M
    Py_ssize_t size;
773
19.7M
    Py_ssize_t i;
774
19.7M
    PyObject **src, **dest;
775
19.7M
    PyListObject *np;
776
19.7M
    assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX);
777
19.7M
    size = Py_SIZE(a) + Py_SIZE(b);
778
19.7M
    if (size == 0) {
779
6.93M
        return PyList_New(0);
780
6.93M
    }
781
12.8M
    np = (PyListObject *) list_new_prealloc(size);
782
12.8M
    if (np == NULL) {
783
0
        return NULL;
784
0
    }
785
12.8M
    src = a->ob_item;
786
12.8M
    dest = np->ob_item;
787
458M
    for (i = 0; i < Py_SIZE(a); i++) {
788
445M
        PyObject *v = src[i];
789
445M
        dest[i] = Py_NewRef(v);
790
445M
    }
791
12.8M
    src = b->ob_item;
792
12.8M
    dest = np->ob_item + Py_SIZE(a);
793
256M
    for (i = 0; i < Py_SIZE(b); i++) {
794
243M
        PyObject *v = src[i];
795
243M
        dest[i] = Py_NewRef(v);
796
243M
    }
797
12.8M
    Py_SET_SIZE(np, size);
798
12.8M
    return (PyObject *)np;
799
12.8M
}
800
801
PyObject *
802
_PyList_Concat(PyObject *aa, PyObject *bb)
803
19.7M
{
804
19.7M
    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
19.7M
    PyListObject *a = (PyListObject *)aa;
811
19.7M
    PyListObject *b = (PyListObject *)bb;
812
19.7M
    PyObject *ret;
813
19.7M
    Py_BEGIN_CRITICAL_SECTION2(a, b);
814
19.7M
    ret = list_concat_lock_held(a, b);
815
19.7M
    Py_END_CRITICAL_SECTION2();
816
19.7M
    return ret;
817
19.7M
}
818
819
static PyObject *
820
list_repeat_lock_held(PyListObject *a, Py_ssize_t n)
821
23.2k
{
822
23.2k
    const Py_ssize_t input_size = Py_SIZE(a);
823
23.2k
    if (input_size == 0 || n <= 0)
824
1.78k
        return PyList_New(0);
825
23.2k
    assert(n > 0);
826
827
21.4k
    if (input_size > PY_SSIZE_T_MAX / n)
828
0
        return PyErr_NoMemory();
829
21.4k
    Py_ssize_t output_size = input_size * n;
830
831
21.4k
    PyListObject *np = (PyListObject *) list_new_prealloc(output_size);
832
21.4k
    if (np == NULL)
833
0
        return NULL;
834
835
21.4k
    PyObject **dest = np->ob_item;
836
21.4k
    if (input_size == 1) {
837
21.4k
        PyObject *elem = a->ob_item[0];
838
21.4k
        _Py_RefcntAdd(elem, n);
839
21.4k
        PyObject **dest_end = dest + output_size;
840
9.55M
        while (dest < dest_end) {
841
9.53M
            *dest++ = elem;
842
9.53M
        }
843
21.4k
    }
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
21.4k
    Py_SET_SIZE(np, output_size);
858
21.4k
    return (PyObject *) np;
859
21.4k
}
860
861
static PyObject *
862
list_repeat(PyObject *aa, Py_ssize_t n)
863
23.2k
{
864
23.2k
    PyObject *ret;
865
23.2k
    PyListObject *a = (PyListObject *)aa;
866
23.2k
    Py_BEGIN_CRITICAL_SECTION(a);
867
23.2k
    ret = list_repeat_lock_held(a, n);
868
23.2k
    Py_END_CRITICAL_SECTION();
869
23.2k
    return ret;
870
23.2k
}
871
872
static void
873
list_clear_impl(PyListObject *a, bool is_resize)
874
9.21M
{
875
9.21M
    PyObject **items = a->ob_item;
876
9.21M
    if (items == NULL) {
877
60
        return;
878
60
    }
879
880
    /* Because XDECREF can recursively invoke operations on
881
       this list, we make it empty first. */
882
9.21M
    Py_ssize_t i = Py_SIZE(a);
883
9.21M
    Py_SET_SIZE(a, 0);
884
9.21M
    FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item, NULL);
885
9.21M
    a->allocated = 0;
886
18.5M
    while (--i >= 0) {
887
9.33M
        Py_XDECREF(items[i]);
888
9.33M
    }
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
9.21M
    bool use_qsbr = false;
896
9.21M
#endif
897
9.21M
    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
9.21M
}
901
902
static void
903
list_clear(PyListObject *a)
904
9.21M
{
905
9.21M
    list_clear_impl(a, true);
906
9.21M
}
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
6.38M
{
920
6.38M
#ifndef Py_GIL_DISABLED
921
6.38M
    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
6.38M
}
942
943
/* a[ilow:ihigh] = v if v != NULL.
944
 * del a[ilow:ihigh] if v == NULL.
945
 *
946
 * Special speed gimmick:  when v is NULL and ihigh - ilow <= 8, it's
947
 * guaranteed the call cannot fail.
948
 */
949
static int
950
list_ass_slice_lock_held(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
951
4.87M
{
952
    /* Because [X]DECREF can recursively invoke list operations on
953
       this list, we must postpone all [X]DECREF activity until
954
       after the list is back in its canonical shape.  Therefore
955
       we must allocate an additional array, 'recycle', into which
956
       we temporarily copy the items that are deleted from the
957
       list. :-( */
958
4.87M
    PyObject *recycle_on_stack[8];
959
4.87M
    PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
960
4.87M
    PyObject **item;
961
4.87M
    PyObject **vitem = NULL;
962
4.87M
    PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
963
4.87M
    Py_ssize_t n; /* # of elements in replacement list */
964
4.87M
    Py_ssize_t norig; /* # of elements in list getting replaced */
965
4.87M
    Py_ssize_t d; /* Change in size */
966
4.87M
    Py_ssize_t k;
967
4.87M
    size_t s;
968
4.87M
    int result = -1;            /* guilty until proved innocent */
969
4.87M
#define b ((PyListObject *)v)
970
4.87M
    if (v == NULL)
971
3.64M
        n = 0;
972
1.23M
    else {
973
1.23M
        v_as_SF = PySequence_Fast(v, "can only assign an iterable");
974
1.23M
        if(v_as_SF == NULL)
975
0
            goto Error;
976
1.23M
        n = PySequence_Fast_GET_SIZE(v_as_SF);
977
1.23M
        vitem = PySequence_Fast_ITEMS(v_as_SF);
978
1.23M
    }
979
4.87M
    if (ilow < 0)
980
0
        ilow = 0;
981
4.87M
    else if (ilow > Py_SIZE(a))
982
950k
        ilow = Py_SIZE(a);
983
984
4.87M
    if (ihigh < ilow)
985
0
        ihigh = ilow;
986
4.87M
    else if (ihigh > Py_SIZE(a))
987
950k
        ihigh = Py_SIZE(a);
988
989
4.87M
    norig = ihigh - ilow;
990
4.87M
    assert(norig >= 0);
991
4.87M
    d = n - norig;
992
4.87M
    if (Py_SIZE(a) + d == 0) {
993
654k
        Py_XDECREF(v_as_SF);
994
654k
        list_clear(a);
995
654k
        return 0;
996
654k
    }
997
4.22M
    item = a->ob_item;
998
    /* recycle the items that we are about to remove */
999
4.22M
    s = norig * sizeof(PyObject *);
1000
    /* If norig == 0, item might be NULL, in which case we may not memcpy from it. */
1001
4.22M
    if (s) {
1002
3.01M
        if (s > sizeof(recycle_on_stack)) {
1003
79
            recycle = (PyObject **)PyMem_Malloc(s);
1004
79
            if (recycle == NULL) {
1005
0
                PyErr_NoMemory();
1006
0
                goto Error;
1007
0
            }
1008
79
        }
1009
3.01M
        memcpy(recycle, &item[ilow], s);
1010
3.01M
    }
1011
1012
4.22M
    if (d < 0) { /* Delete -d items */
1013
3.01M
        Py_ssize_t tail = Py_SIZE(a) - ihigh;
1014
3.01M
        ptr_wise_atomic_memmove(a, &item[ihigh+d], &item[ihigh], tail);
1015
3.01M
        (void)list_resize(a, Py_SIZE(a) + d); // NB: shrinking a list can't fail
1016
3.01M
        item = a->ob_item;
1017
3.01M
    }
1018
1.20M
    else if (d > 0) { /* Insert d items */
1019
1.20M
        k = Py_SIZE(a);
1020
1.20M
        if (list_resize(a, k+d) < 0)
1021
0
            goto Error;
1022
1.20M
        item = a->ob_item;
1023
1.20M
        ptr_wise_atomic_memmove(a, &item[ihigh+d], &item[ihigh], k - ihigh);
1024
1.20M
    }
1025
63.6M
    for (k = 0; k < n; k++, ilow++) {
1026
59.3M
        PyObject *w = vitem[k];
1027
59.3M
        FT_ATOMIC_STORE_PTR_RELEASE(item[ilow], Py_XNewRef(w));
1028
59.3M
    }
1029
7.24M
    for (k = norig - 1; k >= 0; --k)
1030
3.02M
        Py_XDECREF(recycle[k]);
1031
4.22M
    result = 0;
1032
4.22M
 Error:
1033
4.22M
    if (recycle != recycle_on_stack)
1034
79
        PyMem_Free(recycle);
1035
4.22M
    Py_XDECREF(v_as_SF);
1036
4.22M
    return result;
1037
4.22M
#undef b
1038
4.22M
}
1039
1040
static int
1041
list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1042
4.57M
{
1043
4.57M
    int ret;
1044
4.57M
    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
4.57M
    else if (v != NULL && PyList_CheckExact(v)) {
1058
283k
        Py_BEGIN_CRITICAL_SECTION2(a, v);
1059
283k
        ret = list_ass_slice_lock_held(a, ilow, ihigh, v);
1060
283k
        Py_END_CRITICAL_SECTION2();
1061
283k
    }
1062
4.29M
    else {
1063
4.29M
        Py_BEGIN_CRITICAL_SECTION(a);
1064
4.29M
        ret = list_ass_slice_lock_held(a, ilow, ihigh, v);
1065
4.29M
        Py_END_CRITICAL_SECTION();
1066
4.29M
    }
1067
4.57M
    return ret;
1068
4.57M
}
1069
1070
int
1071
PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1072
4.57M
{
1073
4.57M
    if (!PyList_Check(a)) {
1074
0
        PyErr_BadInternalCall();
1075
0
        return -1;
1076
0
    }
1077
4.57M
    return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
1078
4.57M
}
1079
1080
static int
1081
list_inplace_repeat_lock_held(PyListObject *self, Py_ssize_t n)
1082
0
{
1083
0
    Py_ssize_t input_size = PyList_GET_SIZE(self);
1084
0
    if (input_size == 0 || n == 1) {
1085
0
        return 0;
1086
0
    }
1087
1088
0
    if (n < 1) {
1089
0
        list_clear(self);
1090
0
        return 0;
1091
0
    }
1092
1093
0
    if (input_size > PY_SSIZE_T_MAX / n) {
1094
0
        PyErr_NoMemory();
1095
0
        return -1;
1096
0
    }
1097
0
    Py_ssize_t output_size = input_size * n;
1098
1099
0
    if (list_resize(self, output_size) < 0) {
1100
0
        return -1;
1101
0
    }
1102
1103
0
    PyObject **items = self->ob_item;
1104
0
    for (Py_ssize_t j = 0; j < input_size; j++) {
1105
0
        _Py_RefcntAdd(items[j], n-1);
1106
0
    }
1107
0
#ifndef Py_GIL_DISABLED
1108
0
    _Py_memory_repeat((char *)items, sizeof(PyObject *)*output_size,
1109
0
                      sizeof(PyObject *)*input_size);
1110
#else
1111
    Py_ssize_t copied = input_size;
1112
    while (copied < output_size) {
1113
        Py_ssize_t items_to_copy = Py_MIN(copied, output_size - copied);
1114
        ptr_wise_atomic_memmove(self, items + copied, items, items_to_copy);
1115
        copied += items_to_copy;
1116
    }
1117
#endif
1118
0
    return 0;
1119
0
}
1120
1121
static PyObject *
1122
list_inplace_repeat(PyObject *_self, Py_ssize_t n)
1123
0
{
1124
0
    PyObject *ret;
1125
0
    PyListObject *self = (PyListObject *) _self;
1126
0
    Py_BEGIN_CRITICAL_SECTION(self);
1127
0
    if (list_inplace_repeat_lock_held(self, n) < 0) {
1128
0
        ret = NULL;
1129
0
    }
1130
0
    else {
1131
0
        ret = Py_NewRef(self);
1132
0
    }
1133
0
    Py_END_CRITICAL_SECTION();
1134
0
    return ret;
1135
0
}
1136
1137
static int
1138
list_ass_item_lock_held(PyListObject *a, Py_ssize_t i, PyObject *v)
1139
4.26M
{
1140
4.26M
    if (!valid_index(i, Py_SIZE(a))) {
1141
0
        PyErr_SetString(PyExc_IndexError,
1142
0
                        "list assignment index out of range");
1143
0
        return -1;
1144
0
    }
1145
4.26M
    PyObject *tmp = a->ob_item[i];
1146
4.26M
    if (v == NULL) {
1147
11.0k
        Py_ssize_t size = Py_SIZE(a);
1148
360k
        for (Py_ssize_t idx = i; idx < size - 1; idx++) {
1149
349k
            FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item[idx], a->ob_item[idx + 1]);
1150
349k
        }
1151
11.0k
        Py_SET_SIZE(a, size - 1);
1152
11.0k
    }
1153
4.25M
    else {
1154
4.25M
        FT_ATOMIC_STORE_PTR_RELEASE(a->ob_item[i], Py_NewRef(v));
1155
4.25M
    }
1156
4.26M
    Py_DECREF(tmp);
1157
4.26M
    return 0;
1158
4.26M
}
1159
1160
static int
1161
list_ass_item(PyObject *aa, Py_ssize_t i, PyObject *v)
1162
4.58k
{
1163
4.58k
    int ret;
1164
4.58k
    PyListObject *a = (PyListObject *)aa;
1165
4.58k
    Py_BEGIN_CRITICAL_SECTION(a);
1166
4.58k
    ret = list_ass_item_lock_held(a, i, v);
1167
4.58k
    Py_END_CRITICAL_SECTION();
1168
4.58k
    return ret;
1169
4.58k
}
1170
1171
/*[clinic input]
1172
@critical_section
1173
list.insert
1174
1175
    index: Py_ssize_t
1176
    object: object
1177
    /
1178
1179
Insert object before index.
1180
[clinic start generated code]*/
1181
1182
static PyObject *
1183
list_insert_impl(PyListObject *self, Py_ssize_t index, PyObject *object)
1184
/*[clinic end generated code: output=7f35e32f60c8cb78 input=b1987ca998a4ae2d]*/
1185
1.56k
{
1186
1.56k
    if (ins1(self, index, object) == 0) {
1187
1.56k
        Py_RETURN_NONE;
1188
1.56k
    }
1189
0
    return NULL;
1190
1.56k
}
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
7.15k
{
1203
7.15k
    list_clear(self);
1204
7.15k
    Py_RETURN_NONE;
1205
7.15k
}
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
121M
{
1235
121M
    if (_PyList_AppendTakeRef(self, Py_NewRef(object)) < 0) {
1236
0
        return NULL;
1237
0
    }
1238
121M
    Py_RETURN_NONE;
1239
121M
}
1240
1241
static int
1242
list_extend_fast(PyListObject *self, PyObject *iterable)
1243
16.9M
{
1244
16.9M
    Py_ssize_t n = PySequence_Fast_GET_SIZE(iterable);
1245
16.9M
    if (n == 0) {
1246
        /* short circuit when iterable is empty */
1247
9.21M
        return 0;
1248
9.21M
    }
1249
1250
7.74M
    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
7.74M
    assert(m < PY_SSIZE_T_MAX - n);
1254
7.74M
    if (self->ob_item == NULL) {
1255
1.40M
        if (list_preallocate_exact(self, n) < 0) {
1256
0
            return -1;
1257
0
        }
1258
1.40M
        Py_SET_SIZE(self, n);
1259
1.40M
    }
1260
6.34M
    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
7.74M
    PyObject **src = PySequence_Fast_ITEMS(iterable);
1271
7.74M
    PyObject **dest = self->ob_item + m;
1272
48.2M
    for (Py_ssize_t i = 0; i < n; i++) {
1273
40.5M
        PyObject *o = src[i];
1274
40.5M
        FT_ATOMIC_STORE_PTR_RELEASE(dest[i], Py_NewRef(o));
1275
40.5M
    }
1276
7.74M
    return 0;
1277
7.74M
}
1278
1279
static int
1280
list_extend_iter_lock_held(PyListObject *self, PyObject *iterable)
1281
6.88M
{
1282
6.88M
    PyObject *it = PyObject_GetIter(iterable);
1283
6.88M
    if (it == NULL) {
1284
0
        return -1;
1285
0
    }
1286
6.88M
    PyObject *(*iternext)(PyObject *) = *Py_TYPE(it)->tp_iternext;
1287
1288
    /* Guess a result list size. */
1289
6.88M
    Py_ssize_t n = PyObject_LengthHint(iterable, 8);
1290
6.88M
    if (n < 0) {
1291
0
        Py_DECREF(it);
1292
0
        return -1;
1293
0
    }
1294
1295
6.88M
    Py_ssize_t m = Py_SIZE(self);
1296
6.88M
    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
6.88M
    else if (self->ob_item == NULL) {
1303
6.60M
        if (n && list_preallocate_exact(self, n) < 0)
1304
0
            goto error;
1305
6.60M
    }
1306
284k
    else {
1307
        /* Make room. */
1308
284k
        if (list_resize(self, m + n) < 0) {
1309
0
            goto error;
1310
0
        }
1311
1312
        /* Make the list sane again. */
1313
284k
        Py_SET_SIZE(self, m);
1314
284k
    }
1315
1316
    /* Run iterator to exhaustion. */
1317
100M
    for (;;) {
1318
100M
        PyObject *item = iternext(it);
1319
100M
        if (item == NULL) {
1320
6.88M
            if (PyErr_Occurred()) {
1321
675
                if (PyErr_ExceptionMatches(PyExc_StopIteration))
1322
0
                    PyErr_Clear();
1323
675
                else
1324
675
                    goto error;
1325
675
            }
1326
6.88M
            break;
1327
6.88M
        }
1328
1329
93.2M
        if (Py_SIZE(self) < self->allocated) {
1330
92.5M
            Py_ssize_t len = Py_SIZE(self);
1331
92.5M
            FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[len], item);  // steals item ref
1332
92.5M
            Py_SET_SIZE(self, len + 1);
1333
92.5M
        }
1334
791k
        else {
1335
791k
            if (_PyList_AppendTakeRef(self, item) < 0)
1336
0
                goto error;
1337
791k
        }
1338
93.2M
    }
1339
1340
    /* Cut back result list if initial guess was too large. */
1341
6.88M
    if (Py_SIZE(self) < self->allocated) {
1342
4.41M
        if (list_resize(self, Py_SIZE(self)) < 0)
1343
0
            goto error;
1344
4.41M
    }
1345
1346
6.88M
    Py_DECREF(it);
1347
6.88M
    return 0;
1348
1349
675
  error:
1350
675
    Py_DECREF(it);
1351
675
    return -1;
1352
6.88M
}
1353
1354
static int
1355
list_extend_lock_held(PyListObject *self, PyObject *iterable)
1356
16.9M
{
1357
16.9M
    PyObject *seq = PySequence_Fast(iterable, "argument must be iterable");
1358
16.9M
    if (!seq) {
1359
0
        return -1;
1360
0
    }
1361
1362
16.9M
    int res = list_extend_fast(self, seq);
1363
16.9M
    Py_DECREF(seq);
1364
16.9M
    return res;
1365
16.9M
}
1366
1367
static int
1368
list_extend_set(PyListObject *self, PySetObject *other)
1369
270k
{
1370
270k
    Py_ssize_t m = Py_SIZE(self);
1371
270k
    Py_ssize_t n = PySet_GET_SIZE(other);
1372
270k
    Py_ssize_t r = m + n;
1373
270k
    if (r == 0) {
1374
684
        return 0;
1375
684
    }
1376
269k
    if (list_resize(self, r) < 0) {
1377
0
        return -1;
1378
0
    }
1379
1380
269k
    assert(self->ob_item != NULL);
1381
    /* populate the end of self with iterable's items */
1382
269k
    Py_ssize_t setpos = 0;
1383
269k
    Py_hash_t hash;
1384
269k
    PyObject *key;
1385
269k
    PyObject **dest = self->ob_item + m;
1386
1.32M
    while (_PySet_NextEntryRef((PyObject *)other, &setpos, &key, &hash)) {
1387
1.05M
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, key);
1388
1.05M
        dest++;
1389
1.05M
    }
1390
269k
    Py_SET_SIZE(self, r);
1391
269k
    return 0;
1392
269k
}
1393
1394
static int
1395
list_extend_dict(PyListObject *self, PyDictObject *dict, int which_item)
1396
4.21M
{
1397
    // which_item: 0 for keys and 1 for values
1398
4.21M
    Py_ssize_t m = Py_SIZE(self);
1399
4.21M
    Py_ssize_t n = PyDict_GET_SIZE(dict);
1400
4.21M
    Py_ssize_t r = m + n;
1401
4.21M
    if (r == 0) {
1402
0
        return 0;
1403
0
    }
1404
4.21M
    if (list_resize(self, r) < 0) {
1405
0
        return -1;
1406
0
    }
1407
1408
4.21M
    assert(self->ob_item != NULL);
1409
4.21M
    PyObject **dest = self->ob_item + m;
1410
4.21M
    Py_ssize_t pos = 0;
1411
4.21M
    PyObject *keyvalue[2];
1412
9.65M
    while (_PyDict_Next((PyObject *)dict, &pos, &keyvalue[0], &keyvalue[1], NULL)) {
1413
5.43M
        PyObject *obj = keyvalue[which_item];
1414
5.43M
        Py_INCREF(obj);
1415
5.43M
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, obj);
1416
5.43M
        dest++;
1417
5.43M
    }
1418
1419
4.21M
    Py_SET_SIZE(self, r);
1420
4.21M
    return 0;
1421
4.21M
}
1422
1423
static int
1424
list_extend_dictitems(PyListObject *self, PyDictObject *dict)
1425
5
{
1426
5
    Py_ssize_t m = Py_SIZE(self);
1427
5
    Py_ssize_t n = PyDict_GET_SIZE(dict);
1428
5
    Py_ssize_t r = m + n;
1429
5
    if (r == 0) {
1430
0
        return 0;
1431
0
    }
1432
5
    if (list_resize(self, r) < 0) {
1433
0
        return -1;
1434
0
    }
1435
1436
5
    assert(self->ob_item != NULL);
1437
5
    PyObject **dest = self->ob_item + m;
1438
5
    Py_ssize_t pos = 0;
1439
5
    Py_ssize_t i = 0;
1440
5
    PyObject *key, *value;
1441
211
    while (_PyDict_Next((PyObject *)dict, &pos, &key, &value, NULL)) {
1442
206
        PyObject *item = _PyTuple_FromPair(key, value);
1443
206
        if (item == NULL) {
1444
0
            Py_SET_SIZE(self, m + i);
1445
0
            return -1;
1446
0
        }
1447
206
        FT_ATOMIC_STORE_PTR_RELEASE(*dest, item);
1448
206
        dest++;
1449
206
        i++;
1450
206
    }
1451
1452
5
    Py_SET_SIZE(self, r);
1453
5
    return 0;
1454
5
}
1455
1456
static int
1457
_list_extend(PyListObject *self, PyObject *iterable)
1458
28.3M
{
1459
    // Special case:
1460
    // lists and tuples which can use PySequence_Fast ops
1461
28.3M
    int res = -1;
1462
28.3M
    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
28.3M
    else if (PyList_CheckExact(iterable)) {
1468
10.6M
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1469
10.6M
        res = list_extend_lock_held(self, iterable);
1470
10.6M
        Py_END_CRITICAL_SECTION2();
1471
10.6M
    }
1472
17.7M
    else if (PyTuple_CheckExact(iterable)) {
1473
6.35M
        Py_BEGIN_CRITICAL_SECTION(self);
1474
6.35M
        res = list_extend_lock_held(self, iterable);
1475
6.35M
        Py_END_CRITICAL_SECTION();
1476
6.35M
    }
1477
11.3M
    else if (PyAnySet_CheckExact(iterable)) {
1478
270k
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1479
270k
        res = list_extend_set(self, (PySetObject *)iterable);
1480
270k
        Py_END_CRITICAL_SECTION2();
1481
270k
    }
1482
11.1M
    else if (PyDict_CheckExact(iterable)) {
1483
4.21M
        Py_BEGIN_CRITICAL_SECTION2(self, iterable);
1484
4.21M
        res = list_extend_dict(self, (PyDictObject *)iterable, 0 /*keys*/);
1485
4.21M
        Py_END_CRITICAL_SECTION2();
1486
4.21M
    }
1487
6.88M
    else if (Py_IS_TYPE(iterable, &PyDictKeys_Type)) {
1488
688
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1489
688
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1490
688
        res = list_extend_dict(self, dict, 0 /*keys*/);
1491
688
        Py_END_CRITICAL_SECTION2();
1492
688
    }
1493
6.88M
    else if (Py_IS_TYPE(iterable, &PyDictValues_Type)) {
1494
9
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1495
9
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1496
9
        res = list_extend_dict(self, dict, 1 /*values*/);
1497
9
        Py_END_CRITICAL_SECTION2();
1498
9
    }
1499
6.88M
    else if (Py_IS_TYPE(iterable, &PyDictItems_Type)) {
1500
5
        PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
1501
5
        Py_BEGIN_CRITICAL_SECTION2(self, dict);
1502
5
        res = list_extend_dictitems(self, dict);
1503
5
        Py_END_CRITICAL_SECTION2();
1504
5
    }
1505
6.88M
    else {
1506
6.88M
        Py_BEGIN_CRITICAL_SECTION(self);
1507
6.88M
        res = list_extend_iter_lock_held(self, iterable);
1508
6.88M
        Py_END_CRITICAL_SECTION();
1509
6.88M
    }
1510
28.3M
    return res;
1511
28.3M
}
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
17.8M
{
1526
17.8M
    if (_list_extend(self, iterable) < 0) {
1527
675
        return NULL;
1528
675
    }
1529
17.8M
    Py_RETURN_NONE;
1530
17.8M
}
1531
1532
PyObject *
1533
_PyList_Extend(PyListObject *self, PyObject *iterable)
1534
16.5M
{
1535
16.5M
    return list_extend((PyObject*)self, iterable);
1536
16.5M
}
1537
1538
int
1539
PyList_Extend(PyObject *self, PyObject *iterable)
1540
0
{
1541
0
    if (!PyList_Check(self)) {
1542
0
        PyErr_BadInternalCall();
1543
0
        return -1;
1544
0
    }
1545
0
    return _list_extend((PyListObject*)self, iterable);
1546
0
}
1547
1548
1549
int
1550
PyList_Clear(PyObject *self)
1551
0
{
1552
0
    if (!PyList_Check(self)) {
1553
0
        PyErr_BadInternalCall();
1554
0
        return -1;
1555
0
    }
1556
0
    Py_BEGIN_CRITICAL_SECTION(self);
1557
0
    list_clear((PyListObject*)self);
1558
0
    Py_END_CRITICAL_SECTION();
1559
0
    return 0;
1560
0
}
1561
1562
1563
static PyObject *
1564
list_inplace_concat(PyObject *_self, PyObject *other)
1565
111k
{
1566
111k
    PyListObject *self = (PyListObject *)_self;
1567
111k
    if (_list_extend(self, other) < 0) {
1568
0
        return NULL;
1569
0
    }
1570
111k
    return Py_NewRef(self);
1571
111k
}
1572
1573
/*[clinic input]
1574
@critical_section
1575
list.pop
1576
1577
    index: Py_ssize_t = -1
1578
    /
1579
1580
Remove and return item at index (default last).
1581
1582
Raises IndexError if list is empty or index is out of range.
1583
[clinic start generated code]*/
1584
1585
static PyObject *
1586
list_pop_impl(PyListObject *self, Py_ssize_t index)
1587
/*[clinic end generated code: output=6bd69dcb3f17eca8 input=c269141068ae4b8f]*/
1588
22.1M
{
1589
22.1M
    PyObject *v;
1590
1591
22.1M
    if (Py_SIZE(self) == 0) {
1592
        /* Special-case most common failure cause */
1593
0
        PyErr_SetString(PyExc_IndexError, "pop from empty list");
1594
0
        return NULL;
1595
0
    }
1596
22.1M
    if (index < 0)
1597
18.7M
        index += Py_SIZE(self);
1598
22.1M
    if (!valid_index(index, Py_SIZE(self))) {
1599
0
        PyErr_SetString(PyExc_IndexError, "pop index out of range");
1600
0
        return NULL;
1601
0
    }
1602
1603
22.1M
    PyObject **items = self->ob_item;
1604
22.1M
    v = items[index];
1605
22.1M
    if (Py_SIZE(self) == 1) {
1606
8.55M
        Py_INCREF(v);
1607
8.55M
        list_clear(self);
1608
8.55M
        return v;
1609
8.55M
    }
1610
13.5M
    Py_ssize_t size_after_pop = Py_SIZE(self) - 1;
1611
13.5M
    if (index < size_after_pop) {
1612
2.16M
        ptr_wise_atomic_memmove(self, &items[index], &items[index+1],
1613
2.16M
                                size_after_pop - index);
1614
2.16M
    }
1615
13.5M
    list_resize(self, size_after_pop);  // NB: shrinking a list can't fail
1616
13.5M
    return v;
1617
22.1M
}
1618
1619
/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
1620
static void
1621
reverse_slice(PyObject **lo, PyObject **hi)
1622
139k
{
1623
139k
    assert(lo && hi);
1624
1625
139k
    --hi;
1626
3.86M
    while (lo < hi) {
1627
3.72M
        PyObject *t = *lo;
1628
3.72M
        FT_ATOMIC_STORE_PTR_RELEASE(*lo, *hi);
1629
3.72M
        FT_ATOMIC_STORE_PTR_RELEASE(*hi, t);
1630
3.72M
        ++lo;
1631
3.72M
        --hi;
1632
3.72M
    }
1633
139k
}
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
37.3k
{
1656
37.3k
    s1->keys[i] = s2->keys[j];
1657
37.3k
    if (s1->values != NULL)
1658
30.2k
        s1->values[i] = s2->values[j];
1659
37.3k
}
1660
1661
Py_LOCAL_INLINE(void)
1662
sortslice_copy_incr(sortslice *dst, sortslice *src)
1663
1.18M
{
1664
1.18M
    *dst->keys++ = *src->keys++;
1665
1.18M
    if (dst->values != NULL)
1666
529k
        *dst->values++ = *src->values++;
1667
1.18M
}
1668
1669
Py_LOCAL_INLINE(void)
1670
sortslice_copy_decr(sortslice *dst, sortslice *src)
1671
2.78M
{
1672
2.78M
    *dst->keys-- = *src->keys--;
1673
2.78M
    if (dst->values != NULL)
1674
504k
        *dst->values-- = *src->values--;
1675
2.78M
}
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
177k
{
1682
177k
    memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1683
177k
    if (s1->values != NULL)
1684
155k
        memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1685
177k
}
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
126k
{
1691
126k
    memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
1692
126k
    if (s1->values != NULL)
1693
107k
        memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
1694
126k
}
1695
1696
Py_LOCAL_INLINE(void)
1697
sortslice_advance(sortslice *slice, Py_ssize_t n)
1698
963k
{
1699
963k
    slice->keys += n;
1700
963k
    if (slice->values != NULL)
1701
590k
        slice->values += n;
1702
963k
}
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
22.2M
#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
18.5M
#define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail;  \
1716
18.5M
           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
4.60M
#define MIN_GALLOP 7
1729
1730
/* Avoid malloc for small temp arrays. */
1731
5.60M
#define MERGESTATE_TEMP_SIZE 256
1732
1733
/* The largest value of minrun. This must be a power of 2, and >= 1 */
1734
4.39M
#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
294k
{
1815
294k
    Py_ssize_t k; /* for IFLT macro expansion */
1816
294k
    PyObject ** const a = ss->keys;
1817
294k
    PyObject ** const v = ss->values;
1818
294k
    const bool has_values = v != NULL;
1819
294k
    PyObject *pivot;
1820
294k
    Py_ssize_t M;
1821
1822
294k
    assert(0 <= ok && ok <= n && 1 <= n && n <= MAX_MINRUN);
1823
    /* assert a[:ok] is sorted */
1824
294k
    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
294k
    Py_ssize_t L, R;
1877
2.99M
    for (; ok < n; ++ok) {
1878
        /* set L to where a[ok] belongs */
1879
2.69M
        L = 0;
1880
2.69M
        R = ok;
1881
2.69M
        pivot = a[ok];
1882
        /* Slice invariants. vacuously true at the start:
1883
         * all a[0:L]  <= pivot
1884
         * all a[L:R]     unknown
1885
         * all a[R:ok]  > pivot
1886
         */
1887
2.69M
        assert(L < R);
1888
10.7M
        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
10.7M
            M = (L + R) >> 1;
1892
10.7M
#if 1 // straightforward, but highly unpredictable branch on random data
1893
10.7M
            IFLT(pivot, a[M])
1894
4.46M
                R = M;
1895
6.30M
            else
1896
6.30M
                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
10.7M
        } while (L < R);
1911
2.69M
        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
19.0M
        for (M = ok; M > L; --M)
1918
16.3M
            a[M] = a[M - 1];
1919
2.69M
        a[L] = pivot;
1920
2.69M
        if (has_values) {
1921
1.50M
            pivot = v[ok];
1922
7.95M
            for (M = ok; M > L; --M)
1923
6.44M
                v[M] = v[M - 1];
1924
1.50M
            v[L] = pivot;
1925
1.50M
        }
1926
2.69M
    }
1927
294k
#endif // pick binary or regular insertion sort
1928
294k
    return 0;
1929
1930
0
 fail:
1931
0
    return -1;
1932
294k
}
1933
1934
static void
1935
sortslice_reverse(sortslice *s, Py_ssize_t n)
1936
96.8k
{
1937
96.8k
    reverse_slice(s->keys, &s->keys[n]);
1938
96.8k
    if (s->values != NULL)
1939
42.7k
        reverse_slice(s->values, &s->values[n]);
1940
96.8k
}
1941
1942
/*
1943
Return the length of the run beginning at slo->keys, spanning no more than
1944
nremaining elements. The run beginning there may be ascending or descending,
1945
but the function permutes it in place, if needed, so that it's always ascending
1946
upon return.
1947
1948
Returns -1 in case of error.
1949
*/
1950
static Py_ssize_t
1951
count_run(MergeState *ms, sortslice *slo, Py_ssize_t nremaining)
1952
472k
{
1953
472k
    Py_ssize_t k; /* used by IFLT macro expansion */
1954
472k
    Py_ssize_t n;
1955
472k
    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
472k
#define REVERSE_LAST_NEQ                        \
1964
2.37M
    if (neq) {                                  \
1965
8.29k
        sortslice slice = *slo;                 \
1966
8.29k
        ++neq;                                  \
1967
8.29k
        sortslice_advance(&slice, n - neq);     \
1968
8.29k
        sortslice_reverse(&slice, neq);         \
1969
8.29k
        neq = 0;                                \
1970
8.29k
    }
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
472k
#define IF_NEXT_LARGER  IFLT(lo[n-1], lo[n])
1978
5.49M
#define IF_NEXT_SMALLER IFLT(lo[n], lo[n-1])
1979
1980
472k
    assert(nremaining);
1981
    /* try ascending run first */
1982
2.96M
    for (n = 1; n < nremaining; ++n) {
1983
2.84M
        IF_NEXT_SMALLER
1984
356k
            break;
1985
2.84M
    }
1986
472k
    if (n == nremaining)
1987
115k
        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
356k
    if (n > 1) {
1999
277k
        IFLT(lo[0], lo[n-1])
2000
272k
            return n;
2001
4.71k
        sortslice_reverse(slo, n);
2002
4.71k
    }
2003
83.8k
    ++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
83.8k
    Py_ssize_t neq = 0;
2010
2.40M
    for ( ; n < nremaining; ++n) {
2011
2.35M
        IF_NEXT_SMALLER {
2012
            /* This ends the most recent run of equal elements, but still in
2013
             * the "descending" direction.
2014
             */
2015
2.29M
            REVERSE_LAST_NEQ
2016
2.29M
        }
2017
67.1k
        else {
2018
67.1k
            IF_NEXT_LARGER /* descending run is over */
2019
36.0k
                break;
2020
31.0k
            else /* not x < y and not y < x implies x == y */
2021
31.0k
                ++neq;
2022
67.1k
        }
2023
2.35M
    }
2024
83.8k
    REVERSE_LAST_NEQ
2025
83.8k
    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
337k
    for ( ; n < nremaining; ++n) {
2032
287k
        IF_NEXT_SMALLER
2033
34.4k
            break;
2034
287k
    }
2035
2036
83.8k
    return n;
2037
0
fail:
2038
0
    return -1;
2039
2040
83.8k
#undef REVERSE_LAST_NEQ
2041
83.8k
#undef IF_NEXT_SMALLER
2042
83.8k
#undef IF_NEXT_LARGER
2043
83.8k
}
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
177k
{
2069
177k
    Py_ssize_t ofs;
2070
177k
    Py_ssize_t lastofs;
2071
177k
    Py_ssize_t k;
2072
2073
177k
    assert(key && a && n > 0 && hint >= 0 && hint < n);
2074
2075
177k
    a += hint;
2076
177k
    lastofs = 0;
2077
177k
    ofs = 1;
2078
177k
    IFLT(*a, key) {
2079
        /* a[hint] < key -- gallop right, until
2080
         * a[hint + lastofs] < key <= a[hint + ofs]
2081
         */
2082
88.1k
        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
2083
262k
        while (ofs < maxofs) {
2084
202k
            IFLT(a[ofs], key) {
2085
174k
                lastofs = ofs;
2086
174k
                assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2087
174k
                ofs = (ofs << 1) + 1;
2088
174k
            }
2089
27.5k
            else                /* key <= a[hint + ofs] */
2090
27.5k
                break;
2091
202k
        }
2092
88.1k
        if (ofs > maxofs)
2093
22.5k
            ofs = maxofs;
2094
        /* Translate back to offsets relative to &a[0]. */
2095
88.1k
        lastofs += hint;
2096
88.1k
        ofs += hint;
2097
88.1k
    }
2098
89.4k
    else {
2099
        /* key <= a[hint] -- gallop left, until
2100
         * a[hint - ofs] < key <= a[hint - lastofs]
2101
         */
2102
89.4k
        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
2103
282k
        while (ofs < maxofs) {
2104
251k
            IFLT(*(a-ofs), key)
2105
58.3k
                break;
2106
            /* key <= a[hint - ofs] */
2107
193k
            lastofs = ofs;
2108
193k
            assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2109
193k
            ofs = (ofs << 1) + 1;
2110
193k
        }
2111
89.4k
        if (ofs > maxofs)
2112
18.0k
            ofs = maxofs;
2113
        /* Translate back to positive offsets relative to &a[0]. */
2114
89.4k
        k = lastofs;
2115
89.4k
        lastofs = hint - ofs;
2116
89.4k
        ofs = hint - k;
2117
89.4k
    }
2118
177k
    a -= hint;
2119
2120
177k
    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
177k
    ++lastofs;
2126
497k
    while (lastofs < ofs) {
2127
319k
        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
2128
2129
319k
        IFLT(a[m], key)
2130
163k
            lastofs = m+1;              /* a[m] < key */
2131
155k
        else
2132
155k
            ofs = m;                    /* key <= a[m] */
2133
319k
    }
2134
177k
    assert(lastofs == ofs);             /* so a[ofs-1] < key <= a[ofs] */
2135
177k
    return ofs;
2136
2137
0
fail:
2138
0
    return -1;
2139
177k
}
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
196k
{
2158
196k
    Py_ssize_t ofs;
2159
196k
    Py_ssize_t lastofs;
2160
196k
    Py_ssize_t k;
2161
2162
196k
    assert(key && a && n > 0 && hint >= 0 && hint < n);
2163
2164
196k
    a += hint;
2165
196k
    lastofs = 0;
2166
196k
    ofs = 1;
2167
196k
    IFLT(key, *a) {
2168
        /* key < a[hint] -- gallop left, until
2169
         * a[hint - ofs] <= key < a[hint - lastofs]
2170
         */
2171
76.3k
        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
2172
194k
        while (ofs < maxofs) {
2173
141k
            IFLT(key, *(a-ofs)) {
2174
118k
                lastofs = ofs;
2175
118k
                assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2176
118k
                ofs = (ofs << 1) + 1;
2177
118k
            }
2178
22.9k
            else                /* a[hint - ofs] <= key */
2179
22.9k
                break;
2180
141k
        }
2181
76.3k
        if (ofs > maxofs)
2182
11.2k
            ofs = maxofs;
2183
        /* Translate back to positive offsets relative to &a[0]. */
2184
76.3k
        k = lastofs;
2185
76.3k
        lastofs = hint - ofs;
2186
76.3k
        ofs = hint - k;
2187
76.3k
    }
2188
120k
    else {
2189
        /* a[hint] <= key -- gallop right, until
2190
         * a[hint + lastofs] <= key < a[hint + ofs]
2191
        */
2192
120k
        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
2193
388k
        while (ofs < maxofs) {
2194
339k
            IFLT(key, a[ofs])
2195
71.4k
                break;
2196
            /* a[hint + ofs] <= key */
2197
267k
            lastofs = ofs;
2198
267k
            assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
2199
267k
            ofs = (ofs << 1) + 1;
2200
267k
        }
2201
120k
        if (ofs > maxofs)
2202
26.4k
            ofs = maxofs;
2203
        /* Translate back to offsets relative to &a[0]. */
2204
120k
        lastofs += hint;
2205
120k
        ofs += hint;
2206
120k
    }
2207
196k
    a -= hint;
2208
2209
196k
    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
196k
    ++lastofs;
2215
534k
    while (lastofs < ofs) {
2216
337k
        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
2217
2218
337k
        IFLT(key, a[m])
2219
171k
            ofs = m;                    /* key < a[m] */
2220
165k
        else
2221
165k
            lastofs = m+1;              /* a[m] <= key */
2222
337k
    }
2223
196k
    assert(lastofs == ofs);             /* so a[ofs-1] <= key < a[ofs] */
2224
196k
    return ofs;
2225
2226
0
fail:
2227
0
    return -1;
2228
196k
}
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
4.36M
{
2235
4.36M
    assert(ms != NULL);
2236
4.36M
    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
620k
        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
620k
        if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
2248
2.45k
            ms->alloced = MERGESTATE_TEMP_SIZE / 2;
2249
620k
        ms->a.values = &ms->temparray[ms->alloced];
2250
620k
    }
2251
3.74M
    else {
2252
3.74M
        ms->alloced = MERGESTATE_TEMP_SIZE;
2253
3.74M
        ms->a.values = NULL;
2254
3.74M
    }
2255
4.36M
    ms->a.keys = ms->temparray;
2256
4.36M
    ms->n = 0;
2257
4.36M
    ms->min_gallop = MIN_GALLOP;
2258
4.36M
    ms->listlen = list_size;
2259
4.36M
    ms->basekeys = lo->keys;
2260
2261
    /* State for generating minrun values. See listsort.txt. */
2262
4.36M
    ms->mr_e = 0;
2263
4.39M
    while (list_size >> ms->mr_e >= MAX_MINRUN) {
2264
29.7k
        ++ms->mr_e;
2265
29.7k
    }
2266
4.36M
    ms->mr_mask = (1 << ms->mr_e) - 1;
2267
4.36M
    ms->mr_current = 0;
2268
4.36M
}
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
4.37M
{
2277
4.37M
    assert(ms != NULL);
2278
4.37M
    if (ms->a.keys != ms->temparray) {
2279
4.43k
        PyMem_Free(ms->a.keys);
2280
4.43k
        ms->a.keys = NULL;
2281
4.43k
    }
2282
4.37M
}
2283
2284
/* Ensure enough temp memory for 'need' array slots is available.
2285
 * Returns 0 on success and -1 if the memory can't be gotten.
2286
 */
2287
static int
2288
merge_getmem(MergeState *ms, Py_ssize_t need)
2289
4.43k
{
2290
4.43k
    int multiplier;
2291
2292
4.43k
    assert(ms != NULL);
2293
4.43k
    if (need <= ms->alloced)
2294
0
        return 0;
2295
2296
4.43k
    multiplier = ms->a.values != NULL ? 2 : 1;
2297
2298
    /* Don't realloc!  That can cost cycles to copy the old data, but
2299
     * we don't care what's in the block.
2300
     */
2301
4.43k
    merge_freemem(ms);
2302
4.43k
    if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject *) / multiplier) {
2303
0
        PyErr_NoMemory();
2304
0
        return -1;
2305
0
    }
2306
4.43k
    ms->a.keys = (PyObject **)PyMem_Malloc(multiplier * need
2307
4.43k
                                          * sizeof(PyObject *));
2308
4.43k
    if (ms->a.keys != NULL) {
2309
4.43k
        ms->alloced = need;
2310
4.43k
        if (ms->a.values != NULL)
2311
4.37k
            ms->a.values = &ms->a.keys[need];
2312
4.43k
        return 0;
2313
4.43k
    }
2314
0
    PyErr_NoMemory();
2315
0
    return -1;
2316
4.43k
}
2317
65.5k
#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 :   \
2318
65.5k
                                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
42.4k
{
2330
42.4k
    Py_ssize_t k;
2331
42.4k
    sortslice dest;
2332
42.4k
    int result = -1;            /* guilty until proved innocent */
2333
42.4k
    Py_ssize_t min_gallop;
2334
2335
42.4k
    assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
2336
42.4k
    assert(ssa.keys + na == ssb.keys);
2337
42.4k
    if (MERGE_GETMEM(ms, na) < 0)
2338
0
        return -1;
2339
42.4k
    sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
2340
42.4k
    dest = ssa;
2341
42.4k
    ssa = ms->a;
2342
2343
42.4k
    sortslice_copy_incr(&dest, &ssb);
2344
42.4k
    --nb;
2345
42.4k
    if (nb == 0)
2346
2.20k
        goto Succeed;
2347
40.2k
    if (na == 1)
2348
6.31k
        goto CopyB;
2349
2350
33.8k
    min_gallop = ms->min_gallop;
2351
60.5k
    for (;;) {
2352
60.5k
        Py_ssize_t acount = 0;          /* # of times A won in a row */
2353
60.5k
        Py_ssize_t bcount = 0;          /* # of times B won in a row */
2354
2355
        /* Do the straightforward thing until (if ever) one run
2356
         * appears to win consistently.
2357
         */
2358
1.01M
        for (;;) {
2359
1.01M
            assert(na > 1 && nb > 0);
2360
1.01M
            k = ISLT(ssb.keys[0], ssa.keys[0]);
2361
1.01M
            if (k) {
2362
512k
                if (k < 0)
2363
0
                    goto Fail;
2364
512k
                sortslice_copy_incr(&dest, &ssb);
2365
512k
                ++bcount;
2366
512k
                acount = 0;
2367
512k
                --nb;
2368
512k
                if (nb == 0)
2369
3.18k
                    goto Succeed;
2370
509k
                if (bcount >= min_gallop)
2371
23.8k
                    break;
2372
509k
            }
2373
502k
            else {
2374
502k
                sortslice_copy_incr(&dest, &ssa);
2375
502k
                ++acount;
2376
502k
                bcount = 0;
2377
502k
                --na;
2378
502k
                if (na == 1)
2379
8.74k
                    goto CopyB;
2380
493k
                if (acount >= min_gallop)
2381
24.8k
                    break;
2382
493k
            }
2383
1.01M
        }
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
48.6k
        ++min_gallop;
2391
74.7k
        do {
2392
74.7k
            assert(na > 1 && nb > 0);
2393
74.7k
            min_gallop -= min_gallop > 1;
2394
74.7k
            ms->min_gallop = min_gallop;
2395
74.7k
            k = gallop_right(ms, ssb.keys[0], ssa.keys, na, 0);
2396
74.7k
            acount = k;
2397
74.7k
            if (k) {
2398
45.8k
                if (k < 0)
2399
0
                    goto Fail;
2400
45.8k
                sortslice_memcpy(&dest, 0, &ssa, 0, k);
2401
45.8k
                sortslice_advance(&dest, k);
2402
45.8k
                sortslice_advance(&ssa, k);
2403
45.8k
                na -= k;
2404
45.8k
                if (na == 1)
2405
7.02k
                    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
38.7k
                if (na == 0)
2411
0
                    goto Succeed;
2412
38.7k
            }
2413
67.7k
            sortslice_copy_incr(&dest, &ssb);
2414
67.7k
            --nb;
2415
67.7k
            if (nb == 0)
2416
1.33k
                goto Succeed;
2417
2418
66.3k
            k = gallop_left(ms, ssa.keys[0], ssb.keys, nb, 0);
2419
66.3k
            bcount = k;
2420
66.3k
            if (k) {
2421
54.1k
                if (k < 0)
2422
0
                    goto Fail;
2423
54.1k
                sortslice_memmove(&dest, 0, &ssb, 0, k);
2424
54.1k
                sortslice_advance(&dest, k);
2425
54.1k
                sortslice_advance(&ssb, k);
2426
54.1k
                nb -= k;
2427
54.1k
                if (nb == 0)
2428
10.2k
                    goto Succeed;
2429
54.1k
            }
2430
56.1k
            sortslice_copy_incr(&dest, &ssa);
2431
56.1k
            --na;
2432
56.1k
            if (na == 1)
2433
3.40k
                goto CopyB;
2434
56.1k
        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
2435
26.6k
        ++min_gallop;           /* penalize it for leaving galloping mode */
2436
26.6k
        ms->min_gallop = min_gallop;
2437
26.6k
    }
2438
16.9k
Succeed:
2439
16.9k
    result = 0;
2440
16.9k
Fail:
2441
16.9k
    if (na)
2442
16.9k
        sortslice_memcpy(&dest, 0, &ssa, 0, na);
2443
16.9k
    return result;
2444
25.4k
CopyB:
2445
25.4k
    assert(na == 1 && nb > 0);
2446
    /* The last element of ssa belongs at the end of the merge. */
2447
25.4k
    sortslice_memmove(&dest, 0, &ssb, 0, nb);
2448
25.4k
    sortslice_copy(&dest, nb, &ssa, 0);
2449
25.4k
    return 0;
2450
16.9k
}
2451
2452
/* Merge the na elements starting at pa with the nb elements starting at
2453
 * ssb.keys = ssa.keys + na in a stable way, in-place.  na and nb must be > 0.
2454
 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
2455
 * should have na >= nb.  See listsort.txt for more info.  Return 0 if
2456
 * successful, -1 if error.
2457
 */
2458
static Py_ssize_t
2459
merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
2460
         sortslice ssb, Py_ssize_t nb)
2461
23.1k
{
2462
23.1k
    Py_ssize_t k;
2463
23.1k
    sortslice dest, basea, baseb;
2464
23.1k
    int result = -1;            /* guilty until proved innocent */
2465
23.1k
    Py_ssize_t min_gallop;
2466
2467
23.1k
    assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
2468
23.1k
    assert(ssa.keys + na == ssb.keys);
2469
23.1k
    if (MERGE_GETMEM(ms, nb) < 0)
2470
0
        return -1;
2471
23.1k
    dest = ssb;
2472
23.1k
    sortslice_advance(&dest, nb-1);
2473
23.1k
    sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
2474
23.1k
    basea = ssa;
2475
23.1k
    baseb = ms->a;
2476
23.1k
    ssb.keys = ms->a.keys + nb - 1;
2477
23.1k
    if (ssb.values != NULL)
2478
21.8k
        ssb.values = ms->a.values + nb - 1;
2479
23.1k
    sortslice_advance(&ssa, na - 1);
2480
2481
23.1k
    sortslice_copy_decr(&dest, &ssa);
2482
23.1k
    --na;
2483
23.1k
    if (na == 0)
2484
0
        goto Succeed;
2485
23.1k
    if (nb == 1)
2486
1.06k
        goto CopyA;
2487
2488
22.0k
    min_gallop = ms->min_gallop;
2489
34.0k
    for (;;) {
2490
34.0k
        Py_ssize_t acount = 0;          /* # of times A won in a row */
2491
34.0k
        Py_ssize_t bcount = 0;          /* # of times B won in a row */
2492
2493
        /* Do the straightforward thing until (if ever) one run
2494
         * appears to win consistently.
2495
         */
2496
2.67M
        for (;;) {
2497
2.67M
            assert(na > 0 && nb > 1);
2498
2.67M
            k = ISLT(ssb.keys[0], ssa.keys[0]);
2499
2.67M
            if (k) {
2500
1.34M
                if (k < 0)
2501
0
                    goto Fail;
2502
1.34M
                sortslice_copy_decr(&dest, &ssa);
2503
1.34M
                ++acount;
2504
1.34M
                bcount = 0;
2505
1.34M
                --na;
2506
1.34M
                if (na == 0)
2507
894
                    goto Succeed;
2508
1.34M
                if (acount >= min_gallop)
2509
15.9k
                    break;
2510
1.34M
            }
2511
1.33M
            else {
2512
1.33M
                sortslice_copy_decr(&dest, &ssb);
2513
1.33M
                ++bcount;
2514
1.33M
                acount = 0;
2515
1.33M
                --nb;
2516
1.33M
                if (nb == 1)
2517
668
                    goto CopyA;
2518
1.33M
                if (bcount >= min_gallop)
2519
16.5k
                    break;
2520
1.33M
            }
2521
2.67M
        }
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
32.5k
        ++min_gallop;
2529
56.1k
        do {
2530
56.1k
            assert(na > 0 && nb > 1);
2531
56.1k
            min_gallop -= min_gallop > 1;
2532
56.1k
            ms->min_gallop = min_gallop;
2533
56.1k
            k = gallop_right(ms, ssb.keys[0], basea.keys, na, na-1);
2534
56.1k
            if (k < 0)
2535
0
                goto Fail;
2536
56.1k
            k = na - k;
2537
56.1k
            acount = k;
2538
56.1k
            if (k) {
2539
35.3k
                sortslice_advance(&dest, -k);
2540
35.3k
                sortslice_advance(&ssa, -k);
2541
35.3k
                sortslice_memmove(&dest, 1, &ssa, 1, k);
2542
35.3k
                na -= k;
2543
35.3k
                if (na == 0)
2544
9.53k
                    goto Succeed;
2545
35.3k
            }
2546
46.5k
            sortslice_copy_decr(&dest, &ssb);
2547
46.5k
            --nb;
2548
46.5k
            if (nb == 1)
2549
875
                goto CopyA;
2550
2551
45.7k
            k = gallop_left(ms, ssa.keys[0], baseb.keys, nb, nb-1);
2552
45.7k
            if (k < 0)
2553
0
                goto Fail;
2554
45.7k
            k = nb - k;
2555
45.7k
            bcount = k;
2556
45.7k
            if (k) {
2557
38.2k
                sortslice_advance(&dest, -k);
2558
38.2k
                sortslice_advance(&ssb, -k);
2559
38.2k
                sortslice_memcpy(&dest, 1, &ssb, 1, k);
2560
38.2k
                nb -= k;
2561
38.2k
                if (nb == 1)
2562
9.22k
                    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
29.0k
                if (nb == 0)
2568
0
                    goto Succeed;
2569
29.0k
            }
2570
36.4k
            sortslice_copy_decr(&dest, &ssa);
2571
36.4k
            --na;
2572
36.4k
            if (na == 0)
2573
858
                goto Succeed;
2574
36.4k
        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
2575
12.0k
        ++min_gallop;           /* penalize it for leaving galloping mode */
2576
12.0k
        ms->min_gallop = min_gallop;
2577
12.0k
    }
2578
11.2k
Succeed:
2579
11.2k
    result = 0;
2580
11.2k
Fail:
2581
11.2k
    if (nb)
2582
11.2k
        sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
2583
11.2k
    return result;
2584
11.8k
CopyA:
2585
11.8k
    assert(nb == 1 && na > 0);
2586
    /* The first element of ssb belongs at the front of the merge. */
2587
11.8k
    sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
2588
11.8k
    sortslice_advance(&dest, -na);
2589
11.8k
    sortslice_advance(&ssa, -na);
2590
11.8k
    sortslice_copy(&dest, 0, &ssb, 0);
2591
11.8k
    return 0;
2592
11.2k
}
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
66.1k
{
2600
66.1k
    sortslice ssa, ssb;
2601
66.1k
    Py_ssize_t na, nb;
2602
66.1k
    Py_ssize_t k;
2603
2604
66.1k
    assert(ms != NULL);
2605
66.1k
    assert(ms->n >= 2);
2606
66.1k
    assert(i >= 0);
2607
66.1k
    assert(i == ms->n - 2 || i == ms->n - 3);
2608
2609
66.1k
    ssa = ms->pending[i].base;
2610
66.1k
    na = ms->pending[i].len;
2611
66.1k
    ssb = ms->pending[i+1].base;
2612
66.1k
    nb = ms->pending[i+1].len;
2613
66.1k
    assert(na > 0 && nb > 0);
2614
66.1k
    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
66.1k
    ms->pending[i].len = na + nb;
2621
66.1k
    if (i == ms->n - 3)
2622
402
        ms->pending[i+1] = ms->pending[i+2];
2623
66.1k
    --ms->n;
2624
2625
    /* Where does b start in a?  Elements in a before that can be
2626
     * ignored (already in place).
2627
     */
2628
66.1k
    k = gallop_right(ms, *ssb.keys, ssa.keys, na, 0);
2629
66.1k
    if (k < 0)
2630
0
        return -1;
2631
66.1k
    sortslice_advance(&ssa, k);
2632
66.1k
    na -= k;
2633
66.1k
    if (na == 0)
2634
586
        return 0;
2635
2636
    /* Where does a end in b?  Elements in b after that can be
2637
     * ignored (already in place).
2638
     */
2639
65.5k
    nb = gallop_left(ms, ssa.keys[na-1], ssb.keys, nb, nb-1);
2640
65.5k
    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
65.5k
    if (na <= nb)
2647
42.4k
        return merge_lo(ms, ssa, na, ssb, nb);
2648
23.1k
    else
2649
23.1k
        return merge_hi(ms, ssa, na, ssb, nb);
2650
65.5k
}
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
66.1k
{
2660
66.1k
    int result = 0;
2661
66.1k
    assert(s1 >= 0);
2662
66.1k
    assert(n1 > 0 && n2 > 0);
2663
66.1k
    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
66.1k
    Py_ssize_t a = 2 * s1 + n1;  /* 2*a */
2674
66.1k
    Py_ssize_t b = a + n1 + n2;  /* 2*b */
2675
    /* Emulate a/n and b/n one bit a time, until bits differ. */
2676
239k
    for (;;) {
2677
239k
        ++result;
2678
239k
        if (a >= n) {  /* both quotient bits are 1 */
2679
88.8k
            assert(b >= a);
2680
88.8k
            a -= n;
2681
88.8k
            b -= n;
2682
88.8k
        }
2683
150k
        else if (b >= n) {  /* a/n bit is 0, b/n bit is 1 */
2684
66.1k
            break;
2685
66.1k
        } /* else both quotient bits are 0 */
2686
239k
        assert(a < b && b < n);
2687
173k
        a <<= 1;
2688
173k
        b <<= 1;
2689
173k
    }
2690
66.1k
    return result;
2691
66.1k
}
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
472k
{
2707
472k
    assert(ms);
2708
472k
    if (ms->n) {
2709
66.1k
        assert(ms->n > 0);
2710
66.1k
        struct s_slice *p = ms->pending;
2711
66.1k
        Py_ssize_t s1 = p[ms->n - 1].base.keys - ms->basekeys; /* start index */
2712
66.1k
        Py_ssize_t n1 = p[ms->n - 1].len;
2713
66.1k
        int power = powerloop(s1, n1, n2, ms->listlen);
2714
105k
        while (ms->n > 1 && p[ms->n - 2].power > power) {
2715
39.2k
            if (merge_at(ms, ms->n - 2) < 0)
2716
0
                return -1;
2717
39.2k
        }
2718
66.1k
        assert(ms->n < 2 || p[ms->n - 2].power < power);
2719
66.1k
        p[ms->n - 1].power = power;
2720
66.1k
    }
2721
472k
    return 0;
2722
472k
}
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
406k
{
2732
406k
    struct s_slice *p = ms->pending;
2733
2734
406k
    assert(ms);
2735
432k
    while (ms->n > 1) {
2736
26.8k
        Py_ssize_t n = ms->n - 2;
2737
26.8k
        if (n > 0 && p[n-1].len < p[n+1].len)
2738
402
            --n;
2739
26.8k
        if (merge_at(ms, n) < 0)
2740
0
            return -1;
2741
26.8k
    }
2742
406k
    return 0;
2743
406k
}
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
472k
{
2749
472k
    ms->mr_current += ms->listlen;
2750
472k
    assert(ms->mr_current >= 0); /* no overflow */
2751
472k
    Py_ssize_t result = ms->mr_current >> ms->mr_e;
2752
472k
    ms->mr_current &= ms->mr_mask;
2753
472k
    return result;
2754
472k
}
2755
2756
/* Here we define custom comparison functions to optimize for the cases one commonly
2757
 * encounters in practice: homogeneous lists, often of one of the basic types. */
2758
2759
/* This struct holds the comparison function and helper functions
2760
 * selected in the pre-sort check. */
2761
2762
/* These are the special case compare functions.
2763
 * ms->key_compare will always point to one of these: */
2764
2765
/* Heterogeneous compare: default, always safe to fall back on. */
2766
static int
2767
safe_object_compare(PyObject *v, PyObject *w, MergeState *ms)
2768
8.31k
{
2769
    /* No assumptions necessary! */
2770
8.31k
    return PyObject_RichCompareBool(v, w, Py_LT);
2771
8.31k
}
2772
2773
/* Homogeneous compare: safe for any two comparable objects of the same type.
2774
 * (ms->key_richcompare is set to ob_type->tp_richcompare in the
2775
 *  pre-sort check.)
2776
 */
2777
static int
2778
unsafe_object_compare(PyObject *v, PyObject *w, MergeState *ms)
2779
8.35M
{
2780
8.35M
    PyObject *res_obj; int res;
2781
2782
    /* No assumptions, because we check first: */
2783
8.35M
    if (Py_TYPE(v)->tp_richcompare != ms->key_richcompare)
2784
0
        return PyObject_RichCompareBool(v, w, Py_LT);
2785
2786
8.35M
    assert(ms->key_richcompare != NULL);
2787
8.35M
    res_obj = (*(ms->key_richcompare))(v, w, Py_LT);
2788
2789
8.35M
    if (res_obj == Py_NotImplemented) {
2790
0
        Py_DECREF(res_obj);
2791
0
        return PyObject_RichCompareBool(v, w, Py_LT);
2792
0
    }
2793
8.35M
    if (res_obj == NULL)
2794
0
        return -1;
2795
2796
8.35M
    if (PyBool_Check(res_obj)) {
2797
8.35M
        res = (res_obj == Py_True);
2798
8.35M
        assert(_Py_IsImmortal(res_obj));
2799
8.35M
    }
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
8.35M
    return res;
2811
8.35M
}
2812
2813
/* Latin string compare: safe for any two latin (one byte per char) strings. */
2814
static int
2815
unsafe_latin_compare(PyObject *v, PyObject *w, MergeState *ms)
2816
3.62M
{
2817
3.62M
    Py_ssize_t len;
2818
3.62M
    int res;
2819
2820
    /* Modified from Objects/unicodeobject.c:unicode_compare, assuming: */
2821
3.62M
    assert(Py_IS_TYPE(v, &PyUnicode_Type));
2822
3.62M
    assert(Py_IS_TYPE(w, &PyUnicode_Type));
2823
3.62M
    assert(PyUnicode_KIND(v) == PyUnicode_KIND(w));
2824
3.62M
    assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND);
2825
2826
3.62M
    len = Py_MIN(PyUnicode_GET_LENGTH(v), PyUnicode_GET_LENGTH(w));
2827
3.62M
    res = memcmp(PyUnicode_DATA(v), PyUnicode_DATA(w), len);
2828
2829
3.62M
    res = (res != 0 ?
2830
3.55M
           res < 0 :
2831
3.62M
           PyUnicode_GET_LENGTH(v) < PyUnicode_GET_LENGTH(w));
2832
2833
3.62M
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));;
2834
3.62M
    return res;
2835
3.62M
}
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
9.16M
{
2841
9.16M
    PyLongObject *vl, *wl;
2842
9.16M
    intptr_t v0, w0;
2843
9.16M
    int res;
2844
2845
    /* Modified from Objects/longobject.c:long_compare, assuming: */
2846
9.16M
    assert(Py_IS_TYPE(v, &PyLong_Type));
2847
9.16M
    assert(Py_IS_TYPE(w, &PyLong_Type));
2848
9.16M
    assert(_PyLong_IsCompact((PyLongObject *)v));
2849
9.16M
    assert(_PyLong_IsCompact((PyLongObject *)w));
2850
2851
9.16M
    vl = (PyLongObject*)v;
2852
9.16M
    wl = (PyLongObject*)w;
2853
2854
9.16M
    v0 = _PyLong_CompactValue(vl);
2855
9.16M
    w0 = _PyLong_CompactValue(wl);
2856
2857
9.16M
    res = v0 < w0;
2858
9.16M
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2859
9.16M
    return res;
2860
9.16M
}
2861
2862
/* Float compare: compare any two floats. */
2863
static int
2864
unsafe_float_compare(PyObject *v, PyObject *w, MergeState *ms)
2865
0
{
2866
0
    int res;
2867
2868
    /* Modified from Objects/floatobject.c:float_richcompare, assuming: */
2869
0
    assert(Py_IS_TYPE(v, &PyFloat_Type));
2870
0
    assert(Py_IS_TYPE(w, &PyFloat_Type));
2871
2872
0
    res = PyFloat_AS_DOUBLE(v) < PyFloat_AS_DOUBLE(w);
2873
0
    assert(res == PyObject_RichCompareBool(v, w, Py_LT));
2874
0
    return res;
2875
0
}
2876
2877
/* Tuple compare: compare *any* two tuples, using
2878
 * ms->tuple_elem_compare to compare the first elements, which is set
2879
 * using the same pre-sort check as we use for ms->key_compare,
2880
 * but run on the list [x[0] for x in L]. This allows us to optimize compares
2881
 * on two levels (as long as [x[0] for x in L] is type-homogeneous.) The idea is
2882
 * that most tuple compares don't involve x[1:]. */
2883
static int
2884
unsafe_tuple_compare(PyObject *v, PyObject *w, MergeState *ms)
2885
4.55M
{
2886
4.55M
    PyTupleObject *vt, *wt;
2887
4.55M
    Py_ssize_t i, vlen, wlen;
2888
4.55M
    int k;
2889
2890
    /* Modified from Objects/tupleobject.c:tuplerichcompare, assuming: */
2891
4.55M
    assert(Py_IS_TYPE(v, &PyTuple_Type));
2892
4.55M
    assert(Py_IS_TYPE(w, &PyTuple_Type));
2893
4.55M
    assert(Py_SIZE(v) > 0);
2894
4.55M
    assert(Py_SIZE(w) > 0);
2895
2896
4.55M
    vt = (PyTupleObject *)v;
2897
4.55M
    wt = (PyTupleObject *)w;
2898
2899
4.55M
    vlen = Py_SIZE(vt);
2900
4.55M
    wlen = Py_SIZE(wt);
2901
2902
6.77M
    for (i = 0; i < vlen && i < wlen; i++) {
2903
5.66M
        k = PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_EQ);
2904
5.66M
        if (k < 0)
2905
0
            return -1;
2906
5.66M
        if (!k)
2907
3.43M
            break;
2908
5.66M
    }
2909
2910
4.55M
    if (i >= vlen || i >= wlen)
2911
1.11M
        return vlen < wlen;
2912
2913
3.43M
    if (i == 0)
2914
3.43M
        return ms->tuple_elem_compare(vt->ob_item[i], wt->ob_item[i], ms);
2915
1.02k
    else
2916
1.02k
        return PyObject_RichCompareBool(vt->ob_item[i], wt->ob_item[i], Py_LT);
2917
3.43M
}
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
4.36M
{
2947
4.36M
    MergeState ms;
2948
4.36M
    Py_ssize_t nremaining;
2949
4.36M
    Py_ssize_t minrun;
2950
4.36M
    sortslice lo;
2951
4.36M
    Py_ssize_t saved_ob_size, saved_allocated;
2952
4.36M
    PyObject **saved_ob_item;
2953
4.36M
    PyObject **final_ob_item;
2954
4.36M
    PyObject *result = NULL;            /* guilty until proved innocent */
2955
4.36M
    Py_ssize_t i;
2956
4.36M
    PyObject **keys;
2957
2958
4.36M
    assert(self != NULL);
2959
4.36M
    assert(PyList_Check(self));
2960
4.36M
    if (keyfunc == Py_None)
2961
3.72M
        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
4.36M
    saved_ob_size = Py_SIZE(self);
2969
4.36M
    saved_ob_item = self->ob_item;
2970
4.36M
    saved_allocated = self->allocated;
2971
4.36M
    Py_SET_SIZE(self, 0);
2972
4.36M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, NULL);
2973
4.36M
    self->allocated = -1; /* any operation will reset it to >= 0 */
2974
2975
4.36M
    if (keyfunc == NULL) {
2976
3.74M
        keys = NULL;
2977
3.74M
        lo.keys = saved_ob_item;
2978
3.74M
        lo.values = NULL;
2979
3.74M
    }
2980
620k
    else {
2981
620k
        if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
2982
            /* Leverage stack space we allocated but won't otherwise use */
2983
616k
            keys = &ms.temparray[saved_ob_size+1];
2984
3.97k
        else {
2985
3.97k
            keys = PyMem_Malloc(sizeof(PyObject *) * saved_ob_size);
2986
3.97k
            if (keys == NULL) {
2987
0
                PyErr_NoMemory();
2988
0
                goto keyfunc_fail;
2989
0
            }
2990
3.97k
        }
2991
2992
5.13M
        for (i = 0; i < saved_ob_size ; i++) {
2993
4.51M
            keys[i] = PyObject_CallOneArg(keyfunc, saved_ob_item[i]);
2994
4.51M
            if (keys[i] == NULL) {
2995
0
                for (i=i-1 ; i>=0 ; i--)
2996
0
                    Py_DECREF(keys[i]);
2997
0
                if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
2998
0
                    PyMem_Free(keys);
2999
0
                goto keyfunc_fail;
3000
0
            }
3001
4.51M
        }
3002
3003
620k
        lo.keys = keys;
3004
620k
        lo.values = saved_ob_item;
3005
620k
    }
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
4.36M
    if (saved_ob_size > 1) {
3013
        /* Assume the first element is representative of the whole list. */
3014
406k
        int keys_are_in_tuples = (Py_IS_TYPE(lo.keys[0], &PyTuple_Type) &&
3015
1.19k
                                  Py_SIZE(lo.keys[0]) > 0);
3016
3017
406k
        PyTypeObject* key_type = (keys_are_in_tuples ?
3018
1.19k
                                  Py_TYPE(PyTuple_GET_ITEM(lo.keys[0], 0)) :
3019
406k
                                  Py_TYPE(lo.keys[0]));
3020
3021
406k
        int keys_are_all_same_type = 1;
3022
406k
        int strings_are_latin = 1;
3023
406k
        int ints_are_bounded = 1;
3024
3025
        /* Prove that assumption by checking every key. */
3026
8.72M
        for (i=0; i < saved_ob_size; i++) {
3027
3028
8.31M
            if (keys_are_in_tuples &&
3029
2.27M
                !(Py_IS_TYPE(lo.keys[i], &PyTuple_Type) && Py_SIZE(lo.keys[i]) != 0)) {
3030
0
                keys_are_in_tuples = 0;
3031
0
                keys_are_all_same_type = 0;
3032
0
                break;
3033
0
            }
3034
3035
            /* Note: for lists of tuples, key is the first element of the tuple
3036
             * lo.keys[i], not lo.keys[i] itself! We verify type-homogeneity
3037
             * for lists of tuples in the if-statement directly above. */
3038
8.31M
            PyObject *key = (keys_are_in_tuples ?
3039
2.27M
                             PyTuple_GET_ITEM(lo.keys[i], 0) :
3040
8.31M
                             lo.keys[i]);
3041
3042
8.31M
            if (!Py_IS_TYPE(key, key_type)) {
3043
4
                keys_are_all_same_type = 0;
3044
                /* If keys are in tuple we must loop over the whole list to make
3045
                   sure all items are tuples */
3046
4
                if (!keys_are_in_tuples) {
3047
4
                    break;
3048
4
                }
3049
4
            }
3050
3051
8.31M
            if (keys_are_all_same_type) {
3052
8.31M
                if (key_type == &PyLong_Type &&
3053
6.25M
                    ints_are_bounded &&
3054
4.59M
                    !_PyLong_IsCompact((PyLongObject *)key)) {
3055
3056
5.70k
                    ints_are_bounded = 0;
3057
5.70k
                }
3058
8.31M
                else if (key_type == &PyUnicode_Type &&
3059
1.83M
                         strings_are_latin &&
3060
1.05M
                         PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) {
3061
3062
212k
                        strings_are_latin = 0;
3063
212k
                    }
3064
8.31M
                }
3065
8.31M
            }
3066
3067
        /* Choose the best compare, given what we now know about the keys. */
3068
406k
        if (keys_are_all_same_type) {
3069
3070
406k
            if (key_type == &PyUnicode_Type && strings_are_latin) {
3071
83.1k
                ms.key_compare = unsafe_latin_compare;
3072
83.1k
            }
3073
322k
            else if (key_type == &PyLong_Type && ints_are_bounded) {
3074
78.7k
                ms.key_compare = unsafe_long_compare;
3075
78.7k
            }
3076
244k
            else if (key_type == &PyFloat_Type) {
3077
0
                ms.key_compare = unsafe_float_compare;
3078
0
            }
3079
244k
            else if ((ms.key_richcompare = key_type->tp_richcompare) != NULL) {
3080
244k
                ms.key_compare = unsafe_object_compare;
3081
244k
            }
3082
0
            else {
3083
0
                ms.key_compare = safe_object_compare;
3084
0
            }
3085
406k
        }
3086
4
        else {
3087
4
            ms.key_compare = safe_object_compare;
3088
4
        }
3089
3090
406k
        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
1.19k
            if (key_type == &PyTuple_Type) {
3094
0
                ms.tuple_elem_compare = safe_object_compare;
3095
0
            }
3096
1.19k
            else {
3097
1.19k
                ms.tuple_elem_compare = ms.key_compare;
3098
1.19k
            }
3099
3100
1.19k
            ms.key_compare = unsafe_tuple_compare;
3101
1.19k
        }
3102
406k
    }
3103
    /* End of pre-sort check: ms is now set properly! */
3104
3105
4.36M
    merge_init(&ms, saved_ob_size, keys != NULL, &lo);
3106
3107
4.36M
    nremaining = saved_ob_size;
3108
4.36M
    if (nremaining < 2)
3109
3.96M
        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
406k
    if (reverse) {
3114
122
        if (keys != NULL)
3115
0
            reverse_slice(&keys[0], &keys[saved_ob_size]);
3116
122
        reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
3117
122
    }
3118
3119
    /* March over the array once, left to right, finding natural runs,
3120
     * and extending short natural runs to minrun elements.
3121
     */
3122
472k
    do {
3123
472k
        Py_ssize_t n;
3124
3125
        /* Identify next run. */
3126
472k
        n = count_run(&ms, &lo, nremaining);
3127
472k
        if (n < 0)
3128
0
            goto fail;
3129
        /* If short, extend to min(minrun, nremaining). */
3130
472k
        minrun = minrun_next(&ms);
3131
472k
        if (n < minrun) {
3132
294k
            const Py_ssize_t force = nremaining <= minrun ?
3133
244k
                              nremaining : minrun;
3134
294k
            if (binarysort(&ms, &lo, force, n) < 0)
3135
0
                goto fail;
3136
294k
            n = force;
3137
294k
        }
3138
        /* Maybe merge pending runs. */
3139
472k
        assert(ms.n == 0 || ms.pending[ms.n -1].base.keys +
3140
472k
                            ms.pending[ms.n-1].len == lo.keys);
3141
472k
        if (found_new_run(&ms, n) < 0)
3142
0
            goto fail;
3143
        /* Push new run on stack. */
3144
472k
        assert(ms.n < MAX_MERGE_PENDING);
3145
472k
        ms.pending[ms.n].base = lo;
3146
472k
        ms.pending[ms.n].len = n;
3147
472k
        ++ms.n;
3148
        /* Advance to find next run. */
3149
472k
        sortslice_advance(&lo, n);
3150
472k
        nremaining -= n;
3151
472k
    } while (nremaining);
3152
3153
406k
    if (merge_force_collapse(&ms) < 0)
3154
0
        goto fail;
3155
406k
    assert(ms.n == 1);
3156
406k
    assert(keys == NULL
3157
406k
           ? ms.pending[0].base.keys == saved_ob_item
3158
406k
           : ms.pending[0].base.keys == &keys[0]);
3159
406k
    assert(ms.pending[0].len == saved_ob_size);
3160
406k
    lo = ms.pending[0].base;
3161
3162
4.36M
succeed:
3163
4.36M
    result = Py_None;
3164
4.36M
fail:
3165
4.36M
    if (keys != NULL) {
3166
5.13M
        for (i = 0; i < saved_ob_size; i++)
3167
4.51M
            Py_DECREF(keys[i]);
3168
620k
        if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2)
3169
3.97k
            PyMem_Free(keys);
3170
620k
    }
3171
3172
4.36M
    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
4.36M
    if (reverse && saved_ob_size > 1)
3181
122
        reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
3182
3183
4.36M
    merge_freemem(&ms);
3184
3185
4.36M
keyfunc_fail:
3186
4.36M
    final_ob_item = self->ob_item;
3187
4.36M
    i = Py_SIZE(self);
3188
4.36M
    Py_SET_SIZE(self, saved_ob_size);
3189
4.36M
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item, saved_ob_item);
3190
4.36M
    FT_ATOMIC_STORE_SSIZE_RELAXED(self->allocated, saved_allocated);
3191
4.36M
    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
4.36M
    return Py_XNewRef(result);
3206
4.36M
}
3207
#undef IFLT
3208
#undef ISLT
3209
3210
int
3211
PyList_Sort(PyObject *v)
3212
20.0k
{
3213
20.0k
    if (v == NULL || !PyList_Check(v)) {
3214
0
        PyErr_BadInternalCall();
3215
0
        return -1;
3216
0
    }
3217
20.0k
    Py_BEGIN_CRITICAL_SECTION(v);
3218
20.0k
    v = list_sort_impl((PyListObject *)v, NULL, 0);
3219
20.0k
    Py_END_CRITICAL_SECTION();
3220
20.0k
    if (v == NULL)
3221
0
        return -1;
3222
20.0k
    Py_DECREF(v);
3223
20.0k
    return 0;
3224
20.0k
}
3225
3226
/*[clinic input]
3227
@critical_section
3228
list.reverse
3229
3230
Reverse *IN PLACE*.
3231
[clinic start generated code]*/
3232
3233
static PyObject *
3234
list_reverse_impl(PyListObject *self)
3235
/*[clinic end generated code: output=482544fc451abea9 input=04ac8e0c6a66e4d9]*/
3236
0
{
3237
0
    if (Py_SIZE(self) > 1)
3238
0
        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
3239
0
    Py_RETURN_NONE;
3240
0
}
3241
3242
int
3243
PyList_Reverse(PyObject *v)
3244
66
{
3245
66
    PyListObject *self = (PyListObject *)v;
3246
3247
66
    if (v == NULL || !PyList_Check(v)) {
3248
0
        PyErr_BadInternalCall();
3249
0
        return -1;
3250
0
    }
3251
66
    Py_BEGIN_CRITICAL_SECTION(self);
3252
66
    if (Py_SIZE(self) > 1) {
3253
66
        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
3254
66
    }
3255
66
    Py_END_CRITICAL_SECTION()
3256
66
    return 0;
3257
66
}
3258
3259
PyObject *
3260
PyList_AsTuple(PyObject *v)
3261
314k
{
3262
314k
    if (v == NULL || !PyList_Check(v)) {
3263
0
        PyErr_BadInternalCall();
3264
0
        return NULL;
3265
0
    }
3266
314k
    PyObject *ret;
3267
314k
    PyListObject *self = (PyListObject *)v;
3268
314k
    Py_BEGIN_CRITICAL_SECTION(self);
3269
314k
    ret = PyTuple_FromArray(self->ob_item, Py_SIZE(v));
3270
314k
    Py_END_CRITICAL_SECTION();
3271
314k
    return ret;
3272
314k
}
3273
3274
PyObject *
3275
_PyList_AsTupleAndClear(PyListObject *self)
3276
9.85M
{
3277
9.85M
    assert(self != NULL);
3278
9.85M
    PyObject *ret;
3279
9.85M
    if (self->ob_item == NULL) {
3280
87.4k
        return PyTuple_New(0);
3281
87.4k
    }
3282
9.76M
    Py_BEGIN_CRITICAL_SECTION(self);
3283
9.76M
    PyObject **items = self->ob_item;
3284
9.76M
    Py_ssize_t size = Py_SIZE(self);
3285
9.76M
    Py_SET_SIZE(self, 0);
3286
9.76M
    ret = _PyTuple_FromArraySteal(items, size);
3287
9.76M
    Py_END_CRITICAL_SECTION();
3288
9.76M
    return ret;
3289
9.85M
}
3290
3291
PyObject *
3292
_PyList_FromStackRefStealOnSuccess(const _PyStackRef *src, Py_ssize_t n)
3293
105M
{
3294
105M
    if (n == 0) {
3295
93.1M
        return PyList_New(0);
3296
93.1M
    }
3297
3298
12.5M
    PyListObject *list = (PyListObject *)PyList_New(n);
3299
12.5M
    if (list == NULL) {
3300
0
        return NULL;
3301
0
    }
3302
3303
12.5M
    PyObject **dst = list->ob_item;
3304
28.6M
    for (Py_ssize_t i = 0; i < n; i++) {
3305
16.1M
        dst[i] = PyStackRef_AsPyObjectSteal(src[i]);
3306
16.1M
    }
3307
3308
12.5M
    return (PyObject *)list;
3309
12.5M
}
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
24
{
3369
24
    Py_ssize_t count = 0;
3370
144
    for (Py_ssize_t i = 0; ; i++) {
3371
144
        PyObject *obj = list_get_item_ref(self, i);
3372
144
        if (obj == NULL) {
3373
            // out-of-bounds
3374
24
            break;
3375
24
        }
3376
120
        if (obj == value) {
3377
96
           count++;
3378
96
           Py_DECREF(obj);
3379
96
           continue;
3380
96
        }
3381
24
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3382
24
        Py_DECREF(obj);
3383
24
        if (cmp > 0)
3384
0
            count++;
3385
24
        else if (cmp < 0)
3386
0
            return NULL;
3387
24
    }
3388
24
    return PyLong_FromSsize_t(count);
3389
24
}
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
16.0k
{
3407
16.0k
    Py_ssize_t i;
3408
3409
16.0k
    for (i = 0; i < Py_SIZE(self); i++) {
3410
16.0k
        PyObject *obj = self->ob_item[i];
3411
16.0k
        Py_INCREF(obj);
3412
16.0k
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
3413
16.0k
        Py_DECREF(obj);
3414
16.0k
        if (cmp > 0) {
3415
16.0k
            if (list_ass_slice_lock_held(self, i, i+1, NULL) == 0)
3416
16.0k
                Py_RETURN_NONE;
3417
0
            return NULL;
3418
16.0k
        }
3419
24
        else if (cmp < 0)
3420
0
            return NULL;
3421
16.0k
    }
3422
2
    PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
3423
2
    return NULL;
3424
16.0k
}
3425
3426
static int
3427
list_traverse(PyObject *self, visitproc visit, void *arg)
3428
140M
{
3429
140M
    PyListObject *o = (PyListObject *)self;
3430
140M
    Py_ssize_t i;
3431
3432
448M
    for (i = Py_SIZE(o); --i >= 0; )
3433
308M
        Py_VISIT(o->ob_item[i]);
3434
140M
    return 0;
3435
140M
}
3436
3437
static PyObject *
3438
list_richcompare_impl(PyObject *v, PyObject *w, int op)
3439
137k
{
3440
137k
    PyListObject *vl, *wl;
3441
137k
    Py_ssize_t i;
3442
3443
137k
    if (!PyList_Check(v) || !PyList_Check(w))
3444
1.96k
        Py_RETURN_NOTIMPLEMENTED;
3445
3446
135k
    vl = (PyListObject *)v;
3447
135k
    wl = (PyListObject *)w;
3448
3449
135k
    if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
3450
        /* Shortcut: if the lengths differ, the lists differ */
3451
19.1k
        if (op == Py_EQ)
3452
19.1k
            Py_RETURN_FALSE;
3453
0
        else
3454
0
            Py_RETURN_TRUE;
3455
19.1k
    }
3456
3457
    /* Search for the first index where items are different */
3458
156k
    for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
3459
140k
        PyObject *vitem = vl->ob_item[i];
3460
140k
        PyObject *witem = wl->ob_item[i];
3461
140k
        if (vitem == witem) {
3462
36.1k
            continue;
3463
36.1k
        }
3464
3465
103k
        Py_INCREF(vitem);
3466
103k
        Py_INCREF(witem);
3467
103k
        int k = PyObject_RichCompareBool(vitem, witem, Py_EQ);
3468
103k
        Py_DECREF(vitem);
3469
103k
        Py_DECREF(witem);
3470
103k
        if (k < 0)
3471
0
            return NULL;
3472
103k
        if (!k)
3473
99.9k
            break;
3474
103k
    }
3475
3476
116k
    if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
3477
        /* No more items to compare -- compare sizes */
3478
16.5k
        Py_RETURN_RICHCOMPARE(Py_SIZE(vl), Py_SIZE(wl), op);
3479
16.5k
    }
3480
3481
    /* We have an item that differs -- shortcuts for EQ/NE */
3482
99.9k
    if (op == Py_EQ) {
3483
99.8k
        Py_RETURN_FALSE;
3484
99.8k
    }
3485
28
    if (op == Py_NE) {
3486
28
        Py_RETURN_TRUE;
3487
28
    }
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
28
}
3499
3500
static PyObject *
3501
list_richcompare(PyObject *v, PyObject *w, int op)
3502
137k
{
3503
137k
    PyObject *ret;
3504
137k
    Py_BEGIN_CRITICAL_SECTION2(v, w);
3505
137k
    ret = list_richcompare_impl(v, w, op);
3506
137k
    Py_END_CRITICAL_SECTION2()
3507
137k
    return ret;
3508
137k
}
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
20.7M
{
3526
    /* Verify list invariants established by PyType_GenericAlloc() */
3527
20.7M
    assert(0 <= Py_SIZE(self));
3528
20.7M
    assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
3529
20.7M
    assert(self->ob_item != NULL ||
3530
20.7M
           self->allocated == 0 || self->allocated == -1);
3531
3532
    /* Empty previous contents */
3533
20.7M
    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
20.7M
    if (iterable != NULL) {
3539
10.3M
        if (_list_extend(self, iterable) < 0) {
3540
0
            return -1;
3541
0
        }
3542
10.3M
    }
3543
20.7M
    return 0;
3544
20.7M
}
3545
3546
static PyObject *
3547
list_vectorcall(PyObject *type, PyObject * const*args,
3548
                size_t nargsf, PyObject *kwnames)
3549
10.3M
{
3550
10.3M
    if (!_PyArg_NoKwnames("list", kwnames)) {
3551
0
        return NULL;
3552
0
    }
3553
10.3M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
3554
10.3M
    if (!_PyArg_CheckPositional("list", nargs, 0, 1)) {
3555
0
        return NULL;
3556
0
    }
3557
3558
10.3M
    PyObject *list = PyType_GenericAlloc(_PyType_CAST(type), 0);
3559
10.3M
    if (list == NULL) {
3560
0
        return NULL;
3561
0
    }
3562
10.3M
    if (nargs) {
3563
10.3M
        if (list___init___impl((PyListObject *)list, args[0])) {
3564
0
            Py_DECREF(list);
3565
0
            return NULL;
3566
0
        }
3567
10.3M
    }
3568
10.3M
    return list;
3569
10.3M
}
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, PyDoc_STR("See PEP 585")},
3614
    {NULL,              NULL}           /* sentinel */
3615
};
3616
3617
static PySequenceMethods list_as_sequence = {
3618
    list_length,                                /* sq_length */
3619
    _PyList_Concat,                             /* sq_concat */
3620
    list_repeat,                                /* sq_repeat */
3621
    list_item,                                  /* sq_item */
3622
    0,                                          /* sq_slice */
3623
    list_ass_item,                              /* sq_ass_item */
3624
    0,                                          /* sq_ass_slice */
3625
    list_contains,                              /* sq_contains */
3626
    list_inplace_concat,                        /* sq_inplace_concat */
3627
    list_inplace_repeat,                        /* sq_inplace_repeat */
3628
};
3629
3630
static inline PyObject *
3631
list_slice_step_lock_held(PyListObject *a, Py_ssize_t start, Py_ssize_t step, Py_ssize_t len)
3632
379
{
3633
379
    PyListObject *np = (PyListObject *)list_new_prealloc(len);
3634
379
    if (np == NULL) {
3635
0
        return NULL;
3636
0
    }
3637
379
    size_t cur;
3638
379
    Py_ssize_t i;
3639
379
    PyObject **src = a->ob_item;
3640
379
    PyObject **dest = np->ob_item;
3641
3.52k
    for (cur = start, i = 0; i < len;
3642
3.14k
            cur += (size_t)step, i++) {
3643
3.14k
        PyObject *v = src[cur];
3644
3.14k
        dest[i] = Py_NewRef(v);
3645
3.14k
    }
3646
379
    Py_SET_SIZE(np, len);
3647
379
    return (PyObject *)np;
3648
379
}
3649
3650
static PyObject *
3651
list_slice_wrap(PyListObject *aa, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t step)
3652
3.37M
{
3653
3.37M
    PyObject *res = NULL;
3654
3.37M
    Py_BEGIN_CRITICAL_SECTION(aa);
3655
3.37M
    Py_ssize_t len = PySlice_AdjustIndices(Py_SIZE(aa), &start, &stop, step);
3656
3.37M
    if (len <= 0) {
3657
429k
        res = PyList_New(0);
3658
429k
    }
3659
2.94M
    else if (step == 1) {
3660
2.94M
        res = list_slice_lock_held(aa, start, stop);
3661
2.94M
    }
3662
379
    else {
3663
379
        res = list_slice_step_lock_held(aa, start, step, len);
3664
379
    }
3665
3.37M
    Py_END_CRITICAL_SECTION();
3666
3.37M
    return res;
3667
3.37M
}
3668
3669
static inline PyObject*
3670
list_slice_subscript(PyObject* self, PyObject* item)
3671
3.37M
{
3672
3.37M
    assert(PyList_Check(self));
3673
3.37M
    assert(PySlice_Check(item));
3674
3.37M
    Py_ssize_t start, stop, step;
3675
3.37M
    if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
3676
0
        return NULL;
3677
0
    }
3678
3.37M
    return list_slice_wrap((PyListObject *)self, start, stop, step);
3679
3.37M
}
3680
3681
PyObject *
3682
_PyList_SliceSubscript(PyObject* _self, PyObject* item)
3683
3.37M
{
3684
3.37M
    return list_slice_subscript(_self, item);
3685
3.37M
}
3686
3687
static PyObject *
3688
list_subscript(PyObject* _self, PyObject* item)
3689
28.3M
{
3690
28.3M
    PyListObject* self = (PyListObject*)_self;
3691
28.3M
    if (_PyIndex_Check(item)) {
3692
28.3M
        Py_ssize_t i;
3693
28.3M
        i = PyNumber_AsSsize_t(item, PyExc_IndexError);
3694
28.3M
        if (i == -1 && PyErr_Occurred())
3695
22
            return NULL;
3696
28.3M
        if (i < 0)
3697
22.2M
            i += PyList_GET_SIZE(self);
3698
28.3M
        return list_item((PyObject *)self, i);
3699
28.3M
    }
3700
262
    else if (PySlice_Check(item)) {
3701
262
        return list_slice_subscript(_self, item);
3702
262
    }
3703
0
    else {
3704
0
        PyErr_Format(PyExc_TypeError,
3705
0
                     "list indices must be integers or slices, not %.200s",
3706
0
                     Py_TYPE(item)->tp_name);
3707
0
        return NULL;
3708
0
    }
3709
28.3M
}
3710
3711
static Py_ssize_t
3712
adjust_slice_indexes(PyListObject *lst,
3713
                     Py_ssize_t *start, Py_ssize_t *stop,
3714
                     Py_ssize_t step)
3715
281k
{
3716
281k
    Py_ssize_t slicelength = PySlice_AdjustIndices(Py_SIZE(lst), start, stop,
3717
281k
                                                   step);
3718
3719
    /* Make sure s[5:2] = [..] inserts at the right place:
3720
        before 5, not before 2. */
3721
281k
    if ((step < 0 && *start < *stop) ||
3722
281k
        (step > 0 && *start > *stop))
3723
0
        *stop = *start;
3724
3725
281k
    return slicelength;
3726
281k
}
3727
3728
static int
3729
list_ass_subscript_lock_held(PyObject *_self, PyObject *item, PyObject *value)
3730
4.53M
{
3731
4.53M
    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(_self);
3732
3733
4.53M
    PyListObject *self = (PyListObject *)_self;
3734
4.53M
    if (_PyIndex_Check(item)) {
3735
4.25M
        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
3736
4.25M
        if (i == -1 && PyErr_Occurred())
3737
0
            return -1;
3738
4.25M
        if (i < 0)
3739
4.25M
            i += PyList_GET_SIZE(self);
3740
4.25M
        return list_ass_item_lock_held(self, i, value);
3741
4.25M
    }
3742
281k
    else if (PySlice_Check(item)) {
3743
281k
        Py_ssize_t start, stop, step;
3744
3745
281k
        if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
3746
0
            return -1;
3747
0
        }
3748
3749
281k
        if (value == NULL) {
3750
            /* delete slice */
3751
128
            PyObject **garbage;
3752
128
            size_t cur;
3753
128
            Py_ssize_t i;
3754
128
            int res;
3755
3756
128
            Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop,
3757
128
                                                          step);
3758
3759
128
            if (step == 1)
3760
128
                return list_ass_slice_lock_held(self, start, stop, value);
3761
3762
0
            if (slicelength <= 0)
3763
0
                return 0;
3764
3765
0
            if (step < 0) {
3766
0
                stop = start + 1;
3767
0
                start = stop + step*(slicelength - 1) - 1;
3768
0
                step = -step;
3769
0
            }
3770
3771
0
            garbage = (PyObject**)
3772
0
                PyMem_Malloc(slicelength*sizeof(PyObject*));
3773
0
            if (!garbage) {
3774
0
                PyErr_NoMemory();
3775
0
                return -1;
3776
0
            }
3777
3778
            /* drawing pictures might help understand these for
3779
               loops. Basically, we memmove the parts of the
3780
               list that are *not* part of the slice: step-1
3781
               items for each item that is part of the slice,
3782
               and then tail end of the list that was not
3783
               covered by the slice */
3784
0
            for (cur = start, i = 0;
3785
0
                 cur < (size_t)stop;
3786
0
                 cur += step, i++) {
3787
0
                Py_ssize_t lim = step - 1;
3788
3789
0
                garbage[i] = PyList_GET_ITEM(self, cur);
3790
3791
0
                if (cur + step >= (size_t)Py_SIZE(self)) {
3792
0
                    lim = Py_SIZE(self) - cur - 1;
3793
0
                }
3794
3795
0
                ptr_wise_atomic_memmove(self, self->ob_item + cur - i,
3796
0
                    self->ob_item + cur + 1, lim);
3797
0
            }
3798
0
            cur = start + (size_t)slicelength * step;
3799
0
            if (cur < (size_t)Py_SIZE(self)) {
3800
0
                ptr_wise_atomic_memmove(self, self->ob_item + cur - slicelength,
3801
0
                    self->ob_item + cur, Py_SIZE(self) - cur);
3802
0
            }
3803
3804
0
            Py_SET_SIZE(self, Py_SIZE(self) - slicelength);
3805
0
            res = list_resize(self, Py_SIZE(self));
3806
3807
0
            for (i = 0; i < slicelength; i++) {
3808
0
                Py_DECREF(garbage[i]);
3809
0
            }
3810
0
            PyMem_Free(garbage);
3811
3812
0
            return res;
3813
0
        }
3814
281k
        else {
3815
            /* assign slice */
3816
281k
            PyObject *ins, *seq;
3817
281k
            PyObject **garbage, **seqitems, **selfitems;
3818
281k
            Py_ssize_t i;
3819
281k
            size_t cur;
3820
3821
            /* protect against a[::-1] = a */
3822
281k
            if (self == (PyListObject*)value) {
3823
0
                seq = list_slice_lock_held((PyListObject *)value, 0,
3824
0
                                            Py_SIZE(value));
3825
0
            }
3826
281k
            else {
3827
281k
                seq = PySequence_Fast(value,
3828
281k
                                      "must assign iterable "
3829
281k
                                      "to extended slice");
3830
281k
            }
3831
281k
            if (!seq)
3832
0
                return -1;
3833
3834
281k
            Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop,
3835
281k
                                                          step);
3836
3837
281k
            if (step == 1) {
3838
281k
                int res = list_ass_slice_lock_held(self, start, stop, seq);
3839
281k
                Py_DECREF(seq);
3840
281k
                return res;
3841
281k
            }
3842
3843
0
            if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
3844
0
                PyErr_Format(PyExc_ValueError,
3845
0
                    "attempt to assign sequence of "
3846
0
                    "size %zd to extended slice of "
3847
0
                    "size %zd",
3848
0
                         PySequence_Fast_GET_SIZE(seq),
3849
0
                         slicelength);
3850
0
                Py_DECREF(seq);
3851
0
                return -1;
3852
0
            }
3853
3854
0
            if (!slicelength) {
3855
0
                Py_DECREF(seq);
3856
0
                return 0;
3857
0
            }
3858
3859
0
            garbage = (PyObject**)
3860
0
                PyMem_Malloc(slicelength*sizeof(PyObject*));
3861
0
            if (!garbage) {
3862
0
                Py_DECREF(seq);
3863
0
                PyErr_NoMemory();
3864
0
                return -1;
3865
0
            }
3866
3867
0
            selfitems = self->ob_item;
3868
0
            seqitems = PySequence_Fast_ITEMS(seq);
3869
0
            for (cur = start, i = 0; i < slicelength;
3870
0
                 cur += (size_t)step, i++) {
3871
0
                garbage[i] = selfitems[cur];
3872
0
                ins = Py_NewRef(seqitems[i]);
3873
0
                FT_ATOMIC_STORE_PTR_RELEASE(selfitems[cur], ins);
3874
0
            }
3875
3876
0
            for (i = 0; i < slicelength; i++) {
3877
0
                Py_DECREF(garbage[i]);
3878
0
            }
3879
3880
0
            PyMem_Free(garbage);
3881
0
            Py_DECREF(seq);
3882
3883
0
            return 0;
3884
0
        }
3885
281k
    }
3886
0
    else {
3887
0
        PyErr_Format(PyExc_TypeError,
3888
0
                     "list indices must be integers or slices, not %.200s",
3889
0
                     Py_TYPE(item)->tp_name);
3890
0
        return -1;
3891
0
    }
3892
4.53M
}
3893
3894
static int
3895
list_ass_subscript(PyObject *self, PyObject *item, PyObject *value)
3896
4.53M
{
3897
4.53M
    int res;
3898
#ifdef Py_GIL_DISABLED
3899
    if (PySlice_Check(item) && value != NULL && PyList_CheckExact(value)) {
3900
        Py_BEGIN_CRITICAL_SECTION2(self, value);
3901
        res = list_ass_subscript_lock_held(self, item, value);
3902
        Py_END_CRITICAL_SECTION2();
3903
        return res;
3904
    }
3905
#endif
3906
4.53M
    Py_BEGIN_CRITICAL_SECTION(self);
3907
4.53M
    res = list_ass_subscript_lock_held(self, item, value);
3908
4.53M
    Py_END_CRITICAL_SECTION();
3909
4.53M
    return res;
3910
4.53M
}
3911
3912
static _PyObjectIndexPair
3913
list_iteritem(PyObject *obj, Py_ssize_t index)
3914
1.55M
{
3915
1.55M
    PyObject *result = list_get_item_ref((PyListObject *)obj, index);
3916
1.55M
    return (_PyObjectIndexPair) { .object = result, .index = index + 1 };
3917
1.55M
}
3918
3919
static PyMappingMethods list_as_mapping = {
3920
    list_length,
3921
    list_subscript,
3922
    list_ass_subscript
3923
};
3924
3925
PyTypeObject PyList_Type = {
3926
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
3927
    "list",
3928
    sizeof(PyListObject),
3929
    0,
3930
    list_dealloc,                               /* tp_dealloc */
3931
    0,                                          /* tp_vectorcall_offset */
3932
    0,                                          /* tp_getattr */
3933
    0,                                          /* tp_setattr */
3934
    0,                                          /* tp_as_async */
3935
    list_repr,                                  /* tp_repr */
3936
    0,                                          /* tp_as_number */
3937
    &list_as_sequence,                          /* tp_as_sequence */
3938
    &list_as_mapping,                           /* tp_as_mapping */
3939
    PyObject_HashNotImplemented,                /* tp_hash */
3940
    0,                                          /* tp_call */
3941
    0,                                          /* tp_str */
3942
    PyObject_GenericGetAttr,                    /* tp_getattro */
3943
    0,                                          /* tp_setattro */
3944
    0,                                          /* tp_as_buffer */
3945
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3946
        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS |
3947
        _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_SEQUENCE,  /* tp_flags */
3948
    list___init____doc__,                       /* tp_doc */
3949
    list_traverse,                              /* tp_traverse */
3950
    list_clear_slot,                            /* tp_clear */
3951
    list_richcompare,                           /* tp_richcompare */
3952
    0,                                          /* tp_weaklistoffset */
3953
    list_iter,                                  /* tp_iter */
3954
    0,                                          /* tp_iternext */
3955
    list_methods,                               /* tp_methods */
3956
    0,                                          /* tp_members */
3957
    0,                                          /* tp_getset */
3958
    0,                                          /* tp_base */
3959
    0,                                          /* tp_dict */
3960
    0,                                          /* tp_descr_get */
3961
    0,                                          /* tp_descr_set */
3962
    0,                                          /* tp_dictoffset */
3963
    list___init__,                              /* tp_init */
3964
    PyType_GenericAlloc,                        /* tp_alloc */
3965
    PyType_GenericNew,                          /* tp_new */
3966
    PyObject_GC_Del,                            /* tp_free */
3967
    .tp_vectorcall = list_vectorcall,
3968
    .tp_version_tag = _Py_TYPE_VERSION_LIST,
3969
    ._tp_iteritem = list_iteritem,
3970
};
3971
3972
/*********************** List Iterator **************************/
3973
3974
static void listiter_dealloc(PyObject *);
3975
static int listiter_traverse(PyObject *, visitproc, void *);
3976
static PyObject *listiter_next(PyObject *);
3977
static PyObject *listiter_len(PyObject *, PyObject *);
3978
static PyObject *listiter_reduce_general(void *_it, int forward);
3979
static PyObject *listiter_reduce(PyObject *, PyObject *);
3980
static PyObject *listiter_setstate(PyObject *, PyObject *state);
3981
3982
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
3983
PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3984
PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3985
3986
static PyMethodDef listiter_methods[] = {
3987
    {"__length_hint__", listiter_len, METH_NOARGS, length_hint_doc},
3988
    {"__reduce__", listiter_reduce, METH_NOARGS, reduce_doc},
3989
    {"__setstate__", listiter_setstate, METH_O, setstate_doc},
3990
    {NULL,              NULL}           /* sentinel */
3991
};
3992
3993
PyTypeObject PyListIter_Type = {
3994
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
3995
    "list_iterator",                            /* tp_name */
3996
    sizeof(_PyListIterObject),                  /* tp_basicsize */
3997
    0,                                          /* tp_itemsize */
3998
    /* methods */
3999
    listiter_dealloc,               /* tp_dealloc */
4000
    0,                                          /* tp_vectorcall_offset */
4001
    0,                                          /* tp_getattr */
4002
    0,                                          /* tp_setattr */
4003
    0,                                          /* tp_as_async */
4004
    0,                                          /* tp_repr */
4005
    0,                                          /* tp_as_number */
4006
    0,                                          /* tp_as_sequence */
4007
    0,                                          /* tp_as_mapping */
4008
    0,                                          /* tp_hash */
4009
    0,                                          /* tp_call */
4010
    0,                                          /* tp_str */
4011
    PyObject_GenericGetAttr,                    /* tp_getattro */
4012
    0,                                          /* tp_setattro */
4013
    0,                                          /* tp_as_buffer */
4014
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4015
    0,                                          /* tp_doc */
4016
    listiter_traverse,                          /* tp_traverse */
4017
    0,                                          /* tp_clear */
4018
    0,                                          /* tp_richcompare */
4019
    0,                                          /* tp_weaklistoffset */
4020
    PyObject_SelfIter,                          /* tp_iter */
4021
    listiter_next,                              /* tp_iternext */
4022
    listiter_methods,                           /* tp_methods */
4023
    0,                                          /* tp_members */
4024
};
4025
4026
4027
static PyObject *
4028
list_iter(PyObject *seq)
4029
29.7M
{
4030
29.7M
    if (!PyList_Check(seq)) {
4031
0
        PyErr_BadInternalCall();
4032
0
        return NULL;
4033
0
    }
4034
29.7M
    _PyListIterObject *it = _Py_FREELIST_POP(_PyListIterObject, list_iters);
4035
29.7M
    if (it == NULL) {
4036
1.90M
        it = PyObject_GC_New(_PyListIterObject, &PyListIter_Type);
4037
1.90M
        if (it == NULL) {
4038
0
            return NULL;
4039
0
        }
4040
1.90M
    }
4041
29.7M
    it->it_index = 0;
4042
29.7M
    it->it_seq = (PyListObject *)Py_NewRef(seq);
4043
29.7M
    _PyObject_GC_TRACK(it);
4044
29.7M
    return (PyObject *)it;
4045
29.7M
}
4046
4047
static void
4048
listiter_dealloc(PyObject *self)
4049
29.7M
{
4050
29.7M
    _PyListIterObject *it = (_PyListIterObject *)self;
4051
29.7M
    _PyObject_GC_UNTRACK(it);
4052
29.7M
    Py_XDECREF(it->it_seq);
4053
29.7M
    assert(Py_IS_TYPE(self, &PyListIter_Type));
4054
29.7M
    _Py_FREELIST_FREE(list_iters, it, PyObject_GC_Del);
4055
29.7M
}
4056
4057
static int
4058
listiter_traverse(PyObject *it, visitproc visit, void *arg)
4059
529k
{
4060
529k
    Py_VISIT(((_PyListIterObject *)it)->it_seq);
4061
529k
    return 0;
4062
529k
}
4063
4064
static PyObject *
4065
listiter_next(PyObject *self)
4066
140M
{
4067
140M
    _PyListIterObject *it = (_PyListIterObject *)self;
4068
140M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4069
140M
    if (index < 0) {
4070
178
        return NULL;
4071
178
    }
4072
4073
140M
    PyObject *item = list_get_item_ref(it->it_seq, index);
4074
140M
    if (item == NULL) {
4075
        // out-of-bounds
4076
29.1M
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, -1);
4077
29.1M
#ifndef Py_GIL_DISABLED
4078
29.1M
        PyListObject *seq = it->it_seq;
4079
29.1M
        it->it_seq = NULL;
4080
29.1M
        Py_DECREF(seq);
4081
29.1M
#endif
4082
29.1M
        return NULL;
4083
29.1M
    }
4084
111M
    FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index + 1);
4085
111M
    return item;
4086
140M
}
4087
4088
static PyObject *
4089
listiter_len(PyObject *self, PyObject *Py_UNUSED(ignored))
4090
1.30M
{
4091
1.30M
    assert(self != NULL);
4092
1.30M
    _PyListIterObject *it = (_PyListIterObject *)self;
4093
1.30M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4094
1.30M
    if (index >= 0) {
4095
1.30M
        Py_ssize_t len = PyList_GET_SIZE(it->it_seq) - index;
4096
1.30M
        if (len >= 0)
4097
1.30M
            return PyLong_FromSsize_t(len);
4098
1.30M
    }
4099
0
    return PyLong_FromLong(0);
4100
1.30M
}
4101
4102
static PyObject *
4103
listiter_reduce(PyObject *it, PyObject *Py_UNUSED(ignored))
4104
0
{
4105
0
    return listiter_reduce_general(it, 1);
4106
0
}
4107
4108
static PyObject *
4109
listiter_setstate(PyObject *self, PyObject *state)
4110
0
{
4111
0
    _PyListIterObject *it = (_PyListIterObject *)self;
4112
0
    Py_ssize_t index = PyLong_AsSsize_t(state);
4113
0
    if (index == -1 && PyErr_Occurred())
4114
0
        return NULL;
4115
0
    if (it->it_seq != NULL) {
4116
0
        if (index < -1)
4117
0
            index = -1;
4118
0
        else if (index > PyList_GET_SIZE(it->it_seq))
4119
0
            index = PyList_GET_SIZE(it->it_seq); /* iterator exhausted */
4120
0
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index);
4121
0
    }
4122
0
    Py_RETURN_NONE;
4123
0
}
4124
4125
/*********************** List Reverse Iterator **************************/
4126
4127
typedef struct {
4128
    PyObject_HEAD
4129
    Py_ssize_t it_index;
4130
    PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
4131
} listreviterobject;
4132
4133
static void listreviter_dealloc(PyObject *);
4134
static int listreviter_traverse(PyObject *, visitproc, void *);
4135
static PyObject *listreviter_next(PyObject *);
4136
static PyObject *listreviter_len(PyObject *, PyObject *);
4137
static PyObject *listreviter_reduce(PyObject *, PyObject *);
4138
static PyObject *listreviter_setstate(PyObject *, PyObject *);
4139
4140
static PyMethodDef listreviter_methods[] = {
4141
    {"__length_hint__", listreviter_len, METH_NOARGS, length_hint_doc},
4142
    {"__reduce__", listreviter_reduce, METH_NOARGS, reduce_doc},
4143
    {"__setstate__", listreviter_setstate, METH_O, setstate_doc},
4144
    {NULL,              NULL}           /* sentinel */
4145
};
4146
4147
PyTypeObject PyListRevIter_Type = {
4148
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
4149
    "list_reverseiterator",                     /* tp_name */
4150
    sizeof(listreviterobject),                  /* tp_basicsize */
4151
    0,                                          /* tp_itemsize */
4152
    /* methods */
4153
    listreviter_dealloc,                        /* tp_dealloc */
4154
    0,                                          /* tp_vectorcall_offset */
4155
    0,                                          /* tp_getattr */
4156
    0,                                          /* tp_setattr */
4157
    0,                                          /* tp_as_async */
4158
    0,                                          /* tp_repr */
4159
    0,                                          /* tp_as_number */
4160
    0,                                          /* tp_as_sequence */
4161
    0,                                          /* tp_as_mapping */
4162
    0,                                          /* tp_hash */
4163
    0,                                          /* tp_call */
4164
    0,                                          /* tp_str */
4165
    PyObject_GenericGetAttr,                    /* tp_getattro */
4166
    0,                                          /* tp_setattro */
4167
    0,                                          /* tp_as_buffer */
4168
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4169
    0,                                          /* tp_doc */
4170
    listreviter_traverse,                       /* tp_traverse */
4171
    0,                                          /* tp_clear */
4172
    0,                                          /* tp_richcompare */
4173
    0,                                          /* tp_weaklistoffset */
4174
    PyObject_SelfIter,                          /* tp_iter */
4175
    listreviter_next,                           /* tp_iternext */
4176
    listreviter_methods,                /* tp_methods */
4177
    0,
4178
};
4179
4180
/*[clinic input]
4181
list.__reversed__
4182
4183
Return a reverse iterator over the list.
4184
[clinic start generated code]*/
4185
4186
static PyObject *
4187
list___reversed___impl(PyListObject *self)
4188
/*[clinic end generated code: output=b166f073208c888c input=eadb6e17f8a6a280]*/
4189
43.7M
{
4190
43.7M
    listreviterobject *it;
4191
4192
43.7M
    it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
4193
43.7M
    if (it == NULL)
4194
0
        return NULL;
4195
43.7M
    assert(PyList_Check(self));
4196
43.7M
    it->it_index = PyList_GET_SIZE(self) - 1;
4197
43.7M
    it->it_seq = (PyListObject*)Py_NewRef(self);
4198
43.7M
    PyObject_GC_Track(it);
4199
43.7M
    return (PyObject *)it;
4200
43.7M
}
4201
4202
static void
4203
listreviter_dealloc(PyObject *self)
4204
43.7M
{
4205
43.7M
    listreviterobject *it = (listreviterobject *)self;
4206
43.7M
    PyObject_GC_UnTrack(it);
4207
43.7M
    Py_XDECREF(it->it_seq);
4208
43.7M
    PyObject_GC_Del(it);
4209
43.7M
}
4210
4211
static int
4212
listreviter_traverse(PyObject *it, visitproc visit, void *arg)
4213
12.4k
{
4214
12.4k
    Py_VISIT(((listreviterobject *)it)->it_seq);
4215
12.4k
    return 0;
4216
12.4k
}
4217
4218
static PyObject *
4219
listreviter_next(PyObject *self)
4220
55.2M
{
4221
55.2M
    listreviterobject *it = (listreviterobject *)self;
4222
55.2M
    assert(it != NULL);
4223
55.2M
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4224
55.2M
    if (index < 0) {
4225
28.6M
        return NULL;
4226
28.6M
    }
4227
4228
26.5M
    PyListObject *seq = it->it_seq;
4229
26.5M
    assert(PyList_Check(seq));
4230
26.5M
    PyObject *item = list_get_item_ref(seq, index);
4231
26.5M
    if (item != NULL) {
4232
26.5M
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index - 1);
4233
26.5M
        return item;
4234
26.5M
    }
4235
0
    FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, -1);
4236
0
#ifndef Py_GIL_DISABLED
4237
0
    it->it_seq = NULL;
4238
0
    Py_DECREF(seq);
4239
0
#endif
4240
0
    return NULL;
4241
26.5M
}
4242
4243
static PyObject *
4244
listreviter_len(PyObject *self, PyObject *Py_UNUSED(ignored))
4245
0
{
4246
0
    listreviterobject *it = (listreviterobject *)self;
4247
0
    Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4248
0
    Py_ssize_t len = index + 1;
4249
0
    if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
4250
0
        len = 0;
4251
0
    return PyLong_FromSsize_t(len);
4252
0
}
4253
4254
static PyObject *
4255
listreviter_reduce(PyObject *it, PyObject *Py_UNUSED(ignored))
4256
0
{
4257
0
    return listiter_reduce_general(it, 0);
4258
0
}
4259
4260
static PyObject *
4261
listreviter_setstate(PyObject *self, PyObject *state)
4262
0
{
4263
0
    listreviterobject *it = (listreviterobject *)self;
4264
0
    Py_ssize_t index = PyLong_AsSsize_t(state);
4265
0
    if (index == -1 && PyErr_Occurred())
4266
0
        return NULL;
4267
0
    if (it->it_seq != NULL) {
4268
0
        if (index < -1)
4269
0
            index = -1;
4270
0
        else if (index > PyList_GET_SIZE(it->it_seq) - 1)
4271
0
            index = PyList_GET_SIZE(it->it_seq) - 1;
4272
0
        FT_ATOMIC_STORE_SSIZE_RELAXED(it->it_index, index);
4273
0
    }
4274
0
    Py_RETURN_NONE;
4275
0
}
4276
4277
/* common pickling support */
4278
4279
static PyObject *
4280
listiter_reduce_general(void *_it, int forward)
4281
0
{
4282
0
    PyObject *list;
4283
0
    PyObject *iter;
4284
4285
    /* _PyEval_GetBuiltin can invoke arbitrary code,
4286
     * call must be before access of iterator pointers.
4287
     * see issue #101765 */
4288
4289
0
    if (forward) {
4290
0
        iter = _PyEval_GetBuiltin(&_Py_ID(iter));
4291
0
        _PyListIterObject *it = (_PyListIterObject *)_it;
4292
0
        Py_ssize_t idx = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4293
0
        if (idx >= 0) {
4294
0
            return Py_BuildValue("N(O)n", iter, it->it_seq, idx);
4295
0
        }
4296
0
    } else {
4297
0
        iter = _PyEval_GetBuiltin(&_Py_ID(reversed));
4298
0
        listreviterobject *it = (listreviterobject *)_it;
4299
0
        Py_ssize_t idx = FT_ATOMIC_LOAD_SSIZE_RELAXED(it->it_index);
4300
0
        if (idx >= 0) {
4301
0
            return Py_BuildValue("N(O)n", iter, it->it_seq, idx);
4302
0
        }
4303
0
    }
4304
    /* empty iterator, create an empty list */
4305
0
    list = PyList_New(0);
4306
0
    if (list == NULL) {
4307
0
        Py_DECREF(iter);
4308
0
        return NULL;
4309
0
    }
4310
0
    return Py_BuildValue("N(N)", iter, list);
4311
0
}