1 #include "Python.h"
2 #include "structmember.h"
3 
4 /* collections module implementation of a deque() datatype
5    Written and maintained by Raymond D. Hettinger <[email protected]>
6    Copyright (c) 2004 Python Software Foundation.
7    All rights reserved.
8 */
9 
10 /* The block length may be set to any number over 1.  Larger numbers
11  * reduce the number of calls to the memory allocator but take more
12  * memory.  Ideally, BLOCKLEN should be set with an eye to the
13  * length of a cache line.
14  */
15 
16 #define BLOCKLEN 62
17 #define CENTER ((BLOCKLEN - 1) / 2)
18 
19 /* A `dequeobject` is composed of a doubly-linked list of `block` nodes.
20  * This list is not circular (the leftmost block has leftlink==NULL,
21  * and the rightmost block has rightlink==NULL).  A deque d's first
22  * element is at d.leftblock[leftindex] and its last element is at
23  * d.rightblock[rightindex]; note that, unlike as for Python slice
24  * indices, these indices are inclusive on both ends.  By being inclusive
25  * on both ends, algorithms for left and right operations become
26  * symmetrical which simplifies the design.
27  *
28  * The list of blocks is never empty, so d.leftblock and d.rightblock
29  * are never equal to NULL.
30  *
31  * The indices, d.leftindex and d.rightindex are always in the range
32  *     0 <= index < BLOCKLEN.
33  * Their exact relationship is:
34  *     (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex.
35  *
36  * Empty deques have d.len == 0; d.leftblock==d.rightblock;
37  * d.leftindex == CENTER+1; and d.rightindex == CENTER.
38  * Checking for d.len == 0 is the intended way to see whether d is empty.
39  *
40  * Whenever d.leftblock == d.rightblock,
41  *     d.leftindex + d.len - 1 == d.rightindex.
42  *
43  * However, when d.leftblock != d.rightblock, d.leftindex and d.rightindex
44  * become indices into distinct blocks and either may be larger than the
45  * other.
46  */
47 
48 typedef struct BLOCK {
49     struct BLOCK *leftlink;
50     struct BLOCK *rightlink;
51     PyObject *data[BLOCKLEN];
52 } block;
53 
54 #define MAXFREEBLOCKS 10
55 static Py_ssize_t numfreeblocks = 0;
56 static block *freeblocks[MAXFREEBLOCKS];
57 
58 static block *
newblock(block * leftlink,block * rightlink,Py_ssize_t len)59 newblock(block *leftlink, block *rightlink, Py_ssize_t len) {
60     block *b;
61     /* To prevent len from overflowing PY_SSIZE_T_MAX on 64-bit machines, we
62      * refuse to allocate new blocks if the current len is dangerously
63      * close.  There is some extra margin to prevent spurious arithmetic
64      * overflows at various places.  The following check ensures that
65      * the blocks allocated to the deque, in the worst case, can only
66      * have PY_SSIZE_T_MAX-2 entries in total.
67      */
68     if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) {
69         PyErr_SetString(PyExc_OverflowError,
70                         "cannot add more blocks to the deque");
71         return NULL;
72     }
73     if (numfreeblocks) {
74         numfreeblocks -= 1;
75         b = freeblocks[numfreeblocks];
76     } else {
77         b = PyMem_Malloc(sizeof(block));
78         if (b == NULL) {
79             PyErr_NoMemory();
80             return NULL;
81         }
82     }
83     b->leftlink = leftlink;
84     b->rightlink = rightlink;
85     return b;
86 }
87 
88 static void
freeblock(block * b)89 freeblock(block *b)
90 {
91     if (numfreeblocks < MAXFREEBLOCKS) {
92         freeblocks[numfreeblocks] = b;
93         numfreeblocks++;
94     } else {
95         PyMem_Free(b);
96     }
97 }
98 
99 typedef struct {
100     PyObject_HEAD
101     block *leftblock;
102     block *rightblock;
103     Py_ssize_t leftindex;       /* in range(BLOCKLEN) */
104     Py_ssize_t rightindex;      /* in range(BLOCKLEN) */
105     Py_ssize_t len;
106     Py_ssize_t maxlen;
107     long state;         /* incremented whenever the indices move */
108     PyObject *weakreflist; /* List of weak references */
109 } dequeobject;
110 
111 /* The deque's size limit is d.maxlen.  The limit can be zero or positive.
112  * If there is no limit, then d.maxlen == -1.
113  *
114  * After an item is added to a deque, we check to see if the size has grown past
115  * the limit. If it has, we get the size back down to the limit by popping an
116  * item off of the opposite end.  The methods that can trigger this are append(),
117  * appendleft(), extend(), and extendleft().
118  */
119 
120 #define TRIM(d, popfunction)                                    \
121     if (d->maxlen != -1 && d->len > d->maxlen) {                \
122         PyObject *rv = popfunction(d, NULL);                \
123         assert(rv != NULL  &&  d->len <= d->maxlen);        \
124         Py_DECREF(rv);                                      \
125     }
126 
127 static PyTypeObject deque_type;
128 
129 static PyObject *
deque_new(PyTypeObject * type,PyObject * args,PyObject * kwds)130 deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
131 {
132     dequeobject *deque;
133     block *b;
134 
135     /* create dequeobject structure */
136     deque = (dequeobject *)type->tp_alloc(type, 0);
137     if (deque == NULL)
138         return NULL;
139 
140     b = newblock(NULL, NULL, 0);
141     if (b == NULL) {
142         Py_DECREF(deque);
143         return NULL;
144     }
145 
146     assert(BLOCKLEN >= 2);
147     deque->leftblock = b;
148     deque->rightblock = b;
149     deque->leftindex = CENTER + 1;
150     deque->rightindex = CENTER;
151     deque->len = 0;
152     deque->state = 0;
153     deque->weakreflist = NULL;
154     deque->maxlen = -1;
155 
156     return (PyObject *)deque;
157 }
158 
159 static PyObject *
deque_pop(dequeobject * deque,PyObject * unused)160 deque_pop(dequeobject *deque, PyObject *unused)
161 {
162     PyObject *item;
163     block *prevblock;
164 
165     if (deque->len == 0) {
166         PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
167         return NULL;
168     }
169     item = deque->rightblock->data[deque->rightindex];
170     deque->rightindex--;
171     deque->len--;
172     deque->state++;
173 
174     if (deque->rightindex == -1) {
175         if (deque->len == 0) {
176             assert(deque->leftblock == deque->rightblock);
177             assert(deque->leftindex == deque->rightindex+1);
178             /* re-center instead of freeing a block */
179             deque->leftindex = CENTER + 1;
180             deque->rightindex = CENTER;
181         } else {
182             prevblock = deque->rightblock->leftlink;
183             assert(deque->leftblock != deque->rightblock);
184             freeblock(deque->rightblock);
185             prevblock->rightlink = NULL;
186             deque->rightblock = prevblock;
187             deque->rightindex = BLOCKLEN - 1;
188         }
189     }
190     return item;
191 }
192 
193 PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
194 
195 static PyObject *
deque_popleft(dequeobject * deque,PyObject * unused)196 deque_popleft(dequeobject *deque, PyObject *unused)
197 {
198     PyObject *item;
199     block *prevblock;
200 
201     if (deque->len == 0) {
202         PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
203         return NULL;
204     }
205     assert(deque->leftblock != NULL);
206     item = deque->leftblock->data[deque->leftindex];
207     deque->leftindex++;
208     deque->len--;
209     deque->state++;
210 
211     if (deque->leftindex == BLOCKLEN) {
212         if (deque->len == 0) {
213             assert(deque->leftblock == deque->rightblock);
214             assert(deque->leftindex == deque->rightindex+1);
215             /* re-center instead of freeing a block */
216             deque->leftindex = CENTER + 1;
217             deque->rightindex = CENTER;
218         } else {
219             assert(deque->leftblock != deque->rightblock);
220             prevblock = deque->leftblock->rightlink;
221             freeblock(deque->leftblock);
222             assert(prevblock != NULL);
223             prevblock->leftlink = NULL;
224             deque->leftblock = prevblock;
225             deque->leftindex = 0;
226         }
227     }
228     return item;
229 }
230 
231 PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
232 
233 static PyObject *
deque_append(dequeobject * deque,PyObject * item)234 deque_append(dequeobject *deque, PyObject *item)
235 {
236     deque->state++;
237     if (deque->rightindex == BLOCKLEN-1) {
238         block *b = newblock(deque->rightblock, NULL, deque->len);
239         if (b == NULL)
240             return NULL;
241         assert(deque->rightblock->rightlink == NULL);
242         deque->rightblock->rightlink = b;
243         deque->rightblock = b;
244         deque->rightindex = -1;
245     }
246     Py_INCREF(item);
247     deque->len++;
248     deque->rightindex++;
249     deque->rightblock->data[deque->rightindex] = item;
250     TRIM(deque, deque_popleft);
251     Py_RETURN_NONE;
252 }
253 
254 PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
255 
256 static PyObject *
deque_appendleft(dequeobject * deque,PyObject * item)257 deque_appendleft(dequeobject *deque, PyObject *item)
258 {
259     deque->state++;
260     if (deque->leftindex == 0) {
261         block *b = newblock(NULL, deque->leftblock, deque->len);
262         if (b == NULL)
263             return NULL;
264         assert(deque->leftblock->leftlink == NULL);
265         deque->leftblock->leftlink = b;
266         deque->leftblock = b;
267         deque->leftindex = BLOCKLEN;
268     }
269     Py_INCREF(item);
270     deque->len++;
271     deque->leftindex--;
272     deque->leftblock->data[deque->leftindex] = item;
273     TRIM(deque, deque_pop);
274     Py_RETURN_NONE;
275 }
276 
277 PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
278 
279 
280 /* Run an iterator to exhaustion.  Shortcut for
281    the extend/extendleft methods when maxlen == 0. */
282 static PyObject*
consume_iterator(PyObject * it)283 consume_iterator(PyObject *it)
284 {
285     PyObject *item;
286 
287     while ((item = PyIter_Next(it)) != NULL) {
288         Py_DECREF(item);
289     }
290     Py_DECREF(it);
291     if (PyErr_Occurred())
292         return NULL;
293     Py_RETURN_NONE;
294 }
295 
296 static PyObject *
deque_extend(dequeobject * deque,PyObject * iterable)297 deque_extend(dequeobject *deque, PyObject *iterable)
298 {
299     PyObject *it, *item;
300 
301     /* Handle case where id(deque) == id(iterable) */
302     if ((PyObject *)deque == iterable) {
303         PyObject *result;
304         PyObject *s = PySequence_List(iterable);
305         if (s == NULL)
306             return NULL;
307         result = deque_extend(deque, s);
308         Py_DECREF(s);
309         return result;
310     }
311 
312     it = PyObject_GetIter(iterable);
313     if (it == NULL)
314         return NULL;
315 
316     if (deque->maxlen == 0)
317         return consume_iterator(it);
318 
319     while ((item = PyIter_Next(it)) != NULL) {
320         deque->state++;
321         if (deque->rightindex == BLOCKLEN-1) {
322             block *b = newblock(deque->rightblock, NULL,
323                                 deque->len);
324             if (b == NULL) {
325                 Py_DECREF(item);
326                 Py_DECREF(it);
327                 return NULL;
328             }
329             assert(deque->rightblock->rightlink == NULL);
330             deque->rightblock->rightlink = b;
331             deque->rightblock = b;
332             deque->rightindex = -1;
333         }
334         deque->len++;
335         deque->rightindex++;
336         deque->rightblock->data[deque->rightindex] = item;
337         TRIM(deque, deque_popleft);
338     }
339     Py_DECREF(it);
340     if (PyErr_Occurred())
341         return NULL;
342     Py_RETURN_NONE;
343 }
344 
345 PyDoc_STRVAR(extend_doc,
346 "Extend the right side of the deque with elements from the iterable");
347 
348 static PyObject *
deque_extendleft(dequeobject * deque,PyObject * iterable)349 deque_extendleft(dequeobject *deque, PyObject *iterable)
350 {
351     PyObject *it, *item;
352 
353     /* Handle case where id(deque) == id(iterable) */
354     if ((PyObject *)deque == iterable) {
355         PyObject *result;
356         PyObject *s = PySequence_List(iterable);
357         if (s == NULL)
358             return NULL;
359         result = deque_extendleft(deque, s);
360         Py_DECREF(s);
361         return result;
362     }
363 
364     it = PyObject_GetIter(iterable);
365     if (it == NULL)
366         return NULL;
367 
368     if (deque->maxlen == 0)
369         return consume_iterator(it);
370 
371     while ((item = PyIter_Next(it)) != NULL) {
372         deque->state++;
373         if (deque->leftindex == 0) {
374             block *b = newblock(NULL, deque->leftblock,
375                                 deque->len);
376             if (b == NULL) {
377                 Py_DECREF(item);
378                 Py_DECREF(it);
379                 return NULL;
380             }
381             assert(deque->leftblock->leftlink == NULL);
382             deque->leftblock->leftlink = b;
383             deque->leftblock = b;
384             deque->leftindex = BLOCKLEN;
385         }
386         deque->len++;
387         deque->leftindex--;
388         deque->leftblock->data[deque->leftindex] = item;
389         TRIM(deque, deque_pop);
390     }
391     Py_DECREF(it);
392     if (PyErr_Occurred())
393         return NULL;
394     Py_RETURN_NONE;
395 }
396 
397 PyDoc_STRVAR(extendleft_doc,
398 "Extend the left side of the deque with elements from the iterable");
399 
400 static PyObject *
deque_inplace_concat(dequeobject * deque,PyObject * other)401 deque_inplace_concat(dequeobject *deque, PyObject *other)
402 {
403     PyObject *result;
404 
405     result = deque_extend(deque, other);
406     if (result == NULL)
407         return result;
408     Py_DECREF(result);
409     Py_INCREF(deque);
410     return (PyObject *)deque;
411 }
412 
413 static int
_deque_rotate(dequeobject * deque,Py_ssize_t n)414 _deque_rotate(dequeobject *deque, Py_ssize_t n)
415 {
416     Py_ssize_t i, len=deque->len, halflen=(len+1)>>1;
417     PyObject *item, *rv;
418 
419     if (len == 0)
420         return 0;
421     if (n > halflen || n < -halflen) {
422         n %= len;
423         if (n > halflen)
424             n -= len;
425         else if (n < -halflen)
426             n += len;
427     }
428 
429     for (i=0 ; i<n ; i++) {
430         item = deque_pop(deque, NULL);
431         assert (item != NULL);
432         rv = deque_appendleft(deque, item);
433         Py_DECREF(item);
434         if (rv == NULL)
435             return -1;
436         Py_DECREF(rv);
437     }
438     for (i=0 ; i>n ; i--) {
439         item = deque_popleft(deque, NULL);
440         assert (item != NULL);
441         rv = deque_append(deque, item);
442         Py_DECREF(item);
443         if (rv == NULL)
444             return -1;
445         Py_DECREF(rv);
446     }
447     return 0;
448 }
449 
450 static PyObject *
deque_rotate(dequeobject * deque,PyObject * args)451 deque_rotate(dequeobject *deque, PyObject *args)
452 {
453     Py_ssize_t n=1;
454 
455     if (!PyArg_ParseTuple(args, "|n:rotate", &n))
456         return NULL;
457     if (_deque_rotate(deque, n) == 0)
458         Py_RETURN_NONE;
459     return NULL;
460 }
461 
462 PyDoc_STRVAR(rotate_doc,
463 "Rotate the deque n steps to the right (default n=1).  If n is negative, rotates left.");
464 
465 static PyObject *
deque_reverse(dequeobject * deque,PyObject * unused)466 deque_reverse(dequeobject *deque, PyObject *unused)
467 {
468     block *leftblock = deque->leftblock;
469     block *rightblock = deque->rightblock;
470     Py_ssize_t leftindex = deque->leftindex;
471     Py_ssize_t rightindex = deque->rightindex;
472     Py_ssize_t n = (deque->len)/2;
473     Py_ssize_t i;
474     PyObject *tmp;
475 
476     for (i=0 ; i<n ; i++) {
477         /* Validate that pointers haven't met in the middle */
478         assert(leftblock != rightblock || leftindex < rightindex);
479 
480         /* Swap */
481         tmp = leftblock->data[leftindex];
482         leftblock->data[leftindex] = rightblock->data[rightindex];
483         rightblock->data[rightindex] = tmp;
484 
485         /* Advance left block/index pair */
486         leftindex++;
487         if (leftindex == BLOCKLEN) {
488             if (leftblock->rightlink == NULL)
489                 break;
490             leftblock = leftblock->rightlink;
491             leftindex = 0;
492         }
493 
494         /* Step backwards with the right block/index pair */
495         rightindex--;
496         if (rightindex == -1) {
497             if (rightblock->leftlink == NULL)
498                 break;
499             rightblock = rightblock->leftlink;
500             rightindex = BLOCKLEN - 1;
501         }
502     }
503     Py_RETURN_NONE;
504 }
505 
506 PyDoc_STRVAR(reverse_doc,
507 "D.reverse() -- reverse *IN PLACE*");
508 
509 static PyObject *
deque_count(dequeobject * deque,PyObject * v)510 deque_count(dequeobject *deque, PyObject *v)
511 {
512     block *leftblock = deque->leftblock;
513     Py_ssize_t leftindex = deque->leftindex;
514     Py_ssize_t n = deque->len;
515     Py_ssize_t i;
516     Py_ssize_t count = 0;
517     PyObject *item;
518     long start_state = deque->state;
519     int cmp;
520 
521     for (i=0 ; i<n ; i++) {
522         item = leftblock->data[leftindex];
523         cmp = PyObject_RichCompareBool(item, v, Py_EQ);
524         if (cmp > 0)
525             count++;
526         else if (cmp < 0)
527             return NULL;
528 
529         if (start_state != deque->state) {
530             PyErr_SetString(PyExc_RuntimeError,
531                             "deque mutated during iteration");
532             return NULL;
533         }
534 
535         /* Advance left block/index pair */
536         leftindex++;
537         if (leftindex == BLOCKLEN) {
538             if (leftblock->rightlink == NULL)  /* can occur when i==n-1 */
539                 break;
540             leftblock = leftblock->rightlink;
541             leftindex = 0;
542         }
543     }
544     return PyInt_FromSsize_t(count);
545 }
546 
547 PyDoc_STRVAR(count_doc,
548 "D.count(value) -> integer -- return number of occurrences of value");
549 
550 static Py_ssize_t
deque_len(dequeobject * deque)551 deque_len(dequeobject *deque)
552 {
553     return deque->len;
554 }
555 
556 static PyObject *
deque_remove(dequeobject * deque,PyObject * value)557 deque_remove(dequeobject *deque, PyObject *value)
558 {
559     Py_ssize_t i, n=deque->len;
560 
561     for (i=0 ; i<n ; i++) {
562         PyObject *item = deque->leftblock->data[deque->leftindex];
563         int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
564 
565         if (deque->len != n) {
566             PyErr_SetString(PyExc_IndexError,
567                 "deque mutated during remove().");
568             return NULL;
569         }
570         if (cmp > 0) {
571             PyObject *tgt = deque_popleft(deque, NULL);
572             assert (tgt != NULL);
573             Py_DECREF(tgt);
574             if (_deque_rotate(deque, i) == -1)
575                 return NULL;
576             Py_RETURN_NONE;
577         }
578         else if (cmp < 0) {
579             _deque_rotate(deque, i);
580             return NULL;
581         }
582         _deque_rotate(deque, -1);
583     }
584     PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
585     return NULL;
586 }
587 
588 PyDoc_STRVAR(remove_doc,
589 "D.remove(value) -- remove first occurrence of value.");
590 
591 static int
deque_clear(dequeobject * deque)592 deque_clear(dequeobject *deque)
593 {
594     PyObject *item;
595 
596     while (deque->len) {
597         item = deque_pop(deque, NULL);
598         assert (item != NULL);
599         Py_DECREF(item);
600     }
601     assert(deque->leftblock == deque->rightblock &&
602            deque->leftindex - 1 == deque->rightindex &&
603            deque->len == 0);
604     return 0;
605 }
606 
607 static PyObject *
deque_item(dequeobject * deque,Py_ssize_t i)608 deque_item(dequeobject *deque, Py_ssize_t i)
609 {
610     block *b;
611     PyObject *item;
612     Py_ssize_t n, index=i;
613 
614     if (i < 0 || i >= deque->len) {
615         PyErr_SetString(PyExc_IndexError,
616                         "deque index out of range");
617         return NULL;
618     }
619 
620     if (i == 0) {
621         i = deque->leftindex;
622         b = deque->leftblock;
623     } else if (i == deque->len - 1) {
624         i = deque->rightindex;
625         b = deque->rightblock;
626     } else {
627         i += deque->leftindex;
628         n = i / BLOCKLEN;
629         i %= BLOCKLEN;
630         if (index < (deque->len >> 1)) {
631             b = deque->leftblock;
632             while (n--)
633                 b = b->rightlink;
634         } else {
635             n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
636             b = deque->rightblock;
637             while (n--)
638                 b = b->leftlink;
639         }
640     }
641     item = b->data[i];
642     Py_INCREF(item);
643     return item;
644 }
645 
646 /* delitem() implemented in terms of rotate for simplicity and reasonable
647    performance near the end points.  If for some reason this method becomes
648    popular, it is not hard to re-implement this using direct data movement
649    (similar to code in list slice assignment) and achieve a two or threefold
650    performance boost.
651 */
652 
653 static int
deque_del_item(dequeobject * deque,Py_ssize_t i)654 deque_del_item(dequeobject *deque, Py_ssize_t i)
655 {
656     PyObject *item;
657 
658     assert (i >= 0 && i < deque->len);
659     if (_deque_rotate(deque, -i) == -1)
660         return -1;
661 
662     item = deque_popleft(deque, NULL);
663     assert (item != NULL);
664     Py_DECREF(item);
665 
666     return _deque_rotate(deque, i);
667 }
668 
669 static int
deque_ass_item(dequeobject * deque,Py_ssize_t i,PyObject * v)670 deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
671 {
672     PyObject *old_value;
673     block *b;
674     Py_ssize_t n, len=deque->len, halflen=(len+1)>>1, index=i;
675 
676     if (i < 0 || i >= len) {
677         PyErr_SetString(PyExc_IndexError,
678                         "deque index out of range");
679         return -1;
680     }
681     if (v == NULL)
682         return deque_del_item(deque, i);
683 
684     i += deque->leftindex;
685     n = i / BLOCKLEN;
686     i %= BLOCKLEN;
687     if (index <= halflen) {
688         b = deque->leftblock;
689         while (n--)
690             b = b->rightlink;
691     } else {
692         n = (deque->leftindex + len - 1) / BLOCKLEN - n;
693         b = deque->rightblock;
694         while (n--)
695             b = b->leftlink;
696     }
697     Py_INCREF(v);
698     old_value = b->data[i];
699     b->data[i] = v;
700     Py_DECREF(old_value);
701     return 0;
702 }
703 
704 static PyObject *
deque_clearmethod(dequeobject * deque)705 deque_clearmethod(dequeobject *deque)
706 {
707     int rv;
708 
709     rv = deque_clear(deque);
710     assert (rv != -1);
711     Py_RETURN_NONE;
712 }
713 
714 PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
715 
716 static void
deque_dealloc(dequeobject * deque)717 deque_dealloc(dequeobject *deque)
718 {
719     PyObject_GC_UnTrack(deque);
720     if (deque->weakreflist != NULL)
721         PyObject_ClearWeakRefs((PyObject *) deque);
722     if (deque->leftblock != NULL) {
723         deque_clear(deque);
724         assert(deque->leftblock != NULL);
725         freeblock(deque->leftblock);
726     }
727     deque->leftblock = NULL;
728     deque->rightblock = NULL;
729     Py_TYPE(deque)->tp_free(deque);
730 }
731 
732 static int
deque_traverse(dequeobject * deque,visitproc visit,void * arg)733 deque_traverse(dequeobject *deque, visitproc visit, void *arg)
734 {
735     block *b;
736     PyObject *item;
737     Py_ssize_t index;
738     Py_ssize_t indexlo = deque->leftindex;
739 
740     for (b = deque->leftblock; b != NULL; b = b->rightlink) {
741         const Py_ssize_t indexhi = b == deque->rightblock ?
742                                  deque->rightindex :
743                      BLOCKLEN - 1;
744 
745         for (index = indexlo; index <= indexhi; ++index) {
746             item = b->data[index];
747             Py_VISIT(item);
748         }
749         indexlo = 0;
750     }
751     return 0;
752 }
753 
754 static PyObject *
deque_copy(PyObject * deque)755 deque_copy(PyObject *deque)
756 {
757     if (((dequeobject *)deque)->maxlen == -1)
758         return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
759     else
760         return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
761             deque, ((dequeobject *)deque)->maxlen, NULL);
762 }
763 
764 PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
765 
766 static PyObject *
deque_reduce(dequeobject * deque)767 deque_reduce(dequeobject *deque)
768 {
769     PyObject *dict, *result, *aslist;
770 
771     dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");
772     if (dict == NULL)
773         PyErr_Clear();
774     aslist = PySequence_List((PyObject *)deque);
775     if (aslist == NULL) {
776         Py_XDECREF(dict);
777         return NULL;
778     }
779     if (dict == NULL) {
780         if (deque->maxlen == -1)
781             result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
782         else
783             result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
784     } else {
785         if (deque->maxlen == -1)
786             result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
787         else
788             result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
789     }
790     Py_XDECREF(dict);
791     Py_DECREF(aslist);
792     return result;
793 }
794 
795 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
796 
797 static PyObject *
deque_repr(PyObject * deque)798 deque_repr(PyObject *deque)
799 {
800     PyObject *aslist, *result, *fmt;
801     int i;
802 
803     i = Py_ReprEnter(deque);
804     if (i != 0) {
805         if (i < 0)
806             return NULL;
807         return PyString_FromString("[...]");
808     }
809 
810     aslist = PySequence_List(deque);
811     if (aslist == NULL) {
812         Py_ReprLeave(deque);
813         return NULL;
814     }
815     if (((dequeobject *)deque)->maxlen != -1)
816         fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)",
817                                 ((dequeobject *)deque)->maxlen);
818     else
819         fmt = PyString_FromString("deque(%r)");
820     if (fmt == NULL) {
821         Py_DECREF(aslist);
822         Py_ReprLeave(deque);
823         return NULL;
824     }
825     result = PyString_Format(fmt, aslist);
826     Py_DECREF(fmt);
827     Py_DECREF(aslist);
828     Py_ReprLeave(deque);
829     return result;
830 }
831 
832 static int
deque_tp_print(PyObject * deque,FILE * fp,int flags)833 deque_tp_print(PyObject *deque, FILE *fp, int flags)
834 {
835     PyObject *it, *item;
836     char *emit = "";            /* No separator emitted on first pass */
837     char *separator = ", ";
838     int i;
839 
840     i = Py_ReprEnter(deque);
841     if (i != 0) {
842         if (i < 0)
843             return i;
844         Py_BEGIN_ALLOW_THREADS
845         fputs("[...]", fp);
846         Py_END_ALLOW_THREADS
847         return 0;
848     }
849 
850     it = PyObject_GetIter(deque);
851     if (it == NULL)
852         return -1;
853 
854     Py_BEGIN_ALLOW_THREADS
855     fputs("deque([", fp);
856     Py_END_ALLOW_THREADS
857     while ((item = PyIter_Next(it)) != NULL) {
858         Py_BEGIN_ALLOW_THREADS
859         fputs(emit, fp);
860         Py_END_ALLOW_THREADS
861         emit = separator;
862         if (PyObject_Print(item, fp, 0) != 0) {
863             Py_DECREF(item);
864             Py_DECREF(it);
865             Py_ReprLeave(deque);
866             return -1;
867         }
868         Py_DECREF(item);
869     }
870     Py_ReprLeave(deque);
871     Py_DECREF(it);
872     if (PyErr_Occurred())
873         return -1;
874 
875     Py_BEGIN_ALLOW_THREADS
876     if (((dequeobject *)deque)->maxlen == -1)
877         fputs("])", fp);
878     else
879         fprintf(fp, "], maxlen=%" PY_FORMAT_SIZE_T "d)", ((dequeobject *)deque)->maxlen);
880     Py_END_ALLOW_THREADS
881     return 0;
882 }
883 
884 static PyObject *
deque_richcompare(PyObject * v,PyObject * w,int op)885 deque_richcompare(PyObject *v, PyObject *w, int op)
886 {
887     PyObject *it1=NULL, *it2=NULL, *x, *y;
888     Py_ssize_t vs, ws;
889     int b, cmp=-1;
890 
891     if (!PyObject_TypeCheck(v, &deque_type) ||
892         !PyObject_TypeCheck(w, &deque_type)) {
893         Py_INCREF(Py_NotImplemented);
894         return Py_NotImplemented;
895     }
896 
897     /* Shortcuts */
898     vs = ((dequeobject *)v)->len;
899     ws = ((dequeobject *)w)->len;
900     if (op == Py_EQ) {
901         if (v == w)
902             Py_RETURN_TRUE;
903         if (vs != ws)
904             Py_RETURN_FALSE;
905     }
906     if (op == Py_NE) {
907         if (v == w)
908             Py_RETURN_FALSE;
909         if (vs != ws)
910             Py_RETURN_TRUE;
911     }
912 
913     /* Search for the first index where items are different */
914     it1 = PyObject_GetIter(v);
915     if (it1 == NULL)
916         goto done;
917     it2 = PyObject_GetIter(w);
918     if (it2 == NULL)
919         goto done;
920     for (;;) {
921         x = PyIter_Next(it1);
922         if (x == NULL && PyErr_Occurred())
923             goto done;
924         y = PyIter_Next(it2);
925         if (x == NULL || y == NULL)
926             break;
927         b = PyObject_RichCompareBool(x, y, Py_EQ);
928         if (b == 0) {
929             cmp = PyObject_RichCompareBool(x, y, op);
930             Py_DECREF(x);
931             Py_DECREF(y);
932             goto done;
933         }
934         Py_DECREF(x);
935         Py_DECREF(y);
936         if (b == -1)
937             goto done;
938     }
939     /* We reached the end of one deque or both */
940     Py_XDECREF(x);
941     Py_XDECREF(y);
942     if (PyErr_Occurred())
943         goto done;
944     switch (op) {
945     case Py_LT: cmp = y != NULL; break;  /* if w was longer */
946     case Py_LE: cmp = x == NULL; break;  /* if v was not longer */
947     case Py_EQ: cmp = x == y;    break;  /* if we reached the end of both */
948     case Py_NE: cmp = x != y;    break;  /* if one deque continues */
949     case Py_GT: cmp = x != NULL; break;  /* if v was longer */
950     case Py_GE: cmp = y == NULL; break;  /* if w was not longer */
951     }
952 
953 done:
954     Py_XDECREF(it1);
955     Py_XDECREF(it2);
956     if (cmp == 1)
957         Py_RETURN_TRUE;
958     if (cmp == 0)
959         Py_RETURN_FALSE;
960     return NULL;
961 }
962 
963 static int
deque_init(dequeobject * deque,PyObject * args,PyObject * kwdargs)964 deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
965 {
966     PyObject *iterable = NULL;
967     PyObject *maxlenobj = NULL;
968     Py_ssize_t maxlen = -1;
969     char *kwlist[] = {"iterable", "maxlen", 0};
970 
971     if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
972         return -1;
973     if (maxlenobj != NULL && maxlenobj != Py_None) {
974         maxlen = PyInt_AsSsize_t(maxlenobj);
975         if (maxlen == -1 && PyErr_Occurred())
976             return -1;
977         if (maxlen < 0) {
978             PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
979             return -1;
980         }
981     }
982     deque->maxlen = maxlen;
983     deque_clear(deque);
984     if (iterable != NULL) {
985         PyObject *rv = deque_extend(deque, iterable);
986         if (rv == NULL)
987             return -1;
988         Py_DECREF(rv);
989     }
990     return 0;
991 }
992 
993 static PyObject *
deque_get_maxlen(dequeobject * deque)994 deque_get_maxlen(dequeobject *deque)
995 {
996     if (deque->maxlen == -1)
997         Py_RETURN_NONE;
998     return PyInt_FromSsize_t(deque->maxlen);
999 }
1000 
1001 static PyGetSetDef deque_getset[] = {
1002     {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1003      "maximum size of a deque or None if unbounded"},
1004     {0}
1005 };
1006 
1007 static PySequenceMethods deque_as_sequence = {
1008     (lenfunc)deque_len,                 /* sq_length */
1009     0,                                  /* sq_concat */
1010     0,                                  /* sq_repeat */
1011     (ssizeargfunc)deque_item,           /* sq_item */
1012     0,                                  /* sq_slice */
1013     (ssizeobjargproc)deque_ass_item,            /* sq_ass_item */
1014     0,                                  /* sq_ass_slice */
1015     0,                                  /* sq_contains */
1016     (binaryfunc)deque_inplace_concat,           /* sq_inplace_concat */
1017     0,                                  /* sq_inplace_repeat */
1018 
1019 };
1020 
1021 /* deque object ********************************************************/
1022 
1023 static PyObject *deque_iter(dequeobject *deque);
1024 static PyObject *deque_reviter(dequeobject *deque);
1025 PyDoc_STRVAR(reversed_doc,
1026     "D.__reversed__() -- return a reverse iterator over the deque");
1027 
1028 static PyMethodDef deque_methods[] = {
1029     {"append",                  (PyCFunction)deque_append,
1030         METH_O,                  append_doc},
1031     {"appendleft",              (PyCFunction)deque_appendleft,
1032         METH_O,                  appendleft_doc},
1033     {"clear",                   (PyCFunction)deque_clearmethod,
1034         METH_NOARGS,             clear_doc},
1035     {"__copy__",                (PyCFunction)deque_copy,
1036         METH_NOARGS,             copy_doc},
1037     {"count",                   (PyCFunction)deque_count,
1038         METH_O,                         count_doc},
1039     {"extend",                  (PyCFunction)deque_extend,
1040         METH_O,                  extend_doc},
1041     {"extendleft",              (PyCFunction)deque_extendleft,
1042         METH_O,                  extendleft_doc},
1043     {"pop",                     (PyCFunction)deque_pop,
1044         METH_NOARGS,             pop_doc},
1045     {"popleft",                 (PyCFunction)deque_popleft,
1046         METH_NOARGS,             popleft_doc},
1047     {"__reduce__",      (PyCFunction)deque_reduce,
1048         METH_NOARGS,             reduce_doc},
1049     {"remove",                  (PyCFunction)deque_remove,
1050         METH_O,                  remove_doc},
1051     {"__reversed__",            (PyCFunction)deque_reviter,
1052         METH_NOARGS,             reversed_doc},
1053     {"reverse",                 (PyCFunction)deque_reverse,
1054         METH_NOARGS,             reverse_doc},
1055     {"rotate",                  (PyCFunction)deque_rotate,
1056         METH_VARARGS,           rotate_doc},
1057     {NULL,              NULL}   /* sentinel */
1058 };
1059 
1060 PyDoc_STRVAR(deque_doc,
1061 "deque(iterable[, maxlen]) --> deque object\n\
1062 \n\
1063 Build an ordered collection with optimized access from its endpoints.");
1064 
1065 static PyTypeObject deque_type = {
1066     PyVarObject_HEAD_INIT(NULL, 0)
1067     "collections.deque",                /* tp_name */
1068     sizeof(dequeobject),                /* tp_basicsize */
1069     0,                                  /* tp_itemsize */
1070     /* methods */
1071     (destructor)deque_dealloc,          /* tp_dealloc */
1072     deque_tp_print,                     /* tp_print */
1073     0,                                  /* tp_getattr */
1074     0,                                  /* tp_setattr */
1075     0,                                  /* tp_compare */
1076     deque_repr,                         /* tp_repr */
1077     0,                                  /* tp_as_number */
1078     &deque_as_sequence,                 /* tp_as_sequence */
1079     0,                                  /* tp_as_mapping */
1080     (hashfunc)PyObject_HashNotImplemented,      /* tp_hash */
1081     0,                                  /* tp_call */
1082     0,                                  /* tp_str */
1083     PyObject_GenericGetAttr,            /* tp_getattro */
1084     0,                                  /* tp_setattro */
1085     0,                                  /* tp_as_buffer */
1086     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1087         Py_TPFLAGS_HAVE_WEAKREFS,               /* tp_flags */
1088     deque_doc,                          /* tp_doc */
1089     (traverseproc)deque_traverse,       /* tp_traverse */
1090     (inquiry)deque_clear,               /* tp_clear */
1091     (richcmpfunc)deque_richcompare,     /* tp_richcompare */
1092     offsetof(dequeobject, weakreflist),         /* tp_weaklistoffset*/
1093     (getiterfunc)deque_iter,            /* tp_iter */
1094     0,                                  /* tp_iternext */
1095     deque_methods,                      /* tp_methods */
1096     0,                                  /* tp_members */
1097     deque_getset,       /* tp_getset */
1098     0,                                  /* tp_base */
1099     0,                                  /* tp_dict */
1100     0,                                  /* tp_descr_get */
1101     0,                                  /* tp_descr_set */
1102     0,                                  /* tp_dictoffset */
1103     (initproc)deque_init,               /* tp_init */
1104     PyType_GenericAlloc,                /* tp_alloc */
1105     deque_new,                          /* tp_new */
1106     PyObject_GC_Del,                    /* tp_free */
1107 };
1108 
1109 /*********************** Deque Iterator **************************/
1110 
1111 typedef struct {
1112     PyObject_HEAD
1113     Py_ssize_t index;
1114     block *b;
1115     dequeobject *deque;
1116     long state;         /* state when the iterator is created */
1117     Py_ssize_t counter;    /* number of items remaining for iteration */
1118 } dequeiterobject;
1119 
1120 static PyTypeObject dequeiter_type;
1121 
1122 static PyObject *
deque_iter(dequeobject * deque)1123 deque_iter(dequeobject *deque)
1124 {
1125     dequeiterobject *it;
1126 
1127     it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1128     if (it == NULL)
1129         return NULL;
1130     it->b = deque->leftblock;
1131     it->index = deque->leftindex;
1132     Py_INCREF(deque);
1133     it->deque = deque;
1134     it->state = deque->state;
1135     it->counter = deque->len;
1136     PyObject_GC_Track(it);
1137     return (PyObject *)it;
1138 }
1139 
1140 static int
dequeiter_traverse(dequeiterobject * dio,visitproc visit,void * arg)1141 dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1142 {
1143     Py_VISIT(dio->deque);
1144     return 0;
1145 }
1146 
1147 static void
dequeiter_dealloc(dequeiterobject * dio)1148 dequeiter_dealloc(dequeiterobject *dio)
1149 {
1150     Py_XDECREF(dio->deque);
1151     PyObject_GC_Del(dio);
1152 }
1153 
1154 static PyObject *
dequeiter_next(dequeiterobject * it)1155 dequeiter_next(dequeiterobject *it)
1156 {
1157     PyObject *item;
1158 
1159     if (it->deque->state != it->state) {
1160         it->counter = 0;
1161         PyErr_SetString(PyExc_RuntimeError,
1162                         "deque mutated during iteration");
1163         return NULL;
1164     }
1165     if (it->counter == 0)
1166         return NULL;
1167     assert (!(it->b == it->deque->rightblock &&
1168               it->index > it->deque->rightindex));
1169 
1170     item = it->b->data[it->index];
1171     it->index++;
1172     it->counter--;
1173     if (it->index == BLOCKLEN && it->counter > 0) {
1174         assert (it->b->rightlink != NULL);
1175         it->b = it->b->rightlink;
1176         it->index = 0;
1177     }
1178     Py_INCREF(item);
1179     return item;
1180 }
1181 
1182 static PyObject *
dequeiter_len(dequeiterobject * it)1183 dequeiter_len(dequeiterobject *it)
1184 {
1185     return PyInt_FromLong(it->counter);
1186 }
1187 
1188 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
1189 
1190 static PyMethodDef dequeiter_methods[] = {
1191     {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
1192     {NULL,              NULL}           /* sentinel */
1193 };
1194 
1195 static PyTypeObject dequeiter_type = {
1196     PyVarObject_HEAD_INIT(NULL, 0)
1197     "deque_iterator",                           /* tp_name */
1198     sizeof(dequeiterobject),                    /* tp_basicsize */
1199     0,                                          /* tp_itemsize */
1200     /* methods */
1201     (destructor)dequeiter_dealloc,              /* tp_dealloc */
1202     0,                                          /* tp_print */
1203     0,                                          /* tp_getattr */
1204     0,                                          /* tp_setattr */
1205     0,                                          /* tp_compare */
1206     0,                                          /* tp_repr */
1207     0,                                          /* tp_as_number */
1208     0,                                          /* tp_as_sequence */
1209     0,                                          /* tp_as_mapping */
1210     0,                                          /* tp_hash */
1211     0,                                          /* tp_call */
1212     0,                                          /* tp_str */
1213     PyObject_GenericGetAttr,                    /* tp_getattro */
1214     0,                                          /* tp_setattro */
1215     0,                                          /* tp_as_buffer */
1216     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1217     0,                                          /* tp_doc */
1218     (traverseproc)dequeiter_traverse,           /* tp_traverse */
1219     0,                                          /* tp_clear */
1220     0,                                          /* tp_richcompare */
1221     0,                                          /* tp_weaklistoffset */
1222     PyObject_SelfIter,                          /* tp_iter */
1223     (iternextfunc)dequeiter_next,               /* tp_iternext */
1224     dequeiter_methods,                          /* tp_methods */
1225     0,
1226 };
1227 
1228 /*********************** Deque Reverse Iterator **************************/
1229 
1230 static PyTypeObject dequereviter_type;
1231 
1232 static PyObject *
deque_reviter(dequeobject * deque)1233 deque_reviter(dequeobject *deque)
1234 {
1235     dequeiterobject *it;
1236 
1237     it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1238     if (it == NULL)
1239         return NULL;
1240     it->b = deque->rightblock;
1241     it->index = deque->rightindex;
1242     Py_INCREF(deque);
1243     it->deque = deque;
1244     it->state = deque->state;
1245     it->counter = deque->len;
1246     PyObject_GC_Track(it);
1247     return (PyObject *)it;
1248 }
1249 
1250 static PyObject *
dequereviter_next(dequeiterobject * it)1251 dequereviter_next(dequeiterobject *it)
1252 {
1253     PyObject *item;
1254     if (it->counter == 0)
1255         return NULL;
1256 
1257     if (it->deque->state != it->state) {
1258         it->counter = 0;
1259         PyErr_SetString(PyExc_RuntimeError,
1260                         "deque mutated during iteration");
1261         return NULL;
1262     }
1263     assert (!(it->b == it->deque->leftblock &&
1264               it->index < it->deque->leftindex));
1265 
1266     item = it->b->data[it->index];
1267     it->index--;
1268     it->counter--;
1269     if (it->index == -1 && it->counter > 0) {
1270         assert (it->b->leftlink != NULL);
1271         it->b = it->b->leftlink;
1272         it->index = BLOCKLEN - 1;
1273     }
1274     Py_INCREF(item);
1275     return item;
1276 }
1277 
1278 static PyTypeObject dequereviter_type = {
1279     PyVarObject_HEAD_INIT(NULL, 0)
1280     "deque_reverse_iterator",                   /* tp_name */
1281     sizeof(dequeiterobject),                    /* tp_basicsize */
1282     0,                                          /* tp_itemsize */
1283     /* methods */
1284     (destructor)dequeiter_dealloc,              /* tp_dealloc */
1285     0,                                          /* tp_print */
1286     0,                                          /* tp_getattr */
1287     0,                                          /* tp_setattr */
1288     0,                                          /* tp_compare */
1289     0,                                          /* tp_repr */
1290     0,                                          /* tp_as_number */
1291     0,                                          /* tp_as_sequence */
1292     0,                                          /* tp_as_mapping */
1293     0,                                          /* tp_hash */
1294     0,                                          /* tp_call */
1295     0,                                          /* tp_str */
1296     PyObject_GenericGetAttr,                    /* tp_getattro */
1297     0,                                          /* tp_setattro */
1298     0,                                          /* tp_as_buffer */
1299     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1300     0,                                          /* tp_doc */
1301     (traverseproc)dequeiter_traverse,           /* tp_traverse */
1302     0,                                          /* tp_clear */
1303     0,                                          /* tp_richcompare */
1304     0,                                          /* tp_weaklistoffset */
1305     PyObject_SelfIter,                          /* tp_iter */
1306     (iternextfunc)dequereviter_next,            /* tp_iternext */
1307     dequeiter_methods,                          /* tp_methods */
1308     0,
1309 };
1310 
1311 /* defaultdict type *********************************************************/
1312 
1313 typedef struct {
1314     PyDictObject dict;
1315     PyObject *default_factory;
1316 } defdictobject;
1317 
1318 static PyTypeObject defdict_type; /* Forward */
1319 
1320 PyDoc_STRVAR(defdict_missing_doc,
1321 "__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
1322   if self.default_factory is None: raise KeyError((key,))\n\
1323   self[key] = value = self.default_factory()\n\
1324   return value\n\
1325 ");
1326 
1327 static PyObject *
defdict_missing(defdictobject * dd,PyObject * key)1328 defdict_missing(defdictobject *dd, PyObject *key)
1329 {
1330     PyObject *factory = dd->default_factory;
1331     PyObject *value;
1332     if (factory == NULL || factory == Py_None) {
1333         /* XXX Call dict.__missing__(key) */
1334         PyObject *tup;
1335         tup = PyTuple_Pack(1, key);
1336         if (!tup) return NULL;
1337         PyErr_SetObject(PyExc_KeyError, tup);
1338         Py_DECREF(tup);
1339         return NULL;
1340     }
1341     value = PyEval_CallObject(factory, NULL);
1342     if (value == NULL)
1343         return value;
1344     if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1345         Py_DECREF(value);
1346         return NULL;
1347     }
1348     return value;
1349 }
1350 
1351 PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1352 
1353 static PyObject *
defdict_copy(defdictobject * dd)1354 defdict_copy(defdictobject *dd)
1355 {
1356     /* This calls the object's class.  That only works for subclasses
1357        whose class constructor has the same signature.  Subclasses that
1358        define a different constructor signature must override copy().
1359     */
1360 
1361     if (dd->default_factory == NULL)
1362         return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1363     return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1364                                         dd->default_factory, dd, NULL);
1365 }
1366 
1367 static PyObject *
defdict_reduce(defdictobject * dd)1368 defdict_reduce(defdictobject *dd)
1369 {
1370     /* __reduce__ must return a 5-tuple as follows:
1371 
1372        - factory function
1373        - tuple of args for the factory function
1374        - additional state (here None)
1375        - sequence iterator (here None)
1376        - dictionary iterator (yielding successive (key, value) pairs
1377 
1378        This API is used by pickle.py and copy.py.
1379 
1380        For this to be useful with pickle.py, the default_factory
1381        must be picklable; e.g., None, a built-in, or a global
1382        function in a module or package.
1383 
1384        Both shallow and deep copying are supported, but for deep
1385        copying, the default_factory must be deep-copyable; e.g. None,
1386        or a built-in (functions are not copyable at this time).
1387 
1388        This only works for subclasses as long as their constructor
1389        signature is compatible; the first argument must be the
1390        optional default_factory, defaulting to None.
1391     */
1392     PyObject *args;
1393     PyObject *items;
1394     PyObject *result;
1395     if (dd->default_factory == NULL || dd->default_factory == Py_None)
1396         args = PyTuple_New(0);
1397     else
1398         args = PyTuple_Pack(1, dd->default_factory);
1399     if (args == NULL)
1400         return NULL;
1401     items = PyObject_CallMethod((PyObject *)dd, "iteritems", "()");
1402     if (items == NULL) {
1403         Py_DECREF(args);
1404         return NULL;
1405     }
1406     result = PyTuple_Pack(5, Py_TYPE(dd), args,
1407                           Py_None, Py_None, items);
1408     Py_DECREF(items);
1409     Py_DECREF(args);
1410     return result;
1411 }
1412 
1413 static PyMethodDef defdict_methods[] = {
1414     {"__missing__", (PyCFunction)defdict_missing, METH_O,
1415      defdict_missing_doc},
1416     {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1417      defdict_copy_doc},
1418     {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1419      defdict_copy_doc},
1420     {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1421      reduce_doc},
1422     {NULL}
1423 };
1424 
1425 static PyMemberDef defdict_members[] = {
1426     {"default_factory", T_OBJECT,
1427      offsetof(defdictobject, default_factory), 0,
1428      PyDoc_STR("Factory for default value called by __missing__().")},
1429     {NULL}
1430 };
1431 
1432 static void
defdict_dealloc(defdictobject * dd)1433 defdict_dealloc(defdictobject *dd)
1434 {
1435     Py_CLEAR(dd->default_factory);
1436     PyDict_Type.tp_dealloc((PyObject *)dd);
1437 }
1438 
1439 static int
defdict_print(defdictobject * dd,FILE * fp,int flags)1440 defdict_print(defdictobject *dd, FILE *fp, int flags)
1441 {
1442     int sts;
1443     Py_BEGIN_ALLOW_THREADS
1444     fprintf(fp, "defaultdict(");
1445     Py_END_ALLOW_THREADS
1446     if (dd->default_factory == NULL) {
1447         Py_BEGIN_ALLOW_THREADS
1448         fprintf(fp, "None");
1449         Py_END_ALLOW_THREADS
1450     } else {
1451         PyObject_Print(dd->default_factory, fp, 0);
1452     }
1453     Py_BEGIN_ALLOW_THREADS
1454     fprintf(fp, ", ");
1455     Py_END_ALLOW_THREADS
1456     sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0);
1457     Py_BEGIN_ALLOW_THREADS
1458     fprintf(fp, ")");
1459     Py_END_ALLOW_THREADS
1460     return sts;
1461 }
1462 
1463 static PyObject *
defdict_repr(defdictobject * dd)1464 defdict_repr(defdictobject *dd)
1465 {
1466     PyObject *defrepr;
1467     PyObject *baserepr;
1468     PyObject *result;
1469     baserepr = PyDict_Type.tp_repr((PyObject *)dd);
1470     if (baserepr == NULL)
1471         return NULL;
1472     if (dd->default_factory == NULL)
1473         defrepr = PyString_FromString("None");
1474     else
1475     {
1476         int status = Py_ReprEnter(dd->default_factory);
1477         if (status != 0) {
1478             if (status < 0)
1479                 return NULL;
1480             defrepr = PyString_FromString("...");
1481         }
1482         else
1483             defrepr = PyObject_Repr(dd->default_factory);
1484         Py_ReprLeave(dd->default_factory);
1485     }
1486     if (defrepr == NULL) {
1487         Py_DECREF(baserepr);
1488         return NULL;
1489     }
1490     result = PyString_FromFormat("defaultdict(%s, %s)",
1491                                  PyString_AS_STRING(defrepr),
1492                                  PyString_AS_STRING(baserepr));
1493     Py_DECREF(defrepr);
1494     Py_DECREF(baserepr);
1495     return result;
1496 }
1497 
1498 static int
defdict_traverse(PyObject * self,visitproc visit,void * arg)1499 defdict_traverse(PyObject *self, visitproc visit, void *arg)
1500 {
1501     Py_VISIT(((defdictobject *)self)->default_factory);
1502     return PyDict_Type.tp_traverse(self, visit, arg);
1503 }
1504 
1505 static int
defdict_tp_clear(defdictobject * dd)1506 defdict_tp_clear(defdictobject *dd)
1507 {
1508     Py_CLEAR(dd->default_factory);
1509     return PyDict_Type.tp_clear((PyObject *)dd);
1510 }
1511 
1512 static int
defdict_init(PyObject * self,PyObject * args,PyObject * kwds)1513 defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
1514 {
1515     defdictobject *dd = (defdictobject *)self;
1516     PyObject *olddefault = dd->default_factory;
1517     PyObject *newdefault = NULL;
1518     PyObject *newargs;
1519     int result;
1520     if (args == NULL || !PyTuple_Check(args))
1521         newargs = PyTuple_New(0);
1522     else {
1523         Py_ssize_t n = PyTuple_GET_SIZE(args);
1524         if (n > 0) {
1525             newdefault = PyTuple_GET_ITEM(args, 0);
1526             if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
1527                 PyErr_SetString(PyExc_TypeError,
1528                     "first argument must be callable");
1529                 return -1;
1530             }
1531         }
1532         newargs = PySequence_GetSlice(args, 1, n);
1533     }
1534     if (newargs == NULL)
1535         return -1;
1536     Py_XINCREF(newdefault);
1537     dd->default_factory = newdefault;
1538     result = PyDict_Type.tp_init(self, newargs, kwds);
1539     Py_DECREF(newargs);
1540     Py_XDECREF(olddefault);
1541     return result;
1542 }
1543 
1544 PyDoc_STRVAR(defdict_doc,
1545 "defaultdict(default_factory) --> dict with default factory\n\
1546 \n\
1547 The default factory is called without arguments to produce\n\
1548 a new value when a key is not present, in __getitem__ only.\n\
1549 A defaultdict compares equal to a dict with the same items.\n\
1550 ");
1551 
1552 /* See comment in xxsubtype.c */
1553 #define DEFERRED_ADDRESS(ADDR) 0
1554 
1555 static PyTypeObject defdict_type = {
1556     PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
1557     "collections.defaultdict",          /* tp_name */
1558     sizeof(defdictobject),              /* tp_basicsize */
1559     0,                                  /* tp_itemsize */
1560     /* methods */
1561     (destructor)defdict_dealloc,        /* tp_dealloc */
1562     (printfunc)defdict_print,           /* tp_print */
1563     0,                                  /* tp_getattr */
1564     0,                                  /* tp_setattr */
1565     0,                                  /* tp_compare */
1566     (reprfunc)defdict_repr,             /* tp_repr */
1567     0,                                  /* tp_as_number */
1568     0,                                  /* tp_as_sequence */
1569     0,                                  /* tp_as_mapping */
1570     0,                                  /* tp_hash */
1571     0,                                  /* tp_call */
1572     0,                                  /* tp_str */
1573     PyObject_GenericGetAttr,            /* tp_getattro */
1574     0,                                  /* tp_setattro */
1575     0,                                  /* tp_as_buffer */
1576     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1577         Py_TPFLAGS_HAVE_WEAKREFS,               /* tp_flags */
1578     defdict_doc,                        /* tp_doc */
1579     defdict_traverse,                   /* tp_traverse */
1580     (inquiry)defdict_tp_clear,          /* tp_clear */
1581     0,                                  /* tp_richcompare */
1582     0,                                  /* tp_weaklistoffset*/
1583     0,                                  /* tp_iter */
1584     0,                                  /* tp_iternext */
1585     defdict_methods,                    /* tp_methods */
1586     defdict_members,                    /* tp_members */
1587     0,                                  /* tp_getset */
1588     DEFERRED_ADDRESS(&PyDict_Type),     /* tp_base */
1589     0,                                  /* tp_dict */
1590     0,                                  /* tp_descr_get */
1591     0,                                  /* tp_descr_set */
1592     0,                                  /* tp_dictoffset */
1593     defdict_init,                       /* tp_init */
1594     PyType_GenericAlloc,                /* tp_alloc */
1595     0,                                  /* tp_new */
1596     PyObject_GC_Del,                    /* tp_free */
1597 };
1598 
1599 /* module level code ********************************************************/
1600 
1601 PyDoc_STRVAR(module_doc,
1602 "High performance data structures.\n\
1603 - deque:        ordered collection accessible from endpoints only\n\
1604 - defaultdict:  dict subclass with a default value factory\n\
1605 ");
1606 
1607 PyMODINIT_FUNC
init_collections(void)1608 init_collections(void)
1609 {
1610     PyObject *m;
1611 
1612     m = Py_InitModule3("_collections", NULL, module_doc);
1613     if (m == NULL)
1614         return;
1615 
1616     if (PyType_Ready(&deque_type) < 0)
1617         return;
1618     Py_INCREF(&deque_type);
1619     PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
1620 
1621     defdict_type.tp_base = &PyDict_Type;
1622     if (PyType_Ready(&defdict_type) < 0)
1623         return;
1624     Py_INCREF(&defdict_type);
1625     PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
1626 
1627     if (PyType_Ready(&dequeiter_type) < 0)
1628         return;
1629 
1630     if (PyType_Ready(&dequereviter_type) < 0)
1631         return;
1632 
1633     return;
1634 }
1635