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