Coverage Report

Created: 2026-03-08 06:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Modules/_collectionsmodule.c
Line
Count
Source
1
#include "Python.h"
2
#include "pycore_call.h"          // _PyObject_CallNoArgs()
3
#include "pycore_dict.h"          // _PyDict_GetItem_KnownHash()
4
#include "pycore_long.h"          // _PyLong_GetZero()
5
#include "pycore_moduleobject.h"  // _PyModule_GetState()
6
#include "pycore_pyatomic_ft_wrappers.h"
7
#include "pycore_typeobject.h"    // _PyType_GetModuleState()
8
#include "pycore_weakref.h"       // FT_CLEAR_WEAKREFS()
9
10
#include <stddef.h>
11
12
typedef struct {
13
    PyTypeObject *deque_type;
14
    PyTypeObject *defdict_type;
15
    PyTypeObject *dequeiter_type;
16
    PyTypeObject *dequereviter_type;
17
    PyTypeObject *tuplegetter_type;
18
} collections_state;
19
20
static inline collections_state *
21
get_module_state(PyObject *mod)
22
1.49k
{
23
1.49k
    void *state = _PyModule_GetState(mod);
24
1.49k
    assert(state != NULL);
25
1.49k
    return (collections_state *)state;
26
1.49k
}
27
28
static inline collections_state *
29
get_module_state_by_cls(PyTypeObject *cls)
30
908
{
31
908
    void *state = _PyType_GetModuleState(cls);
32
908
    assert(state != NULL);
33
908
    return (collections_state *)state;
34
908
}
35
36
static struct PyModuleDef _collectionsmodule;
37
38
static inline collections_state *
39
find_module_state_by_def(PyTypeObject *type)
40
0
{
41
0
    PyObject *mod = PyType_GetModuleByDef(type, &_collectionsmodule);
42
0
    assert(mod != NULL);
43
0
    return get_module_state(mod);
44
0
}
45
46
/*[clinic input]
47
module _collections
48
class _tuplegetter "_tuplegetterobject *" "clinic_state()->tuplegetter_type"
49
class _collections.deque "dequeobject *" "clinic_state()->deque_type"
50
[clinic start generated code]*/
51
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a033cc2a8476b3f1]*/
52
53
typedef struct dequeobject dequeobject;
54
55
/* We can safely assume type to be the defining class,
56
 * since tuplegetter is not a base type */
57
908
#define clinic_state() (get_module_state_by_cls(type))
58
#include "clinic/_collectionsmodule.c.h"
59
#undef clinic_state
60
61
/*[python input]
62
class dequeobject_converter(self_converter):
63
    type = "dequeobject *"
64
[python start generated code]*/
65
/*[python end generated code: output=da39a3ee5e6b4b0d input=b6ae4a3ff852be2f]*/
66
67
/* collections module implementation of a deque() datatype
68
   Written and maintained by Raymond D. Hettinger <python@rcn.com>
69
*/
70
71
/* The block length may be set to any number over 1.  Larger numbers
72
 * reduce the number of calls to the memory allocator, give faster
73
 * indexing and rotation, and reduce the link to data overhead ratio.
74
 * Making the block length a power of two speeds-up the modulo
75
 * and division calculations in deque_item() and deque_ass_item().
76
 */
77
78
74.2M
#define BLOCKLEN 64
79
33.0k
#define CENTER ((BLOCKLEN - 1) / 2)
80
799k
#define MAXFREEBLOCKS 16
81
82
/* Data for deque objects is stored in a doubly-linked list of fixed
83
 * length blocks.  This assures that appends or pops never move any
84
 * other data elements besides the one being appended or popped.
85
 *
86
 * Another advantage is that it completely avoids use of realloc(),
87
 * resulting in more predictable performance.
88
 *
89
 * Textbook implementations of doubly-linked lists store one datum
90
 * per link, but that gives them a 200% memory overhead (a prev and
91
 * next link for each datum) and it costs one malloc() call per data
92
 * element.  By using fixed-length blocks, the link to data ratio is
93
 * significantly improved and there are proportionally fewer calls
94
 * to malloc() and free().  The data blocks of consecutive pointers
95
 * also improve cache locality.
96
 *
97
 * The list of blocks is never empty, so d.leftblock and d.rightblock
98
 * are never equal to NULL.  The list is not circular.
99
 *
100
 * A deque d's first element is at d.leftblock[leftindex]
101
 * and its last element is at d.rightblock[rightindex].
102
 *
103
 * Unlike Python slice indices, these indices are inclusive on both
104
 * ends.  This makes the algorithms for left and right operations
105
 * more symmetrical and it simplifies the design.
106
 *
107
 * The indices, d.leftindex and d.rightindex are always in the range:
108
 *     0 <= index < BLOCKLEN
109
 *
110
 * And their exact relationship is:
111
 *     (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex
112
 *
113
 * Whenever d.leftblock == d.rightblock, then:
114
 *     d.leftindex + d.len - 1 == d.rightindex
115
 *
116
 * However, when d.leftblock != d.rightblock, the d.leftindex and
117
 * d.rightindex become indices into distinct blocks and either may
118
 * be larger than the other.
119
 *
120
 * Empty deques have:
121
 *     d.len == 0
122
 *     d.leftblock == d.rightblock
123
 *     d.leftindex == CENTER + 1
124
 *     d.rightindex == CENTER
125
 *
126
 * Checking for d.len == 0 is the intended way to see whether d is empty.
127
 */
128
129
typedef struct BLOCK {
130
    struct BLOCK *leftlink;
131
    PyObject *data[BLOCKLEN];
132
    struct BLOCK *rightlink;
133
} block;
134
135
struct dequeobject {
136
    PyObject_VAR_HEAD
137
    block *leftblock;
138
    block *rightblock;
139
    Py_ssize_t leftindex;       /* 0 <= leftindex < BLOCKLEN */
140
    Py_ssize_t rightindex;      /* 0 <= rightindex < BLOCKLEN */
141
    size_t state;               /* incremented whenever the indices move */
142
    Py_ssize_t maxlen;          /* maxlen is -1 for unbounded deques */
143
    Py_ssize_t numfreeblocks;
144
    block *freeblocks[MAXFREEBLOCKS];
145
    PyObject *weakreflist;
146
};
147
148
33.9k
#define dequeobject_CAST(op)    ((dequeobject *)(op))
149
150
/* For debug builds, add error checking to track the endpoints
151
 * in the chain of links.  The goal is to make sure that link
152
 * assignments only take place at endpoints so that links already
153
 * in use do not get overwritten.
154
 *
155
 * CHECK_END should happen before each assignment to a block's link field.
156
 * MARK_END should happen whenever a link field becomes a new endpoint.
157
 * This happens when new blocks are added or whenever an existing
158
 * block is freed leaving another existing block as the new endpoint.
159
 */
160
161
#ifndef NDEBUG
162
#define MARK_END(link)  link = NULL;
163
#define CHECK_END(link) assert(link == NULL);
164
#define CHECK_NOT_END(link) assert(link != NULL);
165
#else
166
#define MARK_END(link)
167
#define CHECK_END(link)
168
#define CHECK_NOT_END(link)
169
#endif
170
171
/* A simple freelisting scheme is used to minimize calls to the memory
172
   allocator.  It accommodates common use cases where new blocks are being
173
   added at about the same rate as old blocks are being freed.
174
 */
175
176
static inline block *
177
799k
newblock(dequeobject *deque) {
178
799k
    block *b;
179
799k
    if (deque->numfreeblocks) {
180
556k
        deque->numfreeblocks--;
181
556k
        return deque->freeblocks[deque->numfreeblocks];
182
556k
    }
183
243k
    b = PyMem_Malloc(sizeof(block));
184
243k
    if (b != NULL) {
185
243k
        return b;
186
243k
    }
187
0
    PyErr_NoMemory();
188
0
    return NULL;
189
243k
}
190
191
static inline void
192
freeblock(dequeobject *deque, block *b)
193
799k
{
194
799k
    if (deque->numfreeblocks < MAXFREEBLOCKS) {
195
592k
        deque->freeblocks[deque->numfreeblocks] = b;
196
592k
        deque->numfreeblocks++;
197
592k
    } else {
198
207k
        PyMem_Free(b);
199
207k
    }
200
799k
}
201
202
static PyObject *
203
deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
204
15.9k
{
205
15.9k
    dequeobject *deque;
206
15.9k
    block *b;
207
208
    /* create dequeobject structure */
209
15.9k
    deque = (dequeobject *)type->tp_alloc(type, 0);
210
15.9k
    if (deque == NULL)
211
0
        return NULL;
212
213
15.9k
    b = newblock(deque);
214
15.9k
    if (b == NULL) {
215
0
        Py_DECREF(deque);
216
0
        return NULL;
217
0
    }
218
15.9k
    MARK_END(b->leftlink);
219
15.9k
    MARK_END(b->rightlink);
220
221
15.9k
    assert(BLOCKLEN >= 2);
222
15.9k
    Py_SET_SIZE(deque, 0);
223
15.9k
    deque->leftblock = b;
224
15.9k
    deque->rightblock = b;
225
15.9k
    deque->leftindex = CENTER + 1;
226
15.9k
    deque->rightindex = CENTER;
227
15.9k
    deque->state = 0;
228
15.9k
    deque->maxlen = -1;
229
15.9k
    deque->numfreeblocks = 0;
230
15.9k
    deque->weakreflist = NULL;
231
232
15.9k
    return (PyObject *)deque;
233
15.9k
}
234
235
/*[clinic input]
236
@critical_section
237
_collections.deque.pop as deque_pop
238
239
    deque: dequeobject
240
241
Remove and return the rightmost element.
242
[clinic start generated code]*/
243
244
static PyObject *
245
deque_pop_impl(dequeobject *deque)
246
/*[clinic end generated code: output=2e5f7890c4251f07 input=55c5b6a8ad51d72f]*/
247
0
{
248
0
    PyObject *item;
249
0
    block *prevblock;
250
251
0
    if (Py_SIZE(deque) == 0) {
252
0
        PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
253
0
        return NULL;
254
0
    }
255
0
    item = deque->rightblock->data[deque->rightindex];
256
0
    deque->rightindex--;
257
0
    Py_SET_SIZE(deque, Py_SIZE(deque) - 1);
258
0
    deque->state++;
259
260
0
    if (deque->rightindex < 0) {
261
0
        if (Py_SIZE(deque)) {
262
0
            prevblock = deque->rightblock->leftlink;
263
0
            assert(deque->leftblock != deque->rightblock);
264
0
            freeblock(deque, deque->rightblock);
265
0
            CHECK_NOT_END(prevblock);
266
0
            MARK_END(prevblock->rightlink);
267
0
            deque->rightblock = prevblock;
268
0
            deque->rightindex = BLOCKLEN - 1;
269
0
        } else {
270
0
            assert(deque->leftblock == deque->rightblock);
271
0
            assert(deque->leftindex == deque->rightindex+1);
272
            /* re-center instead of freeing a block */
273
0
            deque->leftindex = CENTER + 1;
274
0
            deque->rightindex = CENTER;
275
0
        }
276
0
    }
277
0
    return item;
278
0
}
279
280
/*[clinic input]
281
@critical_section
282
_collections.deque.popleft as deque_popleft
283
284
     deque: dequeobject
285
286
Remove and return the leftmost element.
287
[clinic start generated code]*/
288
289
static PyObject *
290
deque_popleft_impl(dequeobject *deque)
291
/*[clinic end generated code: output=62b154897097ff68 input=1571ce88fe3053de]*/
292
51.5M
{
293
51.5M
    PyObject *item;
294
51.5M
    block *prevblock;
295
296
51.5M
    if (Py_SIZE(deque) == 0) {
297
0
        PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
298
0
        return NULL;
299
0
    }
300
51.5M
    assert(deque->leftblock != NULL);
301
51.5M
    item = deque->leftblock->data[deque->leftindex];
302
51.5M
    deque->leftindex++;
303
51.5M
    Py_SET_SIZE(deque, Py_SIZE(deque) - 1);
304
51.5M
    deque->state++;
305
306
51.5M
    if (deque->leftindex == BLOCKLEN) {
307
783k
        if (Py_SIZE(deque)) {
308
782k
            assert(deque->leftblock != deque->rightblock);
309
782k
            prevblock = deque->leftblock->rightlink;
310
782k
            freeblock(deque, deque->leftblock);
311
782k
            CHECK_NOT_END(prevblock);
312
782k
            MARK_END(prevblock->leftlink);
313
782k
            deque->leftblock = prevblock;
314
782k
            deque->leftindex = 0;
315
782k
        } else {
316
384
            assert(deque->leftblock == deque->rightblock);
317
384
            assert(deque->leftindex == deque->rightindex+1);
318
            /* re-center instead of freeing a block */
319
384
            deque->leftindex = CENTER + 1;
320
384
            deque->rightindex = CENTER;
321
384
        }
322
783k
    }
323
51.5M
    return item;
324
51.5M
}
325
326
/* The deque's size limit is d.maxlen.  The limit can be zero or positive.
327
 * If there is no limit, then d.maxlen == -1.
328
 *
329
 * After an item is added to a deque, we check to see if the size has
330
 * grown past the limit. If it has, we get the size back down to the limit
331
 * by popping an item off of the opposite end.  The methods that can
332
 * trigger this are append(), appendleft(), extend(), and extendleft().
333
 *
334
 * The macro to check whether a deque needs to be trimmed uses a single
335
 * unsigned test that returns true whenever 0 <= maxlen < Py_SIZE(deque).
336
 */
337
338
51.6M
#define NEEDS_TRIM(deque, maxlen) ((size_t)(maxlen) < (size_t)(Py_SIZE(deque)))
339
340
static inline int
341
deque_append_lock_held(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
342
20.8M
{
343
20.8M
    if (deque->rightindex == BLOCKLEN - 1) {
344
317k
        block *b = newblock(deque);
345
317k
        if (b == NULL) {
346
0
            Py_DECREF(item);
347
0
            return -1;
348
0
        }
349
317k
        b->leftlink = deque->rightblock;
350
317k
        CHECK_END(deque->rightblock->rightlink);
351
317k
        deque->rightblock->rightlink = b;
352
317k
        deque->rightblock = b;
353
317k
        MARK_END(b->rightlink);
354
317k
        deque->rightindex = -1;
355
317k
    }
356
20.8M
    Py_SET_SIZE(deque, Py_SIZE(deque) + 1);
357
20.8M
    deque->rightindex++;
358
20.8M
    deque->rightblock->data[deque->rightindex] = item;
359
20.8M
    if (NEEDS_TRIM(deque, maxlen)) {
360
0
        PyObject *olditem = deque_popleft_impl(deque);
361
0
        Py_DECREF(olditem);
362
20.8M
    } else {
363
20.8M
        deque->state++;
364
20.8M
    }
365
20.8M
    return 0;
366
20.8M
}
367
368
/*[clinic input]
369
@critical_section
370
_collections.deque.append as deque_append
371
372
    deque: dequeobject
373
    item: object
374
    /
375
376
Add an element to the right side of the deque.
377
[clinic start generated code]*/
378
379
static PyObject *
380
deque_append_impl(dequeobject *deque, PyObject *item)
381
/*[clinic end generated code: output=9c7bcb8b599c6362 input=b0eeeb09b9f5cf18]*/
382
0
{
383
0
    if (deque_append_lock_held(deque, Py_NewRef(item), deque->maxlen) < 0)
384
0
        return NULL;
385
0
    Py_RETURN_NONE;
386
0
}
387
388
static inline int
389
deque_appendleft_lock_held(dequeobject *deque, PyObject *item,
390
                           Py_ssize_t maxlen)
391
30.7M
{
392
30.7M
    if (deque->leftindex == 0) {
393
466k
        block *b = newblock(deque);
394
466k
        if (b == NULL) {
395
0
            Py_DECREF(item);
396
0
            return -1;
397
0
        }
398
466k
        b->rightlink = deque->leftblock;
399
466k
        CHECK_END(deque->leftblock->leftlink);
400
466k
        deque->leftblock->leftlink = b;
401
466k
        deque->leftblock = b;
402
466k
        MARK_END(b->leftlink);
403
466k
        deque->leftindex = BLOCKLEN;
404
466k
    }
405
30.7M
    Py_SET_SIZE(deque, Py_SIZE(deque) + 1);
406
30.7M
    deque->leftindex--;
407
30.7M
    deque->leftblock->data[deque->leftindex] = item;
408
30.7M
    if (NEEDS_TRIM(deque, maxlen)) {
409
0
        PyObject *olditem = deque_pop_impl(deque);
410
0
        Py_DECREF(olditem);
411
30.7M
    } else {
412
30.7M
        deque->state++;
413
30.7M
    }
414
30.7M
    return 0;
415
30.7M
}
416
417
/*[clinic input]
418
@critical_section
419
_collections.deque.appendleft as deque_appendleft
420
421
    deque: dequeobject
422
    item: object
423
    /
424
425
Add an element to the left side of the deque.
426
[clinic start generated code]*/
427
428
static PyObject *
429
deque_appendleft_impl(dequeobject *deque, PyObject *item)
430
/*[clinic end generated code: output=9a192edbcd0f20db input=236c2fbceaf08e14]*/
431
30.7M
{
432
30.7M
    if (deque_appendleft_lock_held(deque, Py_NewRef(item), deque->maxlen) < 0)
433
0
        return NULL;
434
30.7M
    Py_RETURN_NONE;
435
30.7M
}
436
437
static PyObject*
438
finalize_iterator(PyObject *it)
439
38.2k
{
440
38.2k
    if (PyErr_Occurred()) {
441
0
        if (PyErr_ExceptionMatches(PyExc_StopIteration))
442
0
            PyErr_Clear();
443
0
        else {
444
0
            Py_DECREF(it);
445
0
            return NULL;
446
0
        }
447
0
    }
448
38.2k
    Py_DECREF(it);
449
38.2k
    Py_RETURN_NONE;
450
38.2k
}
451
452
/* Run an iterator to exhaustion.  Shortcut for
453
   the extend/extendleft methods when maxlen == 0. */
454
static PyObject*
455
consume_iterator(PyObject *it)
456
0
{
457
0
    PyObject *(*iternext)(PyObject *);
458
0
    PyObject *item;
459
460
0
    iternext = *Py_TYPE(it)->tp_iternext;
461
0
    while ((item = iternext(it)) != NULL) {
462
0
        Py_DECREF(item);
463
0
    }
464
0
    return finalize_iterator(it);
465
0
}
466
467
/*[clinic input]
468
@critical_section
469
_collections.deque.extend as deque_extend
470
471
    deque: dequeobject
472
    iterable: object
473
    /
474
475
Extend the right side of the deque with elements from the iterable.
476
[clinic start generated code]*/
477
478
static PyObject *
479
deque_extend_impl(dequeobject *deque, PyObject *iterable)
480
/*[clinic end generated code: output=8b5ffa57ce82d980 input=85861954127c81da]*/
481
38.2k
{
482
38.2k
    PyObject *it, *item;
483
38.2k
    PyObject *(*iternext)(PyObject *);
484
38.2k
    Py_ssize_t maxlen = deque->maxlen;
485
486
    /* Handle case where id(deque) == id(iterable) */
487
38.2k
    if ((PyObject *)deque == iterable) {
488
0
        PyObject *result;
489
0
        PyObject *s = PySequence_List(iterable);
490
0
        if (s == NULL)
491
0
            return NULL;
492
0
        result = deque_extend((PyObject*)deque, s);
493
0
        Py_DECREF(s);
494
0
        return result;
495
0
    }
496
497
38.2k
    it = PyObject_GetIter(iterable);
498
38.2k
    if (it == NULL)
499
0
        return NULL;
500
501
38.2k
    if (maxlen == 0)
502
0
        return consume_iterator(it);
503
504
    /* Space saving heuristic.  Start filling from the left */
505
38.2k
    if (Py_SIZE(deque) == 0) {
506
37.9k
        assert(deque->leftblock == deque->rightblock);
507
37.9k
        assert(deque->leftindex == deque->rightindex+1);
508
37.9k
        deque->leftindex = 1;
509
37.9k
        deque->rightindex = 0;
510
37.9k
    }
511
512
38.2k
    iternext = *Py_TYPE(it)->tp_iternext;
513
20.9M
    while ((item = iternext(it)) != NULL) {
514
20.8M
        if (deque_append_lock_held(deque, item, maxlen) == -1) {
515
0
            Py_DECREF(item);
516
0
            Py_DECREF(it);
517
0
            return NULL;
518
0
        }
519
20.8M
    }
520
38.2k
    return finalize_iterator(it);
521
38.2k
}
522
523
/*[clinic input]
524
@critical_section
525
_collections.deque.extendleft as deque_extendleft
526
527
    deque: dequeobject
528
    iterable: object
529
    /
530
531
Extend the left side of the deque with elements from the iterable.
532
[clinic start generated code]*/
533
534
static PyObject *
535
deque_extendleft_impl(dequeobject *deque, PyObject *iterable)
536
/*[clinic end generated code: output=ba44191aa8e35a26 input=640dabd086115689]*/
537
0
{
538
0
    PyObject *it, *item;
539
0
    PyObject *(*iternext)(PyObject *);
540
0
    Py_ssize_t maxlen = deque->maxlen;
541
542
    /* Handle case where id(deque) == id(iterable) */
543
0
    if ((PyObject *)deque == iterable) {
544
0
        PyObject *result;
545
0
        PyObject *s = PySequence_List(iterable);
546
0
        if (s == NULL)
547
0
            return NULL;
548
0
        result = deque_extendleft_impl(deque, s);
549
0
        Py_DECREF(s);
550
0
        return result;
551
0
    }
552
553
0
    it = PyObject_GetIter(iterable);
554
0
    if (it == NULL)
555
0
        return NULL;
556
557
0
    if (maxlen == 0)
558
0
        return consume_iterator(it);
559
560
    /* Space saving heuristic.  Start filling from the right */
561
0
    if (Py_SIZE(deque) == 0) {
562
0
        assert(deque->leftblock == deque->rightblock);
563
0
        assert(deque->leftindex == deque->rightindex+1);
564
0
        deque->leftindex = BLOCKLEN - 1;
565
0
        deque->rightindex = BLOCKLEN - 2;
566
0
    }
567
568
0
    iternext = *Py_TYPE(it)->tp_iternext;
569
0
    while ((item = iternext(it)) != NULL) {
570
0
        if (deque_appendleft_lock_held(deque, item, maxlen) == -1) {
571
0
            Py_DECREF(it);
572
0
            return NULL;
573
0
        }
574
0
    }
575
0
    return finalize_iterator(it);
576
0
}
577
578
static PyObject *
579
deque_inplace_concat(PyObject *self, PyObject *other)
580
0
{
581
0
    dequeobject *deque = dequeobject_CAST(self);
582
0
    PyObject *result;
583
584
    // deque_extend is thread-safe
585
0
    result = deque_extend((PyObject*)deque, other);
586
0
    if (result == NULL)
587
0
        return result;
588
0
    Py_INCREF(deque);
589
0
    Py_DECREF(result);
590
0
    return (PyObject *)deque;
591
0
}
592
593
/*[clinic input]
594
@critical_section
595
_collections.deque.copy as deque_copy
596
597
    deque: dequeobject
598
599
Return a shallow copy of a deque.
600
[clinic start generated code]*/
601
602
static PyObject *
603
deque_copy_impl(dequeobject *deque)
604
/*[clinic end generated code: output=6409b3d1ad2898b5 input=51d2ed1a23bab5e2]*/
605
0
{
606
0
    PyObject *result;
607
0
    dequeobject *old_deque = deque;
608
0
    collections_state *state = find_module_state_by_def(Py_TYPE(deque));
609
0
    if (Py_IS_TYPE(deque, state->deque_type)) {
610
0
        dequeobject *new_deque;
611
0
        Py_ssize_t n = Py_SIZE(deque);
612
613
0
        new_deque = (dequeobject *)deque_new(state->deque_type, NULL, NULL);
614
0
        if (new_deque == NULL)
615
0
            return NULL;
616
0
        new_deque->maxlen = old_deque->maxlen;
617
618
        /* Copy elements directly by walking the block structure.
619
         * This is safe because the caller holds the deque lock and
620
         * the new deque is not yet visible to other threads.
621
         */
622
0
        if (n > 0) {
623
0
            block *b = old_deque->leftblock;
624
0
            Py_ssize_t index = old_deque->leftindex;
625
626
            /* Space saving heuristic.  Start filling from the left */
627
0
            assert(new_deque->leftblock == new_deque->rightblock);
628
0
            assert(new_deque->leftindex == new_deque->rightindex + 1);
629
0
            new_deque->leftindex = 1;
630
0
            new_deque->rightindex = 0;
631
632
0
            for (Py_ssize_t i = 0; i < n; i++) {
633
0
                PyObject *item = b->data[index];
634
0
                if (deque_append_lock_held(new_deque, Py_NewRef(item),
635
0
                                           new_deque->maxlen) < 0) {
636
0
                    Py_DECREF(new_deque);
637
0
                    return NULL;
638
0
                }
639
0
                index++;
640
0
                if (index == BLOCKLEN) {
641
0
                    b = b->rightlink;
642
0
                    index = 0;
643
0
                }
644
0
            }
645
0
        }
646
0
        return (PyObject *)new_deque;
647
0
    }
648
0
    if (old_deque->maxlen < 0)
649
0
        result = PyObject_CallOneArg((PyObject *)(Py_TYPE(deque)),
650
0
                                     (PyObject *)deque);
651
0
    else
652
0
        result = PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
653
0
                                       deque, old_deque->maxlen, NULL);
654
0
    if (result != NULL && !PyObject_TypeCheck(result, state->deque_type)) {
655
0
        PyErr_Format(PyExc_TypeError,
656
0
                     "%.200s() must return a deque, not %.200s",
657
0
                     Py_TYPE(deque)->tp_name, Py_TYPE(result)->tp_name);
658
0
        Py_DECREF(result);
659
0
        return NULL;
660
0
    }
661
0
    return result;
662
0
}
663
664
/*[clinic input]
665
@critical_section
666
_collections.deque.__copy__ as deque___copy__ = _collections.deque.copy
667
668
Return a shallow copy of a deque.
669
[clinic start generated code]*/
670
671
static PyObject *
672
deque___copy___impl(dequeobject *deque)
673
/*[clinic end generated code: output=7c5821504342bf23 input=f5464036f9686a55]*/
674
0
{
675
0
    return deque_copy_impl(deque);
676
0
}
677
678
static PyObject *
679
deque_concat_lock_held(dequeobject *deque, PyObject *other)
680
0
{
681
0
    PyObject *new_deque, *result;
682
0
    int rv;
683
684
0
    collections_state *state = find_module_state_by_def(Py_TYPE(deque));
685
0
    rv = PyObject_IsInstance(other, (PyObject *)state->deque_type);
686
0
    if (rv <= 0) {
687
0
        if (rv == 0) {
688
0
            PyErr_Format(PyExc_TypeError,
689
0
                         "can only concatenate deque (not \"%.200s\") to deque",
690
0
                         Py_TYPE(other)->tp_name);
691
0
        }
692
0
        return NULL;
693
0
    }
694
695
0
    new_deque = deque_copy_impl(deque);
696
0
    if (new_deque == NULL)
697
0
        return NULL;
698
699
    // It's safe to not acquire the per-object lock for new_deque; it's
700
    // invisible to other threads.
701
0
    result = deque_extend_impl((dequeobject *)new_deque, other);
702
0
    if (result == NULL) {
703
0
        Py_DECREF(new_deque);
704
0
        return NULL;
705
0
    }
706
0
    Py_DECREF(result);
707
0
    return new_deque;
708
0
}
709
710
static PyObject *
711
deque_concat(PyObject *self, PyObject *other)
712
0
{
713
0
    dequeobject *deque = dequeobject_CAST(self);
714
0
    PyObject *result;
715
0
    Py_BEGIN_CRITICAL_SECTION(deque);
716
0
    result = deque_concat_lock_held(deque, other);
717
0
    Py_END_CRITICAL_SECTION();
718
0
    return result;
719
0
}
720
721
static int
722
deque_clear(PyObject *self)
723
15.9k
{
724
15.9k
    block *b;
725
15.9k
    block *prevblock;
726
15.9k
    block *leftblock;
727
15.9k
    Py_ssize_t leftindex;
728
15.9k
    Py_ssize_t n, m;
729
15.9k
    PyObject *item;
730
15.9k
    PyObject **itemptr, **limit;
731
15.9k
    dequeobject *deque = dequeobject_CAST(self);
732
733
15.9k
    if (Py_SIZE(deque) == 0)
734
15.7k
        return 0;
735
736
    /* During the process of clearing a deque, decrefs can cause the
737
       deque to mutate.  To avoid fatal confusion, we have to make the
738
       deque empty before clearing the blocks and never refer to
739
       anything via deque->ref while clearing.  (This is the same
740
       technique used for clearing lists, sets, and dicts.)
741
742
       Making the deque empty requires allocating a new empty block.  In
743
       the unlikely event that memory is full, we fall back to an
744
       alternate method that doesn't require a new block.  Repeating
745
       pops in a while-loop is slower, possibly re-entrant (and a clever
746
       adversary could cause it to never terminate).
747
    */
748
749
192
    b = newblock(deque);
750
192
    if (b == NULL) {
751
0
        PyErr_Clear();
752
0
        goto alternate_method;
753
0
    }
754
755
    /* Remember the old size, leftblock, and leftindex */
756
192
    n = Py_SIZE(deque);
757
192
    leftblock = deque->leftblock;
758
192
    leftindex = deque->leftindex;
759
760
    /* Set the deque to be empty using the newly allocated block */
761
192
    MARK_END(b->leftlink);
762
192
    MARK_END(b->rightlink);
763
192
    Py_SET_SIZE(deque, 0);
764
192
    deque->leftblock = b;
765
192
    deque->rightblock = b;
766
192
    deque->leftindex = CENTER + 1;
767
192
    deque->rightindex = CENTER;
768
192
    deque->state++;
769
770
    /* Now the old size, leftblock, and leftindex are disconnected from
771
       the empty deque and we can use them to decref the pointers.
772
    */
773
192
    m = (BLOCKLEN - leftindex > n) ? n : BLOCKLEN - leftindex;
774
192
    itemptr = &leftblock->data[leftindex];
775
192
    limit = itemptr + m;
776
192
    n -= m;
777
52.6k
    while (1) {
778
52.6k
        if (itemptr == limit) {
779
987
            if (n == 0)
780
192
                break;
781
795
            CHECK_NOT_END(leftblock->rightlink);
782
795
            prevblock = leftblock;
783
795
            leftblock = leftblock->rightlink;
784
795
            m = (n > BLOCKLEN) ? BLOCKLEN : n;
785
795
            itemptr = leftblock->data;
786
795
            limit = itemptr + m;
787
795
            n -= m;
788
795
            freeblock(deque, prevblock);
789
795
        }
790
52.5k
        item = *(itemptr++);
791
52.5k
        Py_DECREF(item);
792
52.5k
    }
793
192
    CHECK_END(leftblock->rightlink);
794
192
    freeblock(deque, leftblock);
795
192
    return 0;
796
797
0
  alternate_method:
798
0
    while (Py_SIZE(deque)) {
799
0
        item = deque_pop_impl(deque);
800
0
        assert (item != NULL);
801
0
        Py_DECREF(item);
802
0
    }
803
0
    return 0;
804
192
}
805
806
/*[clinic input]
807
@critical_section
808
_collections.deque.clear as deque_clearmethod
809
810
    deque: dequeobject
811
812
Remove all elements from the deque.
813
[clinic start generated code]*/
814
815
static PyObject *
816
deque_clearmethod_impl(dequeobject *deque)
817
/*[clinic end generated code: output=79b2513e097615c1 input=3a22e9605d20c5e9]*/
818
0
{
819
0
    (void)deque_clear((PyObject *)deque);
820
0
    Py_RETURN_NONE;
821
0
}
822
823
static PyObject *
824
deque_inplace_repeat_lock_held(dequeobject *deque, Py_ssize_t n)
825
0
{
826
0
    Py_ssize_t i, m, size;
827
0
    PyObject *seq;
828
0
    PyObject *rv;
829
830
0
    size = Py_SIZE(deque);
831
0
    if (size == 0 || n == 1) {
832
0
        return Py_NewRef(deque);
833
0
    }
834
835
0
    if (n <= 0) {
836
0
        (void)deque_clear((PyObject *)deque);
837
0
        return Py_NewRef(deque);
838
0
    }
839
840
0
    if (size == 1) {
841
        /* common case, repeating a single element */
842
0
        PyObject *item = deque->leftblock->data[deque->leftindex];
843
844
0
        if (deque->maxlen >= 0 && n > deque->maxlen)
845
0
            n = deque->maxlen;
846
847
0
        deque->state++;
848
0
        for (i = 0 ; i < n-1 ; ) {
849
0
            if (deque->rightindex == BLOCKLEN - 1) {
850
0
                block *b = newblock(deque);
851
0
                if (b == NULL) {
852
0
                    Py_SET_SIZE(deque, Py_SIZE(deque) + i);
853
0
                    return NULL;
854
0
                }
855
0
                b->leftlink = deque->rightblock;
856
0
                CHECK_END(deque->rightblock->rightlink);
857
0
                deque->rightblock->rightlink = b;
858
0
                deque->rightblock = b;
859
0
                MARK_END(b->rightlink);
860
0
                deque->rightindex = -1;
861
0
            }
862
0
            m = n - 1 - i;
863
0
            if (m > BLOCKLEN - 1 - deque->rightindex)
864
0
                m = BLOCKLEN - 1 - deque->rightindex;
865
0
            i += m;
866
0
            while (m--) {
867
0
                deque->rightindex++;
868
0
                deque->rightblock->data[deque->rightindex] = Py_NewRef(item);
869
0
            }
870
0
        }
871
0
        Py_SET_SIZE(deque, Py_SIZE(deque) + i);
872
0
        return Py_NewRef(deque);
873
0
    }
874
875
0
    if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
876
0
        return PyErr_NoMemory();
877
0
    }
878
879
0
    seq = PySequence_List((PyObject *)deque);
880
0
    if (seq == NULL)
881
0
        return seq;
882
883
    /* Reduce the number of repetitions when maxlen would be exceeded */
884
0
    if (deque->maxlen >= 0 && n * size > deque->maxlen)
885
0
        n = (deque->maxlen + size - 1) / size;
886
887
0
    for (i = 0 ; i < n-1 ; i++) {
888
0
        rv = deque_extend_impl(deque, seq);
889
0
        if (rv == NULL) {
890
0
            Py_DECREF(seq);
891
0
            return NULL;
892
0
        }
893
0
        Py_DECREF(rv);
894
0
    }
895
0
    Py_INCREF(deque);
896
0
    Py_DECREF(seq);
897
0
    return (PyObject *)deque;
898
0
}
899
900
static PyObject *
901
deque_inplace_repeat(PyObject *self, Py_ssize_t n)
902
0
{
903
0
    dequeobject *deque = dequeobject_CAST(self);
904
0
    PyObject *result;
905
0
    Py_BEGIN_CRITICAL_SECTION(deque);
906
0
    result = deque_inplace_repeat_lock_held(deque, n);
907
0
    Py_END_CRITICAL_SECTION();
908
0
    return result;
909
0
}
910
911
static PyObject *
912
deque_repeat(PyObject *self, Py_ssize_t n)
913
0
{
914
0
    dequeobject *deque = dequeobject_CAST(self);
915
0
    dequeobject *new_deque;
916
0
    PyObject *rv;
917
918
0
    Py_BEGIN_CRITICAL_SECTION(deque);
919
0
    new_deque = (dequeobject *)deque_copy_impl(deque);
920
0
    Py_END_CRITICAL_SECTION();
921
0
    if (new_deque == NULL)
922
0
        return NULL;
923
    // It's safe to not acquire the per-object lock for new_deque; it's
924
    // invisible to other threads.
925
0
    rv = deque_inplace_repeat_lock_held(new_deque, n);
926
0
    Py_DECREF(new_deque);
927
0
    return rv;
928
0
}
929
930
/* The rotate() method is part of the public API and is used internally
931
as a primitive for other methods.
932
933
Rotation by 1 or -1 is a common case, so any optimizations for high
934
volume rotations should take care not to penalize the common case.
935
936
Conceptually, a rotate by one is equivalent to a pop on one side and an
937
append on the other.  However, a pop/append pair is unnecessarily slow
938
because it requires an incref/decref pair for an object located randomly
939
in memory.  It is better to just move the object pointer from one block
940
to the next without changing the reference count.
941
942
When moving batches of pointers, it is tempting to use memcpy() but that
943
proved to be slower than a simple loop for a variety of reasons.
944
Memcpy() cannot know in advance that we're copying pointers instead of
945
bytes, that the source and destination are pointer aligned and
946
non-overlapping, that moving just one pointer is a common case, that we
947
never need to move more than BLOCKLEN pointers, and that at least one
948
pointer is always moved.
949
950
For high volume rotations, newblock() and freeblock() are never called
951
more than once.  Previously emptied blocks are immediately reused as a
952
destination block.  If a block is left-over at the end, it is freed.
953
*/
954
955
static int
956
_deque_rotate(dequeobject *deque, Py_ssize_t n)
957
0
{
958
0
    block *b = NULL;
959
0
    block *leftblock = deque->leftblock;
960
0
    block *rightblock = deque->rightblock;
961
0
    Py_ssize_t leftindex = deque->leftindex;
962
0
    Py_ssize_t rightindex = deque->rightindex;
963
0
    Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
964
0
    int rv = -1;
965
966
0
    if (len <= 1)
967
0
        return 0;
968
0
    if (n > halflen || n < -halflen) {
969
0
        n %= len;
970
0
        if (n > halflen)
971
0
            n -= len;
972
0
        else if (n < -halflen)
973
0
            n += len;
974
0
    }
975
0
    assert(len > 1);
976
0
    assert(-halflen <= n && n <= halflen);
977
978
0
    deque->state++;
979
0
    while (n > 0) {
980
0
        if (leftindex == 0) {
981
0
            if (b == NULL) {
982
0
                b = newblock(deque);
983
0
                if (b == NULL)
984
0
                    goto done;
985
0
            }
986
0
            b->rightlink = leftblock;
987
0
            CHECK_END(leftblock->leftlink);
988
0
            leftblock->leftlink = b;
989
0
            leftblock = b;
990
0
            MARK_END(b->leftlink);
991
0
            leftindex = BLOCKLEN;
992
0
            b = NULL;
993
0
        }
994
0
        assert(leftindex > 0);
995
0
        {
996
0
            PyObject **src, **dest;
997
0
            Py_ssize_t m = n;
998
999
0
            if (m > rightindex + 1)
1000
0
                m = rightindex + 1;
1001
0
            if (m > leftindex)
1002
0
                m = leftindex;
1003
0
            assert (m > 0 && m <= len);
1004
0
            rightindex -= m;
1005
0
            leftindex -= m;
1006
0
            src = &rightblock->data[rightindex + 1];
1007
0
            dest = &leftblock->data[leftindex];
1008
0
            n -= m;
1009
0
            do {
1010
0
                *(dest++) = *(src++);
1011
0
            } while (--m);
1012
0
        }
1013
0
        if (rightindex < 0) {
1014
0
            assert(leftblock != rightblock);
1015
0
            assert(b == NULL);
1016
0
            b = rightblock;
1017
0
            CHECK_NOT_END(rightblock->leftlink);
1018
0
            rightblock = rightblock->leftlink;
1019
0
            MARK_END(rightblock->rightlink);
1020
0
            rightindex = BLOCKLEN - 1;
1021
0
        }
1022
0
    }
1023
0
    while (n < 0) {
1024
0
        if (rightindex == BLOCKLEN - 1) {
1025
0
            if (b == NULL) {
1026
0
                b = newblock(deque);
1027
0
                if (b == NULL)
1028
0
                    goto done;
1029
0
            }
1030
0
            b->leftlink = rightblock;
1031
0
            CHECK_END(rightblock->rightlink);
1032
0
            rightblock->rightlink = b;
1033
0
            rightblock = b;
1034
0
            MARK_END(b->rightlink);
1035
0
            rightindex = -1;
1036
0
            b = NULL;
1037
0
        }
1038
0
        assert (rightindex < BLOCKLEN - 1);
1039
0
        {
1040
0
            PyObject **src, **dest;
1041
0
            Py_ssize_t m = -n;
1042
1043
0
            if (m > BLOCKLEN - leftindex)
1044
0
                m = BLOCKLEN - leftindex;
1045
0
            if (m > BLOCKLEN - 1 - rightindex)
1046
0
                m = BLOCKLEN - 1 - rightindex;
1047
0
            assert (m > 0 && m <= len);
1048
0
            src = &leftblock->data[leftindex];
1049
0
            dest = &rightblock->data[rightindex + 1];
1050
0
            leftindex += m;
1051
0
            rightindex += m;
1052
0
            n += m;
1053
0
            do {
1054
0
                *(dest++) = *(src++);
1055
0
            } while (--m);
1056
0
        }
1057
0
        if (leftindex == BLOCKLEN) {
1058
0
            assert(leftblock != rightblock);
1059
0
            assert(b == NULL);
1060
0
            b = leftblock;
1061
0
            CHECK_NOT_END(leftblock->rightlink);
1062
0
            leftblock = leftblock->rightlink;
1063
0
            MARK_END(leftblock->leftlink);
1064
0
            leftindex = 0;
1065
0
        }
1066
0
    }
1067
0
    rv = 0;
1068
0
done:
1069
0
    if (b != NULL)
1070
0
        freeblock(deque, b);
1071
0
    deque->leftblock = leftblock;
1072
0
    deque->rightblock = rightblock;
1073
0
    deque->leftindex = leftindex;
1074
0
    deque->rightindex = rightindex;
1075
1076
0
    return rv;
1077
0
}
1078
1079
/*[clinic input]
1080
@critical_section
1081
_collections.deque.rotate as deque_rotate
1082
1083
    deque: dequeobject
1084
    n: Py_ssize_t = 1
1085
    /
1086
1087
Rotate the deque n steps to the right.  If n is negative, rotates left.
1088
[clinic start generated code]*/
1089
1090
static PyObject *
1091
deque_rotate_impl(dequeobject *deque, Py_ssize_t n)
1092
/*[clinic end generated code: output=96c2402a371eb15d input=5bf834296246e002]*/
1093
0
{
1094
0
    if (!_deque_rotate(deque, n))
1095
0
        Py_RETURN_NONE;
1096
0
    return NULL;
1097
0
}
1098
1099
/*[clinic input]
1100
@critical_section
1101
_collections.deque.reverse as deque_reverse
1102
1103
    deque: dequeobject
1104
1105
Reverse *IN PLACE*.
1106
[clinic start generated code]*/
1107
1108
static PyObject *
1109
deque_reverse_impl(dequeobject *deque)
1110
/*[clinic end generated code: output=bdeebc2cf8c1f064 input=26f4167fd623027f]*/
1111
0
{
1112
0
    block *leftblock = deque->leftblock;
1113
0
    block *rightblock = deque->rightblock;
1114
0
    Py_ssize_t leftindex = deque->leftindex;
1115
0
    Py_ssize_t rightindex = deque->rightindex;
1116
0
    Py_ssize_t n = Py_SIZE(deque) >> 1;
1117
0
    PyObject *tmp;
1118
1119
0
    while (--n >= 0) {
1120
        /* Validate that pointers haven't met in the middle */
1121
0
        assert(leftblock != rightblock || leftindex < rightindex);
1122
0
        CHECK_NOT_END(leftblock);
1123
0
        CHECK_NOT_END(rightblock);
1124
1125
        /* Swap */
1126
0
        tmp = leftblock->data[leftindex];
1127
0
        leftblock->data[leftindex] = rightblock->data[rightindex];
1128
0
        rightblock->data[rightindex] = tmp;
1129
1130
        /* Advance left block/index pair */
1131
0
        leftindex++;
1132
0
        if (leftindex == BLOCKLEN) {
1133
0
            leftblock = leftblock->rightlink;
1134
0
            leftindex = 0;
1135
0
        }
1136
1137
        /* Step backwards with the right block/index pair */
1138
0
        rightindex--;
1139
0
        if (rightindex < 0) {
1140
0
            rightblock = rightblock->leftlink;
1141
0
            rightindex = BLOCKLEN - 1;
1142
0
        }
1143
0
    }
1144
0
    Py_RETURN_NONE;
1145
0
}
1146
1147
/*[clinic input]
1148
@critical_section
1149
_collections.deque.count as deque_count
1150
1151
    deque: dequeobject
1152
    value as v: object
1153
    /
1154
1155
Return number of occurrences of value.
1156
[clinic start generated code]*/
1157
1158
static PyObject *
1159
deque_count_impl(dequeobject *deque, PyObject *v)
1160
/*[clinic end generated code: output=2ca26c49b6ab0400 input=4ef67ef2b34dc1fc]*/
1161
0
{
1162
0
    block *b = deque->leftblock;
1163
0
    Py_ssize_t index = deque->leftindex;
1164
0
    Py_ssize_t n = Py_SIZE(deque);
1165
0
    Py_ssize_t count = 0;
1166
0
    size_t start_state = deque->state;
1167
0
    PyObject *item;
1168
0
    int cmp;
1169
1170
0
    while (--n >= 0) {
1171
0
        CHECK_NOT_END(b);
1172
0
        item = Py_NewRef(b->data[index]);
1173
0
        cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1174
0
        Py_DECREF(item);
1175
0
        if (cmp < 0)
1176
0
            return NULL;
1177
0
        count += cmp;
1178
1179
0
        if (start_state != deque->state) {
1180
0
            PyErr_SetString(PyExc_RuntimeError,
1181
0
                            "deque mutated during iteration");
1182
0
            return NULL;
1183
0
        }
1184
1185
        /* Advance left block/index pair */
1186
0
        index++;
1187
0
        if (index == BLOCKLEN) {
1188
0
            b = b->rightlink;
1189
0
            index = 0;
1190
0
        }
1191
0
    }
1192
0
    return PyLong_FromSsize_t(count);
1193
0
}
1194
1195
static int
1196
deque_contains_lock_held(dequeobject *deque, PyObject *v)
1197
0
{
1198
0
    block *b = deque->leftblock;
1199
0
    Py_ssize_t index = deque->leftindex;
1200
0
    Py_ssize_t n = Py_SIZE(deque);
1201
0
    size_t start_state = deque->state;
1202
0
    PyObject *item;
1203
0
    int cmp;
1204
1205
0
    while (--n >= 0) {
1206
0
        CHECK_NOT_END(b);
1207
0
        item = Py_NewRef(b->data[index]);
1208
0
        cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1209
0
        Py_DECREF(item);
1210
0
        if (cmp) {
1211
0
            return cmp;
1212
0
        }
1213
0
        if (start_state != deque->state) {
1214
0
            PyErr_SetString(PyExc_RuntimeError,
1215
0
                            "deque mutated during iteration");
1216
0
            return -1;
1217
0
        }
1218
0
        index++;
1219
0
        if (index == BLOCKLEN) {
1220
0
            b = b->rightlink;
1221
0
            index = 0;
1222
0
        }
1223
0
    }
1224
0
    return 0;
1225
0
}
1226
1227
static int
1228
deque_contains(PyObject *self, PyObject *v)
1229
0
{
1230
0
    dequeobject *deque = dequeobject_CAST(self);
1231
0
    int result;
1232
0
    Py_BEGIN_CRITICAL_SECTION(deque);
1233
0
    result = deque_contains_lock_held(deque, v);
1234
0
    Py_END_CRITICAL_SECTION();
1235
0
    return result;
1236
0
}
1237
1238
static Py_ssize_t
1239
deque_len(PyObject *self)
1240
51.6M
{
1241
51.6M
    PyVarObject *deque = _PyVarObject_CAST(self);
1242
51.6M
    return FT_ATOMIC_LOAD_SSIZE(deque->ob_size);
1243
51.6M
}
1244
1245
/*[clinic input]
1246
@critical_section
1247
@text_signature "($self, value, [start, [stop]])"
1248
_collections.deque.index as deque_index
1249
1250
    deque: dequeobject
1251
    value as v: object
1252
    start: object(converter='_PyEval_SliceIndexNotNone', type='Py_ssize_t', c_default='0') = NULL
1253
    stop: object(converter='_PyEval_SliceIndexNotNone', type='Py_ssize_t', c_default='Py_SIZE(deque)') = NULL
1254
    /
1255
1256
Return first index of value.
1257
1258
Raises ValueError if the value is not present.
1259
[clinic start generated code]*/
1260
1261
static PyObject *
1262
deque_index_impl(dequeobject *deque, PyObject *v, Py_ssize_t start,
1263
                 Py_ssize_t stop)
1264
/*[clinic end generated code: output=df45132753175ef9 input=90f48833a91e1743]*/
1265
0
{
1266
0
    Py_ssize_t i, n;
1267
0
    PyObject *item;
1268
0
    block *b = deque->leftblock;
1269
0
    Py_ssize_t index = deque->leftindex;
1270
0
    size_t start_state = deque->state;
1271
0
    int cmp;
1272
1273
0
    if (start < 0) {
1274
0
        start += Py_SIZE(deque);
1275
0
        if (start < 0)
1276
0
            start = 0;
1277
0
    }
1278
0
    if (stop < 0) {
1279
0
        stop += Py_SIZE(deque);
1280
0
        if (stop < 0)
1281
0
            stop = 0;
1282
0
    }
1283
0
    if (stop > Py_SIZE(deque))
1284
0
        stop = Py_SIZE(deque);
1285
0
    if (start > stop)
1286
0
        start = stop;
1287
0
    assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
1288
1289
0
    for (i=0 ; i < start - BLOCKLEN ; i += BLOCKLEN) {
1290
0
        b = b->rightlink;
1291
0
    }
1292
0
    for ( ; i < start ; i++) {
1293
0
        index++;
1294
0
        if (index == BLOCKLEN) {
1295
0
            b = b->rightlink;
1296
0
            index = 0;
1297
0
        }
1298
0
    }
1299
1300
0
    n = stop - i;
1301
0
    while (--n >= 0) {
1302
0
        CHECK_NOT_END(b);
1303
0
        item = Py_NewRef(b->data[index]);
1304
0
        cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1305
0
        Py_DECREF(item);
1306
0
        if (cmp > 0)
1307
0
            return PyLong_FromSsize_t(stop - n - 1);
1308
0
        if (cmp < 0)
1309
0
            return NULL;
1310
0
        if (start_state != deque->state) {
1311
0
            PyErr_SetString(PyExc_RuntimeError,
1312
0
                            "deque mutated during iteration");
1313
0
            return NULL;
1314
0
        }
1315
0
        index++;
1316
0
        if (index == BLOCKLEN) {
1317
0
            b = b->rightlink;
1318
0
            index = 0;
1319
0
        }
1320
0
    }
1321
0
    PyErr_SetString(PyExc_ValueError, "deque.index(x): x not in deque");
1322
0
    return NULL;
1323
0
}
1324
1325
/* insert(), remove(), and delitem() are implemented in terms of
1326
   rotate() for simplicity and reasonable performance near the end
1327
   points.  If for some reason these methods become popular, it is not
1328
   hard to re-implement this using direct data movement (similar to
1329
   the code used in list slice assignments) and achieve a performance
1330
   boost (by moving each pointer only once instead of twice).
1331
*/
1332
1333
/*[clinic input]
1334
@critical_section
1335
_collections.deque.insert as deque_insert
1336
1337
    deque: dequeobject
1338
    index: Py_ssize_t
1339
    value: object
1340
    /
1341
1342
Insert value before index.
1343
[clinic start generated code]*/
1344
1345
static PyObject *
1346
deque_insert_impl(dequeobject *deque, Py_ssize_t index, PyObject *value)
1347
/*[clinic end generated code: output=ef4d2c15d5532b80 input=dbee706586cc9cde]*/
1348
0
{
1349
0
    Py_ssize_t n = Py_SIZE(deque);
1350
0
    PyObject *rv;
1351
1352
0
    if (deque->maxlen == Py_SIZE(deque)) {
1353
0
        PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
1354
0
        return NULL;
1355
0
    }
1356
0
    if (index >= n)
1357
0
        return deque_append_impl(deque, value);
1358
0
    if (index <= -n || index == 0)
1359
0
        return deque_appendleft_impl(deque, value);
1360
0
    if (_deque_rotate(deque, -index))
1361
0
        return NULL;
1362
0
    if (index < 0)
1363
0
        rv = deque_append_impl(deque, value);
1364
0
    else
1365
0
        rv = deque_appendleft_impl(deque, value);
1366
0
    if (rv == NULL)
1367
0
        return NULL;
1368
0
    Py_DECREF(rv);
1369
0
    if (_deque_rotate(deque, index))
1370
0
        return NULL;
1371
0
    Py_RETURN_NONE;
1372
0
}
1373
1374
static int
1375
valid_index(Py_ssize_t i, Py_ssize_t limit)
1376
580
{
1377
    /* The cast to size_t lets us use just a single comparison
1378
       to check whether i is in the range: 0 <= i < limit */
1379
580
    return (size_t) i < (size_t) limit;
1380
580
}
1381
1382
static PyObject *
1383
deque_item_lock_held(dequeobject *deque, Py_ssize_t i)
1384
0
{
1385
0
    block *b;
1386
0
    PyObject *item;
1387
0
    Py_ssize_t n, index=i;
1388
1389
0
    if (!valid_index(i, Py_SIZE(deque))) {
1390
0
        PyErr_SetString(PyExc_IndexError, "deque index out of range");
1391
0
        return NULL;
1392
0
    }
1393
1394
0
    if (i == 0) {
1395
0
        i = deque->leftindex;
1396
0
        b = deque->leftblock;
1397
0
    } else if (i == Py_SIZE(deque) - 1) {
1398
0
        i = deque->rightindex;
1399
0
        b = deque->rightblock;
1400
0
    } else {
1401
0
        i += deque->leftindex;
1402
0
        n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1403
0
        i = (Py_ssize_t)((size_t) i % BLOCKLEN);
1404
0
        if (index < (Py_SIZE(deque) >> 1)) {
1405
0
            b = deque->leftblock;
1406
0
            while (--n >= 0)
1407
0
                b = b->rightlink;
1408
0
        } else {
1409
0
            n = (Py_ssize_t)(
1410
0
                    ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
1411
0
                    / BLOCKLEN - n);
1412
0
            b = deque->rightblock;
1413
0
            while (--n >= 0)
1414
0
                b = b->leftlink;
1415
0
        }
1416
0
    }
1417
0
    item = b->data[i];
1418
0
    return Py_NewRef(item);
1419
0
}
1420
1421
static PyObject *
1422
deque_item(PyObject *self, Py_ssize_t i)
1423
0
{
1424
0
    dequeobject *deque = dequeobject_CAST(self);
1425
0
    PyObject *result;
1426
0
    Py_BEGIN_CRITICAL_SECTION(deque);
1427
0
    result = deque_item_lock_held(deque, i);
1428
0
    Py_END_CRITICAL_SECTION();
1429
0
    return result;
1430
0
}
1431
1432
static int
1433
deque_del_item(dequeobject *deque, Py_ssize_t i)
1434
0
{
1435
0
    PyObject *item;
1436
0
    int rv;
1437
1438
0
    assert (i >= 0 && i < Py_SIZE(deque));
1439
0
    if (_deque_rotate(deque, -i))
1440
0
        return -1;
1441
0
    item = deque_popleft_impl(deque);
1442
0
    rv = _deque_rotate(deque, i);
1443
0
    assert (item != NULL);
1444
0
    Py_DECREF(item);
1445
0
    return rv;
1446
0
}
1447
1448
/*[clinic input]
1449
@critical_section
1450
_collections.deque.remove as deque_remove
1451
1452
    deque: dequeobject
1453
    value: object
1454
    /
1455
1456
Remove first occurrence of value.
1457
[clinic start generated code]*/
1458
1459
static PyObject *
1460
deque_remove_impl(dequeobject *deque, PyObject *value)
1461
/*[clinic end generated code: output=54cff28b8ef78c5b input=60eb3f8aa4de532a]*/
1462
0
{
1463
0
    PyObject *item;
1464
0
    block *b = deque->leftblock;
1465
0
    Py_ssize_t i, n = Py_SIZE(deque), index = deque->leftindex;
1466
0
    size_t start_state = deque->state;
1467
0
    int cmp, rv;
1468
1469
0
    for (i = 0 ; i < n; i++) {
1470
0
        item = Py_NewRef(b->data[index]);
1471
0
        cmp = PyObject_RichCompareBool(item, value, Py_EQ);
1472
0
        Py_DECREF(item);
1473
0
        if (cmp < 0) {
1474
0
            return NULL;
1475
0
        }
1476
0
        if (start_state != deque->state) {
1477
0
            PyErr_SetString(PyExc_IndexError,
1478
0
                            "deque mutated during iteration");
1479
0
            return NULL;
1480
0
        }
1481
0
        if (cmp > 0) {
1482
0
            break;
1483
0
        }
1484
0
        index++;
1485
0
        if (index == BLOCKLEN) {
1486
0
            b = b->rightlink;
1487
0
            index = 0;
1488
0
        }
1489
0
    }
1490
0
    if (i == n) {
1491
0
        PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1492
0
        return NULL;
1493
0
    }
1494
0
    rv = deque_del_item(deque, i);
1495
0
    if (rv == -1) {
1496
0
        return NULL;
1497
0
    }
1498
0
    Py_RETURN_NONE;
1499
0
}
1500
1501
static int
1502
deque_ass_item_lock_held(dequeobject *deque, Py_ssize_t i, PyObject *v)
1503
0
{
1504
0
    block *b;
1505
0
    Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
1506
1507
0
    if (!valid_index(i, len)) {
1508
0
        PyErr_SetString(PyExc_IndexError, "deque index out of range");
1509
0
        return -1;
1510
0
    }
1511
0
    if (v == NULL)
1512
0
        return deque_del_item(deque, i);
1513
1514
0
    i += deque->leftindex;
1515
0
    n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1516
0
    i = (Py_ssize_t)((size_t) i % BLOCKLEN);
1517
0
    if (index <= halflen) {
1518
0
        b = deque->leftblock;
1519
0
        while (--n >= 0)
1520
0
            b = b->rightlink;
1521
0
    } else {
1522
0
        n = (Py_ssize_t)(
1523
0
                ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
1524
0
                / BLOCKLEN - n);
1525
0
        b = deque->rightblock;
1526
0
        while (--n >= 0)
1527
0
            b = b->leftlink;
1528
0
    }
1529
0
    Py_SETREF(b->data[i], Py_NewRef(v));
1530
0
    return 0;
1531
0
}
1532
1533
static int
1534
deque_ass_item(PyObject *self, Py_ssize_t i, PyObject *v)
1535
0
{
1536
0
    dequeobject *deque = dequeobject_CAST(self);
1537
0
    int result;
1538
0
    Py_BEGIN_CRITICAL_SECTION(deque);
1539
0
    result = deque_ass_item_lock_held(deque, i, v);
1540
0
    Py_END_CRITICAL_SECTION();
1541
0
    return result;
1542
0
}
1543
1544
static void
1545
deque_dealloc(PyObject *self)
1546
15.9k
{
1547
15.9k
    dequeobject *deque = dequeobject_CAST(self);
1548
15.9k
    PyTypeObject *tp = Py_TYPE(deque);
1549
15.9k
    Py_ssize_t i;
1550
1551
15.9k
    PyObject_GC_UnTrack(deque);
1552
15.9k
    FT_CLEAR_WEAKREFS(self, deque->weakreflist);
1553
15.9k
    if (deque->leftblock != NULL) {
1554
15.9k
        (void)deque_clear(self);
1555
15.9k
        assert(deque->leftblock != NULL);
1556
15.9k
        freeblock(deque, deque->leftblock);
1557
15.9k
    }
1558
15.9k
    deque->leftblock = NULL;
1559
15.9k
    deque->rightblock = NULL;
1560
51.7k
    for (i=0 ; i < deque->numfreeblocks ; i++) {
1561
35.8k
        PyMem_Free(deque->freeblocks[i]);
1562
35.8k
    }
1563
15.9k
    tp->tp_free(deque);
1564
15.9k
    Py_DECREF(tp);
1565
15.9k
}
1566
1567
static int
1568
deque_traverse(PyObject *self, visitproc visit, void *arg)
1569
2.10k
{
1570
2.10k
    dequeobject *deque = dequeobject_CAST(self);
1571
2.10k
    Py_VISIT(Py_TYPE(deque));
1572
1573
2.10k
    block *b;
1574
2.10k
    PyObject *item;
1575
2.10k
    Py_ssize_t index;
1576
2.10k
    Py_ssize_t indexlo = deque->leftindex;
1577
2.10k
    Py_ssize_t indexhigh;
1578
1579
23.0k
    for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1580
1.32M
        for (index = indexlo; index < BLOCKLEN ; index++) {
1581
1.30M
            item = b->data[index];
1582
1.30M
            Py_VISIT(item);
1583
1.30M
        }
1584
20.9k
        indexlo = 0;
1585
20.9k
    }
1586
2.10k
    indexhigh = deque->rightindex;
1587
41.1k
    for (index = indexlo; index <= indexhigh; index++) {
1588
39.0k
        item = b->data[index];
1589
39.0k
        Py_VISIT(item);
1590
39.0k
    }
1591
2.10k
    return 0;
1592
2.10k
}
1593
1594
/*[clinic input]
1595
_collections.deque.__reduce__ as deque___reduce__
1596
1597
    deque: dequeobject
1598
1599
Return state information for pickling.
1600
[clinic start generated code]*/
1601
1602
static PyObject *
1603
deque___reduce___impl(dequeobject *deque)
1604
/*[clinic end generated code: output=cb85d9e0b7d2c5ad input=991a933a5bc7a526]*/
1605
0
{
1606
0
    PyObject *state, *it;
1607
1608
0
    state = _PyObject_GetState((PyObject *)deque);
1609
0
    if (state == NULL) {
1610
0
        return NULL;
1611
0
    }
1612
1613
0
    it = PyObject_GetIter((PyObject *)deque);
1614
0
    if (it == NULL) {
1615
0
        Py_DECREF(state);
1616
0
        return NULL;
1617
0
    }
1618
1619
    // It's safe to access deque->maxlen here without holding the per object
1620
    // lock for deque; deque->maxlen is only assigned during construction.
1621
0
    if (deque->maxlen < 0) {
1622
0
        return Py_BuildValue("O()NN", Py_TYPE(deque), state, it);
1623
0
    }
1624
0
    else {
1625
0
        return Py_BuildValue("O(()n)NN", Py_TYPE(deque), deque->maxlen, state, it);
1626
0
    }
1627
0
}
1628
1629
PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1630
1631
static PyObject *
1632
deque_repr(PyObject *deque)
1633
0
{
1634
0
    PyObject *aslist, *result;
1635
0
    int i;
1636
1637
0
    i = Py_ReprEnter(deque);
1638
0
    if (i != 0) {
1639
0
        if (i < 0)
1640
0
            return NULL;
1641
0
        return PyUnicode_FromString("[...]");
1642
0
    }
1643
1644
0
    aslist = PySequence_List(deque);
1645
0
    if (aslist == NULL) {
1646
0
        Py_ReprLeave(deque);
1647
0
        return NULL;
1648
0
    }
1649
0
    Py_ssize_t maxlen = dequeobject_CAST(deque)->maxlen;
1650
0
    if (maxlen >= 0)
1651
0
        result = PyUnicode_FromFormat("%s(%R, maxlen=%zd)",
1652
0
                                      _PyType_Name(Py_TYPE(deque)), aslist,
1653
0
                                      maxlen);
1654
0
    else
1655
0
        result = PyUnicode_FromFormat("%s(%R)",
1656
0
                                      _PyType_Name(Py_TYPE(deque)), aslist);
1657
0
    Py_ReprLeave(deque);
1658
0
    Py_DECREF(aslist);
1659
0
    return result;
1660
0
}
1661
1662
static PyObject *
1663
deque_richcompare(PyObject *v, PyObject *w, int op)
1664
0
{
1665
0
    PyObject *it1=NULL, *it2=NULL, *x, *y;
1666
0
    Py_ssize_t vs, ws;
1667
0
    int b, cmp=-1;
1668
1669
0
    collections_state *state = find_module_state_by_def(Py_TYPE(v));
1670
0
    if (!PyObject_TypeCheck(v, state->deque_type) ||
1671
0
        !PyObject_TypeCheck(w, state->deque_type)) {
1672
0
        Py_RETURN_NOTIMPLEMENTED;
1673
0
    }
1674
1675
    /* Shortcuts */
1676
0
    vs = Py_SIZE(v);
1677
0
    ws = Py_SIZE(w);
1678
0
    if (op == Py_EQ) {
1679
0
        if (v == w)
1680
0
            Py_RETURN_TRUE;
1681
0
        if (vs != ws)
1682
0
            Py_RETURN_FALSE;
1683
0
    }
1684
0
    if (op == Py_NE) {
1685
0
        if (v == w)
1686
0
            Py_RETURN_FALSE;
1687
0
        if (vs != ws)
1688
0
            Py_RETURN_TRUE;
1689
0
    }
1690
1691
    /* Search for the first index where items are different */
1692
0
    it1 = PyObject_GetIter(v);
1693
0
    if (it1 == NULL)
1694
0
        goto done;
1695
0
    it2 = PyObject_GetIter(w);
1696
0
    if (it2 == NULL)
1697
0
        goto done;
1698
0
    for (;;) {
1699
0
        x = PyIter_Next(it1);
1700
0
        if (x == NULL && PyErr_Occurred())
1701
0
            goto done;
1702
0
        y = PyIter_Next(it2);
1703
0
        if (x == NULL || y == NULL)
1704
0
            break;
1705
0
        b = PyObject_RichCompareBool(x, y, Py_EQ);
1706
0
        if (b == 0) {
1707
0
            cmp = PyObject_RichCompareBool(x, y, op);
1708
0
            Py_DECREF(x);
1709
0
            Py_DECREF(y);
1710
0
            goto done;
1711
0
        }
1712
0
        Py_DECREF(x);
1713
0
        Py_DECREF(y);
1714
0
        if (b < 0)
1715
0
            goto done;
1716
0
    }
1717
    /* We reached the end of one deque or both */
1718
0
    Py_XDECREF(x);
1719
0
    Py_XDECREF(y);
1720
0
    if (PyErr_Occurred())
1721
0
        goto done;
1722
0
    switch (op) {
1723
0
    case Py_LT: cmp = y != NULL; break;  /* if w was longer */
1724
0
    case Py_LE: cmp = x == NULL; break;  /* if v was not longer */
1725
0
    case Py_EQ: cmp = x == y;    break;  /* if we reached the end of both */
1726
0
    case Py_NE: cmp = x != y;    break;  /* if one deque continues */
1727
0
    case Py_GT: cmp = x != NULL; break;  /* if v was longer */
1728
0
    case Py_GE: cmp = y == NULL; break;  /* if w was not longer */
1729
0
    }
1730
1731
0
done:
1732
0
    Py_XDECREF(it1);
1733
0
    Py_XDECREF(it2);
1734
0
    if (cmp == 1)
1735
0
        Py_RETURN_TRUE;
1736
0
    if (cmp == 0)
1737
0
        Py_RETURN_FALSE;
1738
0
    return NULL;
1739
0
}
1740
1741
/*[clinic input]
1742
@critical_section
1743
@text_signature "([iterable[, maxlen]])"
1744
_collections.deque.__init__ as deque_init
1745
1746
    deque: dequeobject
1747
    iterable: object = NULL
1748
    maxlen as maxlenobj: object = NULL
1749
1750
A list-like sequence optimized for data accesses near its endpoints.
1751
[clinic start generated code]*/
1752
1753
static int
1754
deque_init_impl(dequeobject *deque, PyObject *iterable, PyObject *maxlenobj)
1755
/*[clinic end generated code: output=7084a39d71218dcd input=2b9e37af1fd73143]*/
1756
15.9k
{
1757
15.9k
    Py_ssize_t maxlen = -1;
1758
15.9k
    if (maxlenobj != NULL && maxlenobj != Py_None) {
1759
0
        maxlen = PyLong_AsSsize_t(maxlenobj);
1760
0
        if (maxlen == -1 && PyErr_Occurred())
1761
0
            return -1;
1762
0
        if (maxlen < 0) {
1763
0
            PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1764
0
            return -1;
1765
0
        }
1766
0
    }
1767
15.9k
    deque->maxlen = maxlen;
1768
15.9k
    if (Py_SIZE(deque) > 0)
1769
0
        (void)deque_clear((PyObject *)deque);
1770
15.9k
    if (iterable != NULL) {
1771
8
        PyObject *rv = deque_extend_impl(deque, iterable);
1772
8
        if (rv == NULL)
1773
0
            return -1;
1774
8
        Py_DECREF(rv);
1775
8
    }
1776
15.9k
    return 0;
1777
15.9k
}
1778
1779
/*[clinic input]
1780
@critical_section
1781
_collections.deque.__sizeof__ as deque___sizeof__
1782
1783
    deque: dequeobject
1784
1785
Return the size of the deque in memory, in bytes.
1786
[clinic start generated code]*/
1787
1788
static PyObject *
1789
deque___sizeof___impl(dequeobject *deque)
1790
/*[clinic end generated code: output=4d36e9fb4f30bbaf input=762312f2d4813535]*/
1791
0
{
1792
0
    size_t res = _PyObject_SIZE(Py_TYPE(deque));
1793
0
    size_t blocks;
1794
0
    blocks = (size_t)(deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
1795
0
    assert(((size_t)deque->leftindex + (size_t)Py_SIZE(deque) - 1) ==
1796
0
           ((blocks - 1) * BLOCKLEN + (size_t)deque->rightindex));
1797
0
    res += blocks * sizeof(block);
1798
0
    return PyLong_FromSize_t(res);
1799
0
}
1800
1801
static PyObject *
1802
deque_get_maxlen(PyObject *self, void *Py_UNUSED(closure))
1803
0
{
1804
0
    dequeobject *deque = dequeobject_CAST(self);
1805
0
    if (deque->maxlen < 0)
1806
0
        Py_RETURN_NONE;
1807
0
    return PyLong_FromSsize_t(deque->maxlen);
1808
0
}
1809
1810
static PyObject *deque_reviter(dequeobject *deque);
1811
1812
/*[clinic input]
1813
_collections.deque.__reversed__ as deque___reversed__
1814
1815
    deque: dequeobject
1816
1817
Return a reverse iterator over the deque.
1818
[clinic start generated code]*/
1819
1820
static PyObject *
1821
deque___reversed___impl(dequeobject *deque)
1822
/*[clinic end generated code: output=3e7e7e715883cf2e input=3d494c25a6fe5c7e]*/
1823
0
{
1824
0
    return deque_reviter(deque);
1825
0
}
1826
1827
/* deque object ********************************************************/
1828
1829
static PyGetSetDef deque_getset[] = {
1830
    {"maxlen", deque_get_maxlen, NULL,
1831
     "maximum size of a deque or None if unbounded"},
1832
    {0}
1833
};
1834
1835
static PyObject *deque_iter(PyObject *deque);
1836
1837
static PyMethodDef deque_methods[] = {
1838
    DEQUE_APPEND_METHODDEF
1839
    DEQUE_APPENDLEFT_METHODDEF
1840
    DEQUE_CLEARMETHOD_METHODDEF
1841
    DEQUE___COPY___METHODDEF
1842
    DEQUE_COPY_METHODDEF
1843
    DEQUE_COUNT_METHODDEF
1844
    DEQUE_EXTEND_METHODDEF
1845
    DEQUE_EXTENDLEFT_METHODDEF
1846
    DEQUE_INDEX_METHODDEF
1847
    DEQUE_INSERT_METHODDEF
1848
    DEQUE_POP_METHODDEF
1849
    DEQUE_POPLEFT_METHODDEF
1850
    DEQUE___REDUCE___METHODDEF
1851
    DEQUE_REMOVE_METHODDEF
1852
    DEQUE___REVERSED___METHODDEF
1853
    DEQUE_REVERSE_METHODDEF
1854
    DEQUE_ROTATE_METHODDEF
1855
    DEQUE___SIZEOF___METHODDEF
1856
    {"__class_getitem__",       Py_GenericAlias,
1857
        METH_O|METH_CLASS,       PyDoc_STR("See PEP 585")},
1858
    {NULL,              NULL}   /* sentinel */
1859
};
1860
1861
static PyMemberDef deque_members[] = {
1862
    {"__weaklistoffset__", Py_T_PYSSIZET, offsetof(dequeobject, weakreflist), Py_READONLY},
1863
    {NULL},
1864
};
1865
1866
static PyType_Slot deque_slots[] = {
1867
    {Py_tp_dealloc, deque_dealloc},
1868
    {Py_tp_repr, deque_repr},
1869
    {Py_tp_hash, PyObject_HashNotImplemented},
1870
    {Py_tp_getattro, PyObject_GenericGetAttr},
1871
    {Py_tp_doc, (void *)deque_init__doc__},
1872
    {Py_tp_traverse, deque_traverse},
1873
    {Py_tp_clear, deque_clear},
1874
    {Py_tp_richcompare, deque_richcompare},
1875
    {Py_tp_iter, deque_iter},
1876
    {Py_tp_getset, deque_getset},
1877
    {Py_tp_init, deque_init},
1878
    {Py_tp_alloc, PyType_GenericAlloc},
1879
    {Py_tp_new, deque_new},
1880
    {Py_tp_free, PyObject_GC_Del},
1881
    {Py_tp_methods, deque_methods},
1882
    {Py_tp_members, deque_members},
1883
1884
    // Sequence protocol
1885
    {Py_sq_length, deque_len},
1886
    {Py_sq_concat, deque_concat},
1887
    {Py_sq_repeat, deque_repeat},
1888
    {Py_sq_item, deque_item},
1889
    {Py_sq_ass_item, deque_ass_item},
1890
    {Py_sq_contains, deque_contains},
1891
    {Py_sq_inplace_concat, deque_inplace_concat},
1892
    {Py_sq_inplace_repeat, deque_inplace_repeat},
1893
    {0, NULL},
1894
};
1895
1896
static PyType_Spec deque_spec = {
1897
    .name = "collections.deque",
1898
    .basicsize = sizeof(dequeobject),
1899
    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
1900
              Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_SEQUENCE |
1901
              Py_TPFLAGS_IMMUTABLETYPE),
1902
    .slots = deque_slots,
1903
};
1904
1905
/*********************** Deque Iterator **************************/
1906
1907
typedef struct {
1908
    PyObject_HEAD
1909
    block *b;
1910
    Py_ssize_t index;
1911
    dequeobject *deque;
1912
    size_t state;          /* state when the iterator is created */
1913
    Py_ssize_t counter;    /* number of items remaining for iteration */
1914
} dequeiterobject;
1915
1916
0
#define dequeiterobject_CAST(op)    ((dequeiterobject *)(op))
1917
1918
static PyObject *
1919
deque_iter(PyObject *self)
1920
0
{
1921
0
    dequeiterobject *it;
1922
0
    dequeobject *deque = dequeobject_CAST(self);
1923
1924
0
    collections_state *state = find_module_state_by_def(Py_TYPE(deque));
1925
0
    it = PyObject_GC_New(dequeiterobject, state->dequeiter_type);
1926
0
    if (it == NULL)
1927
0
        return NULL;
1928
0
    Py_BEGIN_CRITICAL_SECTION(deque);
1929
0
    it->b = deque->leftblock;
1930
0
    it->index = deque->leftindex;
1931
0
    it->deque = (dequeobject*)Py_NewRef(deque);
1932
0
    it->state = deque->state;
1933
0
    it->counter = Py_SIZE(deque);
1934
0
    Py_END_CRITICAL_SECTION();
1935
0
    PyObject_GC_Track(it);
1936
0
    return (PyObject *)it;
1937
0
}
1938
1939
static int
1940
dequeiter_traverse(PyObject *op, visitproc visit, void *arg)
1941
0
{
1942
0
    dequeiterobject *dio = dequeiterobject_CAST(op);
1943
0
    Py_VISIT(Py_TYPE(dio));
1944
0
    Py_VISIT(dio->deque);
1945
0
    return 0;
1946
0
}
1947
1948
static int
1949
dequeiter_clear(PyObject *op)
1950
0
{
1951
0
    dequeiterobject *dio = dequeiterobject_CAST(op);
1952
0
    Py_CLEAR(dio->deque);
1953
0
    return 0;
1954
0
}
1955
1956
static void
1957
dequeiter_dealloc(PyObject *dio)
1958
0
{
1959
    /* bpo-31095: UnTrack is needed before calling any callbacks */
1960
0
    PyTypeObject *tp = Py_TYPE(dio);
1961
0
    PyObject_GC_UnTrack(dio);
1962
0
    (void)dequeiter_clear(dio);
1963
0
    PyObject_GC_Del(dio);
1964
0
    Py_DECREF(tp);
1965
0
}
1966
1967
static PyObject *
1968
dequeiter_next_lock_held(dequeiterobject *it, dequeobject *deque)
1969
0
{
1970
0
    PyObject *item;
1971
1972
0
    if (it->deque->state != it->state) {
1973
0
        it->counter = 0;
1974
0
        PyErr_SetString(PyExc_RuntimeError,
1975
0
                        "deque mutated during iteration");
1976
0
        return NULL;
1977
0
    }
1978
0
    if (it->counter == 0)
1979
0
        return NULL;
1980
0
    assert (!(it->b == it->deque->rightblock &&
1981
0
              it->index > it->deque->rightindex));
1982
1983
0
    item = it->b->data[it->index];
1984
0
    it->index++;
1985
0
    it->counter--;
1986
0
    if (it->index == BLOCKLEN && it->counter > 0) {
1987
0
        CHECK_NOT_END(it->b->rightlink);
1988
0
        it->b = it->b->rightlink;
1989
0
        it->index = 0;
1990
0
    }
1991
0
    return Py_NewRef(item);
1992
0
}
1993
1994
static PyObject *
1995
dequeiter_next(PyObject *op)
1996
0
{
1997
0
    PyObject *result;
1998
0
    dequeiterobject *it = dequeiterobject_CAST(op);
1999
    // It's safe to access it->deque without holding the per-object lock for it
2000
    // here; it->deque is only assigned during construction of it.
2001
0
    dequeobject *deque = it->deque;
2002
0
    Py_BEGIN_CRITICAL_SECTION2(it, deque);
2003
0
    result = dequeiter_next_lock_held(it, deque);
2004
0
    Py_END_CRITICAL_SECTION2();
2005
2006
0
    return result;
2007
0
}
2008
2009
static PyObject *
2010
dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2011
0
{
2012
0
    Py_ssize_t i, index=0;
2013
0
    PyObject *deque;
2014
0
    dequeiterobject *it;
2015
0
    collections_state *state = get_module_state_by_cls(type);
2016
0
    if (!PyArg_ParseTuple(args, "O!|n", state->deque_type, &deque, &index))
2017
0
        return NULL;
2018
0
    assert(type == state->dequeiter_type);
2019
2020
0
    it = (dequeiterobject*)deque_iter(deque);
2021
0
    if (!it)
2022
0
        return NULL;
2023
    /* consume items from the queue */
2024
0
    for(i=0; i<index; i++) {
2025
0
        PyObject *item = dequeiter_next((PyObject *)it);
2026
0
        if (item) {
2027
0
            Py_DECREF(item);
2028
0
        } else {
2029
            /*
2030
             * It's safe to read directly from it without acquiring the
2031
             * per-object lock; the iterator isn't visible to any other threads
2032
             * yet.
2033
             */
2034
0
            if (it->counter) {
2035
0
                Py_DECREF(it);
2036
0
                return NULL;
2037
0
            } else
2038
0
                break;
2039
0
        }
2040
0
    }
2041
0
    return (PyObject*)it;
2042
0
}
2043
2044
static PyObject *
2045
dequeiter_len(PyObject *op, PyObject *Py_UNUSED(dummy))
2046
0
{
2047
0
    dequeiterobject *it = dequeiterobject_CAST(op);
2048
0
    Py_ssize_t len = FT_ATOMIC_LOAD_SSIZE(it->counter);
2049
0
    return PyLong_FromSsize_t(len);
2050
0
}
2051
2052
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
2053
2054
static PyObject *
2055
dequeiter_reduce(PyObject *op, PyObject *Py_UNUSED(dummy))
2056
0
{
2057
0
    dequeiterobject *it = dequeiterobject_CAST(op);
2058
0
    PyTypeObject *ty = Py_TYPE(it);
2059
    // It's safe to access it->deque without holding the per-object lock for it
2060
    // here; it->deque is only assigned during construction of it.
2061
0
    dequeobject *deque = it->deque;
2062
0
    Py_ssize_t size, counter;
2063
0
    Py_BEGIN_CRITICAL_SECTION2(it, deque);
2064
0
    size = Py_SIZE(deque);
2065
0
    counter = it->counter;
2066
0
    Py_END_CRITICAL_SECTION2();
2067
0
    return Py_BuildValue("O(On)", ty, deque, size - counter);
2068
0
}
2069
2070
static PyMethodDef dequeiter_methods[] = {
2071
    {"__length_hint__", dequeiter_len, METH_NOARGS, length_hint_doc},
2072
    {"__reduce__", dequeiter_reduce, METH_NOARGS, reduce_doc},
2073
    {NULL,              NULL}           /* sentinel */
2074
};
2075
2076
static PyType_Slot dequeiter_slots[] = {
2077
    {Py_tp_dealloc, dequeiter_dealloc},
2078
    {Py_tp_getattro, PyObject_GenericGetAttr},
2079
    {Py_tp_traverse, dequeiter_traverse},
2080
    {Py_tp_clear, dequeiter_clear},
2081
    {Py_tp_iter, PyObject_SelfIter},
2082
    {Py_tp_iternext, dequeiter_next},
2083
    {Py_tp_methods, dequeiter_methods},
2084
    {Py_tp_new, dequeiter_new},
2085
    {0, NULL},
2086
};
2087
2088
static PyType_Spec dequeiter_spec = {
2089
    .name = "collections._deque_iterator",
2090
    .basicsize = sizeof(dequeiterobject),
2091
    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2092
              Py_TPFLAGS_IMMUTABLETYPE),
2093
    .slots = dequeiter_slots,
2094
};
2095
2096
/*********************** Deque Reverse Iterator **************************/
2097
2098
static PyObject *
2099
deque_reviter(dequeobject *deque)
2100
0
{
2101
0
    dequeiterobject *it;
2102
0
    collections_state *state = find_module_state_by_def(Py_TYPE(deque));
2103
2104
0
    it = PyObject_GC_New(dequeiterobject, state->dequereviter_type);
2105
0
    if (it == NULL)
2106
0
        return NULL;
2107
0
    Py_BEGIN_CRITICAL_SECTION(deque);
2108
0
    it->b = deque->rightblock;
2109
0
    it->index = deque->rightindex;
2110
0
    it->deque = (dequeobject*)Py_NewRef(deque);
2111
0
    it->state = deque->state;
2112
0
    it->counter = Py_SIZE(deque);
2113
0
    Py_END_CRITICAL_SECTION();
2114
0
    PyObject_GC_Track(it);
2115
0
    return (PyObject *)it;
2116
0
}
2117
2118
static PyObject *
2119
dequereviter_next_lock_held(dequeiterobject *it, dequeobject *deque)
2120
0
{
2121
0
    PyObject *item;
2122
0
    if (it->counter == 0)
2123
0
        return NULL;
2124
2125
0
    if (it->deque->state != it->state) {
2126
0
        it->counter = 0;
2127
0
        PyErr_SetString(PyExc_RuntimeError,
2128
0
                        "deque mutated during iteration");
2129
0
        return NULL;
2130
0
    }
2131
0
    assert (!(it->b == it->deque->leftblock &&
2132
0
              it->index < it->deque->leftindex));
2133
2134
0
    item = it->b->data[it->index];
2135
0
    it->index--;
2136
0
    it->counter--;
2137
0
    if (it->index < 0 && it->counter > 0) {
2138
0
        CHECK_NOT_END(it->b->leftlink);
2139
0
        it->b = it->b->leftlink;
2140
0
        it->index = BLOCKLEN - 1;
2141
0
    }
2142
0
    return Py_NewRef(item);
2143
0
}
2144
2145
static PyObject *
2146
dequereviter_next(PyObject *self)
2147
0
{
2148
0
    PyObject *item;
2149
0
    dequeiterobject *it = dequeiterobject_CAST(self);
2150
    // It's safe to access it->deque without holding the per-object lock for it
2151
    // here; it->deque is only assigned during construction of it.
2152
0
    dequeobject *deque = it->deque;
2153
0
    Py_BEGIN_CRITICAL_SECTION2(it, deque);
2154
0
    item = dequereviter_next_lock_held(it, deque);
2155
0
    Py_END_CRITICAL_SECTION2();
2156
0
    return item;
2157
0
}
2158
2159
static PyObject *
2160
dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2161
0
{
2162
0
    Py_ssize_t i, index=0;
2163
0
    PyObject *deque;
2164
0
    dequeiterobject *it;
2165
0
    collections_state *state = get_module_state_by_cls(type);
2166
0
    if (!PyArg_ParseTuple(args, "O!|n", state->deque_type, &deque, &index))
2167
0
        return NULL;
2168
0
    assert(type == state->dequereviter_type);
2169
2170
0
    it = (dequeiterobject *)deque_reviter((dequeobject *)deque);
2171
0
    if (!it)
2172
0
        return NULL;
2173
    /* consume items from the queue */
2174
0
    for(i=0; i<index; i++) {
2175
0
        PyObject *item = dequereviter_next((PyObject *)it);
2176
0
        if (item) {
2177
0
            Py_DECREF(item);
2178
0
        } else {
2179
            /*
2180
             * It's safe to read directly from it without acquiring the
2181
             * per-object lock; the iterator isn't visible to any other threads
2182
             * yet.
2183
             */
2184
0
            if (it->counter) {
2185
0
                Py_DECREF(it);
2186
0
                return NULL;
2187
0
            } else
2188
0
                break;
2189
0
        }
2190
0
    }
2191
0
    return (PyObject*)it;
2192
0
}
2193
2194
static PyType_Slot dequereviter_slots[] = {
2195
    {Py_tp_dealloc, dequeiter_dealloc},
2196
    {Py_tp_getattro, PyObject_GenericGetAttr},
2197
    {Py_tp_traverse, dequeiter_traverse},
2198
    {Py_tp_clear, dequeiter_clear},
2199
    {Py_tp_iter, PyObject_SelfIter},
2200
    {Py_tp_iternext, dequereviter_next},
2201
    {Py_tp_methods, dequeiter_methods},
2202
    {Py_tp_new, dequereviter_new},
2203
    {0, NULL},
2204
};
2205
2206
static PyType_Spec dequereviter_spec = {
2207
    .name = "collections._deque_reverse_iterator",
2208
    .basicsize = sizeof(dequeiterobject),
2209
    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2210
              Py_TPFLAGS_IMMUTABLETYPE),
2211
    .slots = dequereviter_slots,
2212
};
2213
2214
/* defaultdict type *********************************************************/
2215
2216
typedef struct {
2217
    PyDictObject dict;
2218
    PyObject *default_factory;
2219
} defdictobject;
2220
2221
117k
#define defdictobject_CAST(op)  ((defdictobject *)(op))
2222
2223
static PyType_Spec defdict_spec;
2224
2225
PyDoc_STRVAR(defdict_missing_doc,
2226
"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
2227
  if self.default_factory is None: raise KeyError((key,))\n\
2228
  self[key] = value = self.default_factory()\n\
2229
  return value\n\
2230
");
2231
2232
static PyObject *
2233
defdict_missing(PyObject *op, PyObject *key)
2234
20.6k
{
2235
20.6k
    defdictobject *dd = defdictobject_CAST(op);
2236
20.6k
    PyObject *factory = dd->default_factory;
2237
20.6k
    PyObject *value;
2238
20.6k
    if (factory == NULL || factory == Py_None) {
2239
        /* XXX Call dict.__missing__(key) */
2240
0
        PyObject *tup;
2241
0
        tup = PyTuple_Pack(1, key);
2242
0
        if (!tup) return NULL;
2243
0
        PyErr_SetObject(PyExc_KeyError, tup);
2244
0
        Py_DECREF(tup);
2245
0
        return NULL;
2246
0
    }
2247
20.6k
    value = _PyObject_CallNoArgs(factory);
2248
20.6k
    if (value == NULL)
2249
0
        return value;
2250
20.6k
    PyObject *result = NULL;
2251
20.6k
    (void)PyDict_SetDefaultRef(op, key, value, &result);
2252
    // 'result' is NULL, or a strong reference to 'value' or 'op[key]'
2253
20.6k
    Py_DECREF(value);
2254
20.6k
    return result;
2255
20.6k
}
2256
2257
static inline PyObject*
2258
new_defdict(PyObject *op, PyObject *arg)
2259
0
{
2260
0
    defdictobject *dd = defdictobject_CAST(op);
2261
0
    return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
2262
0
        dd->default_factory ? dd->default_factory : Py_None, arg, NULL);
2263
0
}
2264
2265
PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
2266
2267
static PyObject *
2268
defdict_copy(PyObject *op, PyObject *Py_UNUSED(dummy))
2269
0
{
2270
    /* This calls the object's class.  That only works for subclasses
2271
       whose class constructor has the same signature.  Subclasses that
2272
       define a different constructor signature must override copy().
2273
    */
2274
0
    return new_defdict(op, op);
2275
0
}
2276
2277
static PyObject *
2278
defdict_reduce(PyObject *op, PyObject *Py_UNUSED(dummy))
2279
0
{
2280
    /* __reduce__ must return a 5-tuple as follows:
2281
2282
       - factory function
2283
       - tuple of args for the factory function
2284
       - additional state (here None)
2285
       - sequence iterator (here None)
2286
       - dictionary iterator (yielding successive (key, value) pairs
2287
2288
       This API is used by pickle.py and copy.py.
2289
2290
       For this to be useful with pickle.py, the default_factory
2291
       must be picklable; e.g., None, a built-in, or a global
2292
       function in a module or package.
2293
2294
       Both shallow and deep copying are supported, but for deep
2295
       copying, the default_factory must be deep-copyable; e.g. None,
2296
       or a built-in (functions are not copyable at this time).
2297
2298
       This only works for subclasses as long as their constructor
2299
       signature is compatible; the first argument must be the
2300
       optional default_factory, defaulting to None.
2301
    */
2302
0
    PyObject *args;
2303
0
    PyObject *items;
2304
0
    PyObject *iter;
2305
0
    PyObject *result;
2306
0
    defdictobject *dd = defdictobject_CAST(op);
2307
2308
0
    if (dd->default_factory == NULL || dd->default_factory == Py_None)
2309
0
        args = PyTuple_New(0);
2310
0
    else
2311
0
        args = PyTuple_Pack(1, dd->default_factory);
2312
0
    if (args == NULL)
2313
0
        return NULL;
2314
0
    items = PyObject_CallMethodNoArgs(op, &_Py_ID(items));
2315
0
    if (items == NULL) {
2316
0
        Py_DECREF(args);
2317
0
        return NULL;
2318
0
    }
2319
0
    iter = PyObject_GetIter(items);
2320
0
    if (iter == NULL) {
2321
0
        Py_DECREF(items);
2322
0
        Py_DECREF(args);
2323
0
        return NULL;
2324
0
    }
2325
0
    result = PyTuple_Pack(5, Py_TYPE(dd), args,
2326
0
                          Py_None, Py_None, iter);
2327
0
    Py_DECREF(iter);
2328
0
    Py_DECREF(items);
2329
0
    Py_DECREF(args);
2330
0
    return result;
2331
0
}
2332
2333
static PyMethodDef defdict_methods[] = {
2334
    {"__missing__", defdict_missing, METH_O,
2335
     defdict_missing_doc},
2336
    {"copy", defdict_copy, METH_NOARGS,
2337
     defdict_copy_doc},
2338
    {"__copy__", defdict_copy, METH_NOARGS,
2339
     defdict_copy_doc},
2340
    {"__reduce__", defdict_reduce, METH_NOARGS,
2341
     reduce_doc},
2342
    {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS,
2343
     PyDoc_STR("See PEP 585")},
2344
    {NULL}
2345
};
2346
2347
static PyMemberDef defdict_members[] = {
2348
    {"default_factory", _Py_T_OBJECT,
2349
     offsetof(defdictobject, default_factory), 0,
2350
     PyDoc_STR("Factory for default value called by __missing__().")},
2351
    {NULL}
2352
};
2353
2354
static void
2355
defdict_dealloc(PyObject *op)
2356
27.1k
{
2357
27.1k
    defdictobject *dd = defdictobject_CAST(op);
2358
    /* bpo-31095: UnTrack is needed before calling any callbacks */
2359
27.1k
    PyTypeObject *tp = Py_TYPE(dd);
2360
27.1k
    PyObject_GC_UnTrack(dd);
2361
27.1k
    Py_CLEAR(dd->default_factory);
2362
27.1k
    PyDict_Type.tp_dealloc(op);
2363
27.1k
    Py_DECREF(tp);
2364
27.1k
}
2365
2366
static PyObject *
2367
defdict_repr(PyObject *op)
2368
0
{
2369
0
    defdictobject *dd = defdictobject_CAST(op);
2370
0
    PyObject *baserepr;
2371
0
    PyObject *defrepr;
2372
0
    PyObject *result;
2373
0
    baserepr = PyDict_Type.tp_repr(op);
2374
0
    if (baserepr == NULL)
2375
0
        return NULL;
2376
0
    if (dd->default_factory == NULL)
2377
0
        defrepr = PyUnicode_FromString("None");
2378
0
    else
2379
0
    {
2380
0
        int status = Py_ReprEnter(dd->default_factory);
2381
0
        if (status != 0) {
2382
0
            if (status < 0) {
2383
0
                Py_DECREF(baserepr);
2384
0
                return NULL;
2385
0
            }
2386
0
            defrepr = PyUnicode_FromString("...");
2387
0
        }
2388
0
        else
2389
0
            defrepr = PyObject_Repr(dd->default_factory);
2390
0
        Py_ReprLeave(dd->default_factory);
2391
0
    }
2392
0
    if (defrepr == NULL) {
2393
0
        Py_DECREF(baserepr);
2394
0
        return NULL;
2395
0
    }
2396
0
    result = PyUnicode_FromFormat("%s(%U, %U)",
2397
0
                                  _PyType_Name(Py_TYPE(dd)),
2398
0
                                  defrepr, baserepr);
2399
0
    Py_DECREF(defrepr);
2400
0
    Py_DECREF(baserepr);
2401
0
    return result;
2402
0
}
2403
2404
static PyObject*
2405
defdict_or(PyObject* left, PyObject* right)
2406
0
{
2407
0
    PyObject *self, *other;
2408
2409
0
    int ret = PyType_GetBaseByToken(Py_TYPE(left), &defdict_spec, NULL);
2410
0
    if (ret < 0) {
2411
0
        return NULL;
2412
0
    }
2413
0
    if (ret) {
2414
0
        self = left;
2415
0
        other = right;
2416
0
    }
2417
0
    else {
2418
0
        assert(PyType_GetBaseByToken(Py_TYPE(right), &defdict_spec, NULL) == 1);
2419
0
        self = right;
2420
0
        other = left;
2421
0
    }
2422
0
    if (!PyDict_Check(other)) {
2423
0
        Py_RETURN_NOTIMPLEMENTED;
2424
0
    }
2425
    // Like copy(), this calls the object's class.
2426
    // Override __or__/__ror__ for subclasses with different constructors.
2427
0
    PyObject *new = new_defdict(self, left);
2428
0
    if (!new) {
2429
0
        return NULL;
2430
0
    }
2431
0
    if (PyDict_Update(new, right)) {
2432
0
        Py_DECREF(new);
2433
0
        return NULL;
2434
0
    }
2435
0
    return new;
2436
0
}
2437
2438
static int
2439
defdict_traverse(PyObject *op, visitproc visit, void *arg)
2440
41.8k
{
2441
41.8k
    defdictobject *self = defdictobject_CAST(op);
2442
41.8k
    Py_VISIT(Py_TYPE(self));
2443
41.8k
    Py_VISIT(self->default_factory);
2444
41.8k
    return PyDict_Type.tp_traverse(op, visit, arg);
2445
41.8k
}
2446
2447
static int
2448
defdict_tp_clear(PyObject *op)
2449
0
{
2450
0
    defdictobject *dd = defdictobject_CAST(op);
2451
0
    Py_CLEAR(dd->default_factory);
2452
0
    return PyDict_Type.tp_clear(op);
2453
0
}
2454
2455
static int
2456
defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2457
27.6k
{
2458
27.6k
    defdictobject *dd = defdictobject_CAST(self);
2459
27.6k
    PyObject *olddefault = dd->default_factory;
2460
27.6k
    PyObject *newdefault = NULL;
2461
27.6k
    PyObject *newargs;
2462
27.6k
    int result;
2463
27.6k
    if (args == NULL || !PyTuple_Check(args))
2464
0
        newargs = PyTuple_New(0);
2465
27.6k
    else {
2466
27.6k
        Py_ssize_t n = PyTuple_GET_SIZE(args);
2467
27.6k
        if (n > 0) {
2468
27.6k
            newdefault = PyTuple_GET_ITEM(args, 0);
2469
27.6k
            if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2470
0
                PyErr_SetString(PyExc_TypeError,
2471
0
                    "first argument must be callable or None");
2472
0
                return -1;
2473
0
            }
2474
27.6k
        }
2475
27.6k
        newargs = PySequence_GetSlice(args, 1, n);
2476
27.6k
    }
2477
27.6k
    if (newargs == NULL)
2478
0
        return -1;
2479
27.6k
    dd->default_factory = Py_XNewRef(newdefault);
2480
27.6k
    result = PyDict_Type.tp_init(self, newargs, kwds);
2481
27.6k
    Py_DECREF(newargs);
2482
27.6k
    Py_XDECREF(olddefault);
2483
27.6k
    return result;
2484
27.6k
}
2485
2486
PyDoc_STRVAR(defdict_doc,
2487
"defaultdict(default_factory=None, /, [...]) --> dict with default factory\n\
2488
\n\
2489
The default factory is called without arguments to produce\n\
2490
a new value when a key is not present, in __getitem__ only.\n\
2491
A defaultdict compares equal to a dict with the same items.\n\
2492
All remaining arguments are treated the same as if they were\n\
2493
passed to the dict constructor, including keyword arguments.\n\
2494
");
2495
2496
/* See comment in xxsubtype.c */
2497
#define DEFERRED_ADDRESS(ADDR) 0
2498
2499
static PyType_Slot defdict_slots[] = {
2500
    {Py_tp_token, Py_TP_USE_SPEC},
2501
    {Py_tp_dealloc, defdict_dealloc},
2502
    {Py_tp_repr, defdict_repr},
2503
    {Py_nb_or, defdict_or},
2504
    {Py_tp_getattro, PyObject_GenericGetAttr},
2505
    {Py_tp_doc, (void *)defdict_doc},
2506
    {Py_tp_traverse, defdict_traverse},
2507
    {Py_tp_clear, defdict_tp_clear},
2508
    {Py_tp_methods, defdict_methods},
2509
    {Py_tp_members, defdict_members},
2510
    {Py_tp_init, defdict_init},
2511
    {Py_tp_alloc, PyType_GenericAlloc},
2512
    {Py_tp_free, PyObject_GC_Del},
2513
    {0, NULL},
2514
};
2515
2516
static PyType_Spec defdict_spec = {
2517
    .name = "collections.defaultdict",
2518
    .basicsize = sizeof(defdictobject),
2519
    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
2520
              Py_TPFLAGS_IMMUTABLETYPE),
2521
    .slots = defdict_slots,
2522
};
2523
2524
/* helper function for Counter  *********************************************/
2525
2526
/*[clinic input]
2527
_collections._count_elements
2528
2529
    mapping: object
2530
    iterable: object
2531
    /
2532
2533
Count elements in the iterable, updating the mapping
2534
[clinic start generated code]*/
2535
2536
static PyObject *
2537
_collections__count_elements_impl(PyObject *module, PyObject *mapping,
2538
                                  PyObject *iterable)
2539
/*[clinic end generated code: output=7e0c1789636b3d8f input=e79fad04534a0b45]*/
2540
0
{
2541
0
    PyObject *it, *oldval;
2542
0
    PyObject *newval = NULL;
2543
0
    PyObject *key = NULL;
2544
0
    PyObject *bound_get = NULL;
2545
0
    PyObject *mapping_get;
2546
0
    PyObject *dict_get;
2547
0
    PyObject *mapping_setitem;
2548
0
    PyObject *dict_setitem;
2549
0
    PyObject *one = _PyLong_GetOne();  // borrowed reference
2550
2551
0
    it = PyObject_GetIter(iterable);
2552
0
    if (it == NULL)
2553
0
        return NULL;
2554
2555
    /* Only take the fast path when get() and __setitem__()
2556
     * have not been overridden.
2557
     */
2558
0
    mapping_get = _PyType_LookupRef(Py_TYPE(mapping), &_Py_ID(get));
2559
0
    dict_get = _PyType_Lookup(&PyDict_Type, &_Py_ID(get));
2560
0
    mapping_setitem = _PyType_LookupRef(Py_TYPE(mapping), &_Py_ID(__setitem__));
2561
0
    dict_setitem = _PyType_Lookup(&PyDict_Type, &_Py_ID(__setitem__));
2562
2563
0
    if (mapping_get != NULL && mapping_get == dict_get &&
2564
0
        mapping_setitem != NULL && mapping_setitem == dict_setitem &&
2565
0
        PyDict_Check(mapping))
2566
0
    {
2567
0
        while (1) {
2568
            /* Fast path advantages:
2569
                   1. Eliminate double hashing
2570
                      (by re-using the same hash for both the get and set)
2571
                   2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2572
                      (argument tuple creation and parsing)
2573
                   3. Avoid indirection through a bound method object
2574
                      (creates another argument tuple)
2575
                   4. Avoid initial increment from zero
2576
                      (reuse an existing one-object instead)
2577
            */
2578
0
            Py_hash_t hash;
2579
2580
0
            key = PyIter_Next(it);
2581
0
            if (key == NULL)
2582
0
                break;
2583
2584
0
            hash = _PyObject_HashFast(key);
2585
0
            if (hash == -1) {
2586
0
                goto done;
2587
0
            }
2588
2589
0
            oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
2590
0
            if (oldval == NULL) {
2591
0
                if (PyErr_Occurred())
2592
0
                    goto done;
2593
0
                if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
2594
0
                    goto done;
2595
0
            } else {
2596
                /* oldval is a borrowed reference.  Keep it alive across
2597
                   PyNumber_Add(), which can execute arbitrary user code and
2598
                   mutate (or even clear) the underlying dict. */
2599
0
                Py_INCREF(oldval);
2600
0
                newval = PyNumber_Add(oldval, one);
2601
0
                Py_DECREF(oldval);
2602
0
                if (newval == NULL)
2603
0
                    goto done;
2604
0
                if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
2605
0
                    goto done;
2606
0
                Py_CLEAR(newval);
2607
0
            }
2608
0
            Py_DECREF(key);
2609
0
        }
2610
0
    }
2611
0
    else {
2612
0
        bound_get = PyObject_GetAttr(mapping, &_Py_ID(get));
2613
0
        if (bound_get == NULL)
2614
0
            goto done;
2615
2616
0
        PyObject *zero = _PyLong_GetZero();  // borrowed reference
2617
0
        while (1) {
2618
0
            key = PyIter_Next(it);
2619
0
            if (key == NULL)
2620
0
                break;
2621
0
            oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
2622
0
            if (oldval == NULL)
2623
0
                break;
2624
0
            if (oldval == zero) {
2625
0
                newval = Py_NewRef(one);
2626
0
            } else {
2627
0
                newval = PyNumber_Add(oldval, one);
2628
0
            }
2629
0
            Py_DECREF(oldval);
2630
0
            if (newval == NULL)
2631
0
                break;
2632
0
            if (PyObject_SetItem(mapping, key, newval) < 0)
2633
0
                break;
2634
0
            Py_CLEAR(newval);
2635
0
            Py_DECREF(key);
2636
0
        }
2637
0
    }
2638
2639
0
done:
2640
0
    Py_XDECREF(mapping_get);
2641
0
    Py_XDECREF(mapping_setitem);
2642
0
    Py_DECREF(it);
2643
0
    Py_XDECREF(key);
2644
0
    Py_XDECREF(newval);
2645
0
    Py_XDECREF(bound_get);
2646
0
    if (PyErr_Occurred())
2647
0
        return NULL;
2648
0
    Py_RETURN_NONE;
2649
0
}
2650
2651
/* Helper function for namedtuple() ************************************/
2652
2653
typedef struct {
2654
    PyObject_HEAD
2655
    Py_ssize_t index;
2656
    PyObject* doc;
2657
} _tuplegetterobject;
2658
2659
34.2k
#define tuplegetterobject_CAST(op)  ((_tuplegetterobject *)(op))
2660
2661
/*[clinic input]
2662
@classmethod
2663
_tuplegetter.__new__ as tuplegetter_new
2664
2665
    index: Py_ssize_t
2666
    doc: object
2667
    /
2668
[clinic start generated code]*/
2669
2670
static PyObject *
2671
tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc)
2672
/*[clinic end generated code: output=014be444ad80263f input=87c576a5bdbc0bbb]*/
2673
908
{
2674
908
    _tuplegetterobject* self;
2675
908
    self = (_tuplegetterobject *)type->tp_alloc(type, 0);
2676
908
    if (self == NULL) {
2677
0
        return NULL;
2678
0
    }
2679
908
    self->index = index;
2680
908
    self->doc = Py_NewRef(doc);
2681
908
    return (PyObject *)self;
2682
908
}
2683
2684
static PyObject *
2685
tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
2686
878
{
2687
878
    Py_ssize_t index = tuplegetterobject_CAST(self)->index;
2688
878
    PyObject *result;
2689
2690
878
    if (obj == NULL) {
2691
298
        return Py_NewRef(self);
2692
298
    }
2693
580
    if (!PyTuple_Check(obj)) {
2694
0
        if (obj == Py_None) {
2695
0
            return Py_NewRef(self);
2696
0
        }
2697
0
        PyErr_Format(PyExc_TypeError,
2698
0
                     "descriptor for index '%zd' for tuple subclasses "
2699
0
                     "doesn't apply to '%s' object",
2700
0
                     index,
2701
0
                     Py_TYPE(obj)->tp_name);
2702
0
        return NULL;
2703
0
    }
2704
2705
580
    if (!valid_index(index, PyTuple_GET_SIZE(obj))) {
2706
0
        PyErr_SetString(PyExc_IndexError, "tuple index out of range");
2707
0
        return NULL;
2708
0
    }
2709
2710
580
    result = PyTuple_GET_ITEM(obj, index);
2711
580
    return Py_NewRef(result);
2712
580
}
2713
2714
static int
2715
tuplegetter_descr_set(PyObject *self, PyObject *obj, PyObject *value)
2716
0
{
2717
0
    if (value == NULL) {
2718
0
        PyErr_SetString(PyExc_AttributeError, "can't delete attribute");
2719
0
    } else {
2720
0
        PyErr_SetString(PyExc_AttributeError, "can't set attribute");
2721
0
    }
2722
0
    return -1;
2723
0
}
2724
2725
static int
2726
tuplegetter_traverse(PyObject *self, visitproc visit, void *arg)
2727
33.3k
{
2728
33.3k
    _tuplegetterobject *tuplegetter = tuplegetterobject_CAST(self);
2729
33.3k
    Py_VISIT(Py_TYPE(tuplegetter));
2730
33.3k
    Py_VISIT(tuplegetter->doc);
2731
33.3k
    return 0;
2732
33.3k
}
2733
2734
static int
2735
tuplegetter_clear(PyObject *self)
2736
0
{
2737
0
    _tuplegetterobject *tuplegetter = tuplegetterobject_CAST(self);
2738
0
    Py_CLEAR(tuplegetter->doc);
2739
0
    return 0;
2740
0
}
2741
2742
static void
2743
tuplegetter_dealloc(PyObject *self)
2744
0
{
2745
0
    PyTypeObject *tp = Py_TYPE(self);
2746
0
    PyObject_GC_UnTrack(self);
2747
0
    (void)tuplegetter_clear(self);
2748
0
    tp->tp_free(self);
2749
0
    Py_DECREF(tp);
2750
0
}
2751
2752
static PyObject*
2753
tuplegetter_reduce(PyObject *op, PyObject *Py_UNUSED(dummy))
2754
0
{
2755
0
    _tuplegetterobject *self = tuplegetterobject_CAST(op);
2756
0
    return Py_BuildValue("(O(nO))", (PyObject *)Py_TYPE(self),
2757
0
                         self->index, self->doc);
2758
0
}
2759
2760
static PyObject*
2761
tuplegetter_repr(PyObject *op)
2762
0
{
2763
0
    _tuplegetterobject *self = tuplegetterobject_CAST(op);
2764
0
    return PyUnicode_FromFormat("%s(%zd, %R)",
2765
0
                                _PyType_Name(Py_TYPE(self)),
2766
0
                                self->index, self->doc);
2767
0
}
2768
2769
2770
static PyMemberDef tuplegetter_members[] = {
2771
    {"__doc__",  _Py_T_OBJECT, offsetof(_tuplegetterobject, doc), 0},
2772
    {0}
2773
};
2774
2775
static PyMethodDef tuplegetter_methods[] = {
2776
    {"__reduce__", tuplegetter_reduce, METH_NOARGS, NULL},
2777
    {NULL},
2778
};
2779
2780
static PyType_Slot tuplegetter_slots[] = {
2781
    {Py_tp_dealloc, tuplegetter_dealloc},
2782
    {Py_tp_repr, tuplegetter_repr},
2783
    {Py_tp_traverse, tuplegetter_traverse},
2784
    {Py_tp_clear, tuplegetter_clear},
2785
    {Py_tp_methods, tuplegetter_methods},
2786
    {Py_tp_members, tuplegetter_members},
2787
    {Py_tp_descr_get, tuplegetter_descr_get},
2788
    {Py_tp_descr_set, tuplegetter_descr_set},
2789
    {Py_tp_new, tuplegetter_new},
2790
    {0, NULL},
2791
};
2792
2793
static PyType_Spec tuplegetter_spec = {
2794
    .name = "collections._tuplegetter",
2795
    .basicsize = sizeof(_tuplegetterobject),
2796
    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2797
              Py_TPFLAGS_IMMUTABLETYPE),
2798
    .slots = tuplegetter_slots,
2799
};
2800
2801
2802
/* module level code ********************************************************/
2803
2804
static int
2805
collections_traverse(PyObject *mod, visitproc visit, void *arg)
2806
1.46k
{
2807
1.46k
    collections_state *state = get_module_state(mod);
2808
1.46k
    Py_VISIT(state->deque_type);
2809
1.46k
    Py_VISIT(state->defdict_type);
2810
1.46k
    Py_VISIT(state->dequeiter_type);
2811
1.46k
    Py_VISIT(state->dequereviter_type);
2812
1.46k
    Py_VISIT(state->tuplegetter_type);
2813
1.46k
    return 0;
2814
1.46k
}
2815
2816
static int
2817
collections_clear(PyObject *mod)
2818
0
{
2819
0
    collections_state *state = get_module_state(mod);
2820
0
    Py_CLEAR(state->deque_type);
2821
0
    Py_CLEAR(state->defdict_type);
2822
0
    Py_CLEAR(state->dequeiter_type);
2823
0
    Py_CLEAR(state->dequereviter_type);
2824
0
    Py_CLEAR(state->tuplegetter_type);
2825
0
    return 0;
2826
0
}
2827
2828
static void
2829
collections_free(void *module)
2830
0
{
2831
0
    (void)collections_clear((PyObject *)module);
2832
0
}
2833
2834
PyDoc_STRVAR(collections_doc,
2835
"High performance data structures.\n\
2836
- deque:        ordered collection accessible from endpoints only\n\
2837
- defaultdict:  dict subclass with a default value factory\n\
2838
");
2839
2840
static struct PyMethodDef collections_methods[] = {
2841
    _COLLECTIONS__COUNT_ELEMENTS_METHODDEF
2842
    {NULL,       NULL}          /* sentinel */
2843
};
2844
2845
150
#define ADD_TYPE(MOD, SPEC, TYPE, BASE) do {                        \
2846
150
    TYPE = (PyTypeObject *)PyType_FromMetaclass(NULL, MOD, SPEC,    \
2847
150
                                                (PyObject *)BASE);  \
2848
150
    if (TYPE == NULL) {                                             \
2849
0
        return -1;                                                  \
2850
0
    }                                                               \
2851
150
    if (PyModule_AddType(MOD, TYPE) < 0) {                          \
2852
0
        return -1;                                                  \
2853
0
    }                                                               \
2854
150
} while (0)
2855
2856
static int
2857
30
collections_exec(PyObject *module) {
2858
30
    collections_state *state = get_module_state(module);
2859
30
    ADD_TYPE(module, &deque_spec, state->deque_type, NULL);
2860
30
    ADD_TYPE(module, &defdict_spec, state->defdict_type, &PyDict_Type);
2861
30
    ADD_TYPE(module, &dequeiter_spec, state->dequeiter_type, NULL);
2862
30
    ADD_TYPE(module, &dequereviter_spec, state->dequereviter_type, NULL);
2863
30
    ADD_TYPE(module, &tuplegetter_spec, state->tuplegetter_type, NULL);
2864
2865
30
    if (PyModule_AddType(module, &PyODict_Type) < 0) {
2866
0
        return -1;
2867
0
    }
2868
2869
30
    return 0;
2870
30
}
2871
2872
#undef ADD_TYPE
2873
2874
static struct PyModuleDef_Slot collections_slots[] = {
2875
    {Py_mod_exec, collections_exec},
2876
    {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
2877
    {Py_mod_gil, Py_MOD_GIL_NOT_USED},
2878
    {0, NULL}
2879
};
2880
2881
static struct PyModuleDef _collectionsmodule = {
2882
    .m_base = PyModuleDef_HEAD_INIT,
2883
    .m_name = "_collections",
2884
    .m_doc = collections_doc,
2885
    .m_size = sizeof(collections_state),
2886
    .m_methods = collections_methods,
2887
    .m_slots = collections_slots,
2888
    .m_traverse = collections_traverse,
2889
    .m_clear = collections_clear,
2890
    .m_free = collections_free,
2891
};
2892
2893
PyMODINIT_FUNC
2894
PyInit__collections(void)
2895
30
{
2896
30
    return PyModuleDef_Init(&_collectionsmodule);
2897
30
}