annotate Modules/_collectionsmodule.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents dbee50619259
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 #include "Python.h"
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #include "structmember.h"
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 /* collections module implementation of a deque() datatype
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 Written and maintained by Raymond D. Hettinger <python@rcn.com>
81985
1791304d05c4 Minor edits: Tighten-up the halflen logic and touch-up the assertions and comments.
Raymond Hettinger <python@rcn.com>
parents: 81948
diff changeset
6 Copyright (c) 2004-2013 Python Software Foundation.
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 All rights reserved.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 /* The block length may be set to any number over 1. Larger numbers
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
11 * reduce the number of calls to the memory allocator, give faster
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
12 * indexing and rotation, and reduce the link::data overhead ratio.
84882
947e117049fb Restore the data block size to 62.
Raymond Hettinger <python@rcn.com>
parents: 84864
diff changeset
13 *
947e117049fb Restore the data block size to 62.
Raymond Hettinger <python@rcn.com>
parents: 84864
diff changeset
14 * Ideally, the block length will be set to two less than some
947e117049fb Restore the data block size to 62.
Raymond Hettinger <python@rcn.com>
parents: 84864
diff changeset
15 * multiple of the cache-line length (so that the full block
947e117049fb Restore the data block size to 62.
Raymond Hettinger <python@rcn.com>
parents: 84864
diff changeset
16 * including the leftlink and rightlink will fit neatly into
947e117049fb Restore the data block size to 62.
Raymond Hettinger <python@rcn.com>
parents: 84864
diff changeset
17 * cache lines).
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 #define BLOCKLEN 62
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 #define CENTER ((BLOCKLEN - 1) / 2)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 /* A `dequeobject` is composed of a doubly-linked list of `block` nodes.
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
24 * The list of blocks is never empty, so d.leftblock and d.rightblock
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
25 * are never equal to NULL. The list is not circular.
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 *
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
27 * A deque d's first element is at d.leftblock[leftindex]
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
28 * and its last element is at d.rightblock[rightindex].
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
29 * Unlike Python slice indices, these indices are inclusive
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
30 * on both ends. This makes the algorithms for left and
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
31 * right operations more symmetrical and simplifies the design.
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 * The indices, d.leftindex and d.rightindex are always in the range
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 * 0 <= index < BLOCKLEN.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 * Their exact relationship is:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 * (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 * Empty deques have d.len == 0; d.leftblock==d.rightblock;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 * d.leftindex == CENTER+1; and d.rightindex == CENTER.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 * Checking for d.len == 0 is the intended way to see whether d is empty.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 * Whenever d.leftblock == d.rightblock,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 * d.leftindex + d.len - 1 == d.rightindex.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 * However, when d.leftblock != d.rightblock, d.leftindex and d.rightindex
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 * become indices into distinct blocks and either may be larger than the
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 * other.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 typedef struct BLOCK {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
51 struct BLOCK *leftlink;
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
52 PyObject *data[BLOCKLEN];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
53 struct BLOCK *rightlink;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 } block;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
55
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
56 /* For debug builds, add error checking to track the endpoints
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
57 * in the chain of links. The goal is to make sure that link
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
58 * assignments only take place at endpoints so that links already
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
59 * in use do not get overwritten.
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
60 *
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
61 * CHECK_END should happen before each assignment to a block's link field.
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
62 * MARK_END should happen whenever a link field becomes a new endpoint.
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
63 * This happens when new blocks are added or whenever an existing
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
64 * block is freed leaving another existing block as the new endpoint.
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
65 */
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
66
84864
35c88c53cf64 Assertions key off NDEBUG
Raymond Hettinger <python@rcn.com>
parents: 84759
diff changeset
67 #ifndef NDEBUG
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
68 #define MARK_END(link) link = NULL;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
69 #define CHECK_END(link) assert(link == NULL);
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
70 #define CHECK_NOT_END(link) assert(link != NULL);
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
71 #else
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
72 #define MARK_END(link)
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
73 #define CHECK_END(link)
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
74 #define CHECK_NOT_END(link)
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
75 #endif
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
76
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
77 /* A simple freelisting scheme is used to minimize calls to the memory
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
78 allocator. It accomodates common use cases where new blocks are being
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
79 added at about the same rate as old blocks are being freed.
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
80 */
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
81
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
82 #define MAXFREEBLOCKS 10
48594
35b1a20470db Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48475
diff changeset
83 static Py_ssize_t numfreeblocks = 0;
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
84 static block *freeblocks[MAXFREEBLOCKS];
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
85
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 static block *
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
87 newblock(Py_ssize_t len) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
88 block *b;
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
89 /* To prevent len from overflowing PY_SSIZE_T_MAX, we refuse to
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
90 * allocate new blocks if the current len is nearing overflow. */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
91 if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
92 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
93 "cannot add more blocks to the deque");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
94 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
95 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
96 if (numfreeblocks) {
82034
2f3669aedc9a Minor tweaks to varnames, declarations, and comments.
Raymond Hettinger <python@rcn.com>
parents: 82012
diff changeset
97 numfreeblocks--;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
98 return freeblocks[numfreeblocks];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
99 }
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
100 b = PyMem_Malloc(sizeof(block));
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
101 if (b != NULL) {
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
102 return b;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
103 }
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
104 PyErr_NoMemory();
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
105 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
107
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
108 static void
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
109 freeblock(block *b)
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
110 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
111 if (numfreeblocks < MAXFREEBLOCKS) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
112 freeblocks[numfreeblocks] = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
113 numfreeblocks++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
114 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
115 PyMem_Free(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
116 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
117 }
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
118
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 typedef struct {
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
120 PyObject_VAR_HEAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
121 block *leftblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
122 block *rightblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
123 Py_ssize_t leftindex; /* in range(BLOCKLEN) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
124 Py_ssize_t rightindex; /* in range(BLOCKLEN) */
84620
c952f3d122ae Tweak the deque struct by moving the least used fields (maxlen and weakref) to the end.
Raymond Hettinger <python@rcn.com>
parents: 84619
diff changeset
125 long state; /* incremented whenever the indices move */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
126 Py_ssize_t maxlen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
127 PyObject *weakreflist; /* List of weak references */
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 } dequeobject;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
129
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
130 /* The deque's size limit is d.maxlen. The limit can be zero or positive.
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
131 * If there is no limit, then d.maxlen == -1.
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
132 *
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
133 * After an item is added to a deque, we check to see if the size has grown past
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
134 * the limit. If it has, we get the size back down to the limit by popping an
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
135 * item off of the opposite end. The methods that can trigger this are append(),
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
136 * appendleft(), extend(), and extendleft().
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
137 */
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
138
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
139 #define TRIM(d, popfunction) \
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
140 if (d->maxlen != -1 && Py_SIZE(d) > d->maxlen) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
141 PyObject *rv = popfunction(d, NULL); \
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
142 assert(rv != NULL && Py_SIZE(d) <= d->maxlen); \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
143 Py_DECREF(rv); \
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
144 }
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
145
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 static PyTypeObject deque_type;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
147
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
151 dequeobject *deque;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
152 block *b;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
153
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
154 /* create dequeobject structure */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
155 deque = (dequeobject *)type->tp_alloc(type, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
156 if (deque == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
157 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
158
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
159 b = newblock(0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
160 if (b == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
161 Py_DECREF(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
162 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
163 }
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
164 MARK_END(b->leftlink);
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
165 MARK_END(b->rightlink);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
166
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
167 assert(BLOCKLEN >= 2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
168 deque->leftblock = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
169 deque->rightblock = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
170 deque->leftindex = CENTER + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
171 deque->rightindex = CENTER;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
172 Py_SIZE(deque) = 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
173 deque->state = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
174 deque->weakreflist = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
175 deque->maxlen = -1;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
176
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
177 return (PyObject *)deque;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
179
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 deque_pop(dequeobject *deque, PyObject *unused)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
183 PyObject *item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
184 block *prevblock;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
185
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
186 if (Py_SIZE(deque) == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
187 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
188 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
189 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
190 item = deque->rightblock->data[deque->rightindex];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
191 deque->rightindex--;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
192 Py_SIZE(deque)--;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
193 deque->state++;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
194
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
195 if (deque->rightindex == -1) {
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
196 if (Py_SIZE(deque) == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
197 assert(deque->leftblock == deque->rightblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
198 assert(deque->leftindex == deque->rightindex+1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
199 /* re-center instead of freeing a block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
200 deque->leftindex = CENTER + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
201 deque->rightindex = CENTER;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
202 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
203 prevblock = deque->rightblock->leftlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
204 assert(deque->leftblock != deque->rightblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
205 freeblock(deque->rightblock);
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
206 CHECK_NOT_END(prevblock);
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
207 MARK_END(prevblock->rightlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
208 deque->rightblock = prevblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
209 deque->rightindex = BLOCKLEN - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
210 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
211 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
212 return item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
214
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
216
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 deque_popleft(dequeobject *deque, PyObject *unused)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
220 PyObject *item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
221 block *prevblock;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
222
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
223 if (Py_SIZE(deque) == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
224 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
225 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
226 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
227 assert(deque->leftblock != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
228 item = deque->leftblock->data[deque->leftindex];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
229 deque->leftindex++;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
230 Py_SIZE(deque)--;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
231 deque->state++;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
233 if (deque->leftindex == BLOCKLEN) {
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
234 if (Py_SIZE(deque) == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
235 assert(deque->leftblock == deque->rightblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
236 assert(deque->leftindex == deque->rightindex+1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
237 /* re-center instead of freeing a block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
238 deque->leftindex = CENTER + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
239 deque->rightindex = CENTER;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
240 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
241 assert(deque->leftblock != deque->rightblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
242 prevblock = deque->leftblock->rightlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
243 freeblock(deque->leftblock);
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
244 CHECK_NOT_END(prevblock);
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
245 MARK_END(prevblock->leftlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
246 deque->leftblock = prevblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
247 deque->leftindex = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
248 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
249 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
250 return item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
252
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
254
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 static PyObject *
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
256 deque_append(dequeobject *deque, PyObject *item)
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
257 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
258 deque->state++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
259 if (deque->rightindex == BLOCKLEN-1) {
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
260 block *b = newblock(Py_SIZE(deque));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
261 if (b == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
262 return NULL;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
263 b->leftlink = deque->rightblock;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
264 CHECK_END(deque->rightblock->rightlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
265 deque->rightblock->rightlink = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
266 deque->rightblock = b;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
267 MARK_END(b->rightlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
268 deque->rightindex = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
269 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
270 Py_INCREF(item);
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
271 Py_SIZE(deque)++;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
272 deque->rightindex++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
273 deque->rightblock->data[deque->rightindex] = item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
274 TRIM(deque, deque_popleft);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
275 Py_RETURN_NONE;
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
276 }
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
277
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
278 PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
279
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
280 static PyObject *
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
281 deque_appendleft(dequeobject *deque, PyObject *item)
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
282 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
283 deque->state++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
284 if (deque->leftindex == 0) {
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
285 block *b = newblock(Py_SIZE(deque));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
286 if (b == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
287 return NULL;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
288 b->rightlink = deque->leftblock;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
289 CHECK_END(deque->leftblock->leftlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
290 deque->leftblock->leftlink = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
291 deque->leftblock = b;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
292 MARK_END(b->leftlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
293 deque->leftindex = BLOCKLEN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
294 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
295 Py_INCREF(item);
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
296 Py_SIZE(deque)++;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
297 deque->leftindex--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
298 deque->leftblock->data[deque->leftindex] = item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
299 TRIM(deque, deque_pop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
300 Py_RETURN_NONE;
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
301 }
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
302
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
303 PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
304
52118
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
305
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
306 /* Run an iterator to exhaustion. Shortcut for
52118
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
307 the extend/extendleft methods when maxlen == 0. */
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
308 static PyObject*
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
309 consume_iterator(PyObject *it)
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
310 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
311 PyObject *item;
52118
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
312
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
313 while ((item = PyIter_Next(it)) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
314 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
315 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
316 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
317 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
318 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
319 Py_RETURN_NONE;
52118
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
320 }
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
321
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
322 static PyObject *
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 deque_extend(dequeobject *deque, PyObject *iterable)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
325 PyObject *it, *item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
326
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
327 /* Handle case where id(deque) == id(iterable) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
328 if ((PyObject *)deque == iterable) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
329 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
330 PyObject *s = PySequence_List(iterable);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
331 if (s == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
332 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
333 result = deque_extend(deque, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
334 Py_DECREF(s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
335 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
336 }
57632
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
337
84524
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
338 /* Space saving heuristic. Start filling from the left */
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
339 if (Py_SIZE(deque) == 0) {
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
340 assert(deque->leftblock == deque->rightblock);
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
341 assert(deque->leftindex == deque->rightindex+1);
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
342 deque->leftindex = 1;
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
343 deque->rightindex = 0;
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
344 }
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
345
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
346 it = PyObject_GetIter(iterable);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
347 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
348 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
349
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
350 if (deque->maxlen == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
351 return consume_iterator(it);
52118
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
352
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
353 while ((item = PyIter_Next(it)) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
354 deque->state++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
355 if (deque->rightindex == BLOCKLEN-1) {
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
356 block *b = newblock(Py_SIZE(deque));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
357 if (b == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
358 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
359 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
360 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
361 }
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
362 b->leftlink = deque->rightblock;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
363 CHECK_END(deque->rightblock->rightlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
364 deque->rightblock->rightlink = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
365 deque->rightblock = b;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
366 MARK_END(b->rightlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
367 deque->rightindex = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
368 }
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
369 Py_SIZE(deque)++;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
370 deque->rightindex++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
371 deque->rightblock->data[deque->rightindex] = item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
372 TRIM(deque, deque_popleft);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
373 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
374 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
375 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
376 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
377 Py_RETURN_NONE;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
379
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 PyDoc_STRVAR(extend_doc,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 "Extend the right side of the deque with elements from the iterable");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
382
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 deque_extendleft(dequeobject *deque, PyObject *iterable)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
386 PyObject *it, *item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
387
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
388 /* Handle case where id(deque) == id(iterable) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
389 if ((PyObject *)deque == iterable) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
390 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
391 PyObject *s = PySequence_List(iterable);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
392 if (s == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
393 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
394 result = deque_extendleft(deque, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
395 Py_DECREF(s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
396 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
397 }
57632
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
398
84524
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
399 /* Space saving heuristic. Start filling from the right */
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
400 if (Py_SIZE(deque) == 0) {
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
401 assert(deque->leftblock == deque->rightblock);
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
402 assert(deque->leftindex == deque->rightindex+1);
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
403 deque->leftindex = BLOCKLEN - 1;
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
404 deque->rightindex = BLOCKLEN - 2;
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
405 }
904399fae081 Add a spacing saving heuristic to deque's extend methods
Raymond Hettinger <python@rcn.com>
parents: 84488
diff changeset
406
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
407 it = PyObject_GetIter(iterable);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
408 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
409 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
410
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
411 if (deque->maxlen == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
412 return consume_iterator(it);
52118
c5e23b9cedcc Small optimization for corner case where maxlen==0.
Raymond Hettinger <python@rcn.com>
parents: 51271
diff changeset
413
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
414 while ((item = PyIter_Next(it)) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
415 deque->state++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
416 if (deque->leftindex == 0) {
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
417 block *b = newblock(Py_SIZE(deque));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
418 if (b == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
419 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
420 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
421 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
422 }
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
423 b->rightlink = deque->leftblock;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
424 CHECK_END(deque->leftblock->leftlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
425 deque->leftblock->leftlink = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
426 deque->leftblock = b;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
427 MARK_END(b->leftlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
428 deque->leftindex = BLOCKLEN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
429 }
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
430 Py_SIZE(deque)++;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
431 deque->leftindex--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
432 deque->leftblock->data[deque->leftindex] = item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
433 TRIM(deque, deque_pop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
434 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
435 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
436 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
437 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
438 Py_RETURN_NONE;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
440
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 PyDoc_STRVAR(extendleft_doc,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 "Extend the left side of the deque with elements from the iterable");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
443
57632
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
444 static PyObject *
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
445 deque_inplace_concat(dequeobject *deque, PyObject *other)
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
446 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
447 PyObject *result;
57632
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
448
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
449 result = deque_extend(deque, other);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
450 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
451 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
452 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
453 Py_INCREF(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
454 return (PyObject *)deque;
57632
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
455 }
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
456
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 _deque_rotate(dequeobject *deque, Py_ssize_t n)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 {
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
460 block *b = NULL;
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
461 block *leftblock = deque->leftblock;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
462 block *rightblock = deque->rightblock;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
463 Py_ssize_t leftindex = deque->leftindex;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
464 Py_ssize_t rightindex = deque->rightindex;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
465 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
466 int rv = -1;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
467
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
468 if (len <= 1)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
469 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
470 if (n > halflen || n < -halflen) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
471 n %= len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
472 if (n > halflen)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
473 n -= len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
474 else if (n < -halflen)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
475 n += len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
476 }
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
477 assert(len > 1);
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
478 assert(-halflen <= n && n <= halflen);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
479
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
480 deque->state++;
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
481 while (n > 0) {
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
482 if (leftindex == 0) {
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
483 if (b == NULL) {
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
484 b = newblock(len);
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
485 if (b == NULL)
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
486 goto done;
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
487 }
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
488 b->rightlink = leftblock;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
489 CHECK_END(leftblock->leftlink);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
490 leftblock->leftlink = b;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
491 leftblock = b;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
492 MARK_END(b->leftlink);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
493 leftindex = BLOCKLEN;
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
494 b = NULL;
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
495 }
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
496 assert(leftindex > 0);
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
497 {
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
498 PyObject **src, **dest;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
499 Py_ssize_t m = n;
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
500
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
501 if (m > rightindex + 1)
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
502 m = rightindex + 1;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
503 if (m > leftindex)
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
504 m = leftindex;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
505 assert (m > 0 && m <= len);
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
506 src = &rightblock->data[rightindex];
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
507 dest = &leftblock->data[leftindex - 1];
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
508 rightindex -= m;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
509 leftindex -= m;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
510 n -= m;
84619
f04ce860b6f8 Use a do-while loop in the inner loop for rotate (m is always greater than zero).
Raymond Hettinger <python@rcn.com>
parents: 84618
diff changeset
511 do {
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
512 *(dest--) = *(src--);
84619
f04ce860b6f8 Use a do-while loop in the inner loop for rotate (m is always greater than zero).
Raymond Hettinger <python@rcn.com>
parents: 84618
diff changeset
513 } while (--m);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
514 }
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
515 if (rightindex == -1) {
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
516 assert(leftblock != rightblock);
84619
f04ce860b6f8 Use a do-while loop in the inner loop for rotate (m is always greater than zero).
Raymond Hettinger <python@rcn.com>
parents: 84618
diff changeset
517 assert(b == NULL);
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
518 b = rightblock;
84759
f49a43dcdcef Minor code simplification by eliminating an unnecessary temporary variable.
Raymond Hettinger <python@rcn.com>
parents: 84620
diff changeset
519 CHECK_NOT_END(rightblock->leftlink);
f49a43dcdcef Minor code simplification by eliminating an unnecessary temporary variable.
Raymond Hettinger <python@rcn.com>
parents: 84620
diff changeset
520 rightblock = rightblock->leftlink;
f49a43dcdcef Minor code simplification by eliminating an unnecessary temporary variable.
Raymond Hettinger <python@rcn.com>
parents: 84620
diff changeset
521 MARK_END(rightblock->rightlink);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
522 rightindex = BLOCKLEN - 1;
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
523 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
524 }
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
525 while (n < 0) {
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
526 if (rightindex == BLOCKLEN - 1) {
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
527 if (b == NULL) {
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
528 b = newblock(len);
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
529 if (b == NULL)
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
530 goto done;
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
531 }
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
532 b->leftlink = rightblock;
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
533 CHECK_END(rightblock->rightlink);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
534 rightblock->rightlink = b;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
535 rightblock = b;
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
536 MARK_END(b->rightlink);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
537 rightindex = -1;
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
538 b = NULL;
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
539 }
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
540 assert (rightindex < BLOCKLEN - 1);
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
541 {
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
542 PyObject **src, **dest;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
543 Py_ssize_t m = -n;
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
544
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
545 if (m > BLOCKLEN - leftindex)
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
546 m = BLOCKLEN - leftindex;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
547 if (m > BLOCKLEN - 1 - rightindex)
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
548 m = BLOCKLEN - 1 - rightindex;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
549 assert (m > 0 && m <= len);
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
550 src = &leftblock->data[leftindex];
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
551 dest = &rightblock->data[rightindex + 1];
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
552 leftindex += m;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
553 rightindex += m;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
554 n += m;
84619
f04ce860b6f8 Use a do-while loop in the inner loop for rotate (m is always greater than zero).
Raymond Hettinger <python@rcn.com>
parents: 84618
diff changeset
555 do {
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
556 *(dest++) = *(src++);
84619
f04ce860b6f8 Use a do-while loop in the inner loop for rotate (m is always greater than zero).
Raymond Hettinger <python@rcn.com>
parents: 84618
diff changeset
557 } while (--m);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
558 }
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
559 if (leftindex == BLOCKLEN) {
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
560 assert(leftblock != rightblock);
84619
f04ce860b6f8 Use a do-while loop in the inner loop for rotate (m is always greater than zero).
Raymond Hettinger <python@rcn.com>
parents: 84618
diff changeset
561 assert(b == NULL);
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
562 b = leftblock;
84759
f49a43dcdcef Minor code simplification by eliminating an unnecessary temporary variable.
Raymond Hettinger <python@rcn.com>
parents: 84620
diff changeset
563 CHECK_NOT_END(leftblock->rightlink);
f49a43dcdcef Minor code simplification by eliminating an unnecessary temporary variable.
Raymond Hettinger <python@rcn.com>
parents: 84620
diff changeset
564 leftblock = leftblock->rightlink;
f49a43dcdcef Minor code simplification by eliminating an unnecessary temporary variable.
Raymond Hettinger <python@rcn.com>
parents: 84620
diff changeset
565 MARK_END(leftblock->leftlink);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
566 leftindex = 0;
82115
5a410900e2b6 Backport deque.rotate() improvements.
Raymond Hettinger <python@rcn.com>
parents: 81470
diff changeset
567 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
568 }
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
569 rv = 0;
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
570 done:
84618
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
571 if (b != NULL)
6a3a613f1335 Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic.
Raymond Hettinger <python@rcn.com>
parents: 84524
diff changeset
572 freeblock(b);
84303
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
573 deque->leftblock = leftblock;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
574 deque->rightblock = rightblock;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
575 deque->leftindex = leftindex;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
576 deque->rightindex = rightindex;
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
577
cb70776241bb Misc improvements to collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 82116
diff changeset
578 return rv;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
580
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
581 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 deque_rotate(dequeobject *deque, PyObject *args)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
583 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
584 Py_ssize_t n=1;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
585
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
586 if (!PyArg_ParseTuple(args, "|n:rotate", &n))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
587 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
588 if (_deque_rotate(deque, n) == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
589 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
590 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
592
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 PyDoc_STRVAR(rotate_doc,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 "Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
595
57627
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
596 static PyObject *
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
597 deque_reverse(dequeobject *deque, PyObject *unused)
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
598 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
599 block *leftblock = deque->leftblock;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
600 block *rightblock = deque->rightblock;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
601 Py_ssize_t leftindex = deque->leftindex;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
602 Py_ssize_t rightindex = deque->rightindex;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
603 Py_ssize_t n = (Py_SIZE(deque))/2;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
604 Py_ssize_t i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
605 PyObject *tmp;
57627
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
606
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
607 for (i=0 ; i<n ; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
608 /* Validate that pointers haven't met in the middle */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
609 assert(leftblock != rightblock || leftindex < rightindex);
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
610 CHECK_NOT_END(leftblock);
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
611 CHECK_NOT_END(rightblock);
57627
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
612
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
613 /* Swap */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
614 tmp = leftblock->data[leftindex];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
615 leftblock->data[leftindex] = rightblock->data[rightindex];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
616 rightblock->data[rightindex] = tmp;
57627
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
617
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
618 /* Advance left block/index pair */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
619 leftindex++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
620 if (leftindex == BLOCKLEN) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
621 leftblock = leftblock->rightlink;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
622 leftindex = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
623 }
57627
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
624
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
625 /* Step backwards with the right block/index pair */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
626 rightindex--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
627 if (rightindex == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
628 rightblock = rightblock->leftlink;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
629 rightindex = BLOCKLEN - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
630 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
631 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
632 Py_RETURN_NONE;
57627
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
633 }
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
634
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
635 PyDoc_STRVAR(reverse_doc,
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
636 "D.reverse() -- reverse *IN PLACE*");
816303a07762 Add a reverse() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
637
60291
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
638 static PyObject *
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
639 deque_count(dequeobject *deque, PyObject *v)
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
640 {
84474
e7025b1e69ce Improve variable names in deque_count()
Raymond Hettinger <python@rcn.com>
parents: 84470
diff changeset
641 block *b = deque->leftblock;
e7025b1e69ce Improve variable names in deque_count()
Raymond Hettinger <python@rcn.com>
parents: 84470
diff changeset
642 Py_ssize_t index = deque->leftindex;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
643 Py_ssize_t n = Py_SIZE(deque);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
644 Py_ssize_t i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
645 Py_ssize_t count = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
646 PyObject *item;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
647 long start_state = deque->state;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
648 int cmp;
60291
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
649
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
650 for (i=0 ; i<n ; i++) {
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
651 CHECK_NOT_END(b);
84474
e7025b1e69ce Improve variable names in deque_count()
Raymond Hettinger <python@rcn.com>
parents: 84470
diff changeset
652 item = b->data[index];
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
653 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
654 if (cmp > 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
655 count++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
656 else if (cmp < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
657 return NULL;
60291
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
658
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
659 if (start_state != deque->state) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
660 PyErr_SetString(PyExc_RuntimeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
661 "deque mutated during iteration");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
662 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
663 }
60291
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
664
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
665 /* Advance left block/index pair */
84474
e7025b1e69ce Improve variable names in deque_count()
Raymond Hettinger <python@rcn.com>
parents: 84470
diff changeset
666 index++;
e7025b1e69ce Improve variable names in deque_count()
Raymond Hettinger <python@rcn.com>
parents: 84470
diff changeset
667 if (index == BLOCKLEN) {
e7025b1e69ce Improve variable names in deque_count()
Raymond Hettinger <python@rcn.com>
parents: 84470
diff changeset
668 b = b->rightlink;
e7025b1e69ce Improve variable names in deque_count()
Raymond Hettinger <python@rcn.com>
parents: 84470
diff changeset
669 index = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
670 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
671 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
672 return PyLong_FromSsize_t(count);
60291
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
673 }
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
674
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
675 PyDoc_STRVAR(count_doc,
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
676 "D.count(value) -> integer -- return number of occurrences of value");
da939ab2bfe2 Add count() method to collections.deque().
Raymond Hettinger <python@rcn.com>
parents: 57630
diff changeset
677
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 static Py_ssize_t
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 deque_len(dequeobject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
680 {
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
681 return Py_SIZE(deque);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
683
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
684 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
685 deque_remove(dequeobject *deque, PyObject *value)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
686 {
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
687 Py_ssize_t i, n=Py_SIZE(deque);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
688
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
689 for (i=0 ; i<n ; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
690 PyObject *item = deque->leftblock->data[deque->leftindex];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
691 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
692
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
693 if (Py_SIZE(deque) != n) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
694 PyErr_SetString(PyExc_IndexError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
695 "deque mutated during remove().");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
696 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
697 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
698 if (cmp > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
699 PyObject *tgt = deque_popleft(deque, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
700 assert (tgt != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
701 Py_DECREF(tgt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
702 if (_deque_rotate(deque, i) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
703 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
704 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
705 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
706 else if (cmp < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
707 _deque_rotate(deque, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
708 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
709 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
710 _deque_rotate(deque, -1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
711 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
712 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
713 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
714 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
715
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
716 PyDoc_STRVAR(remove_doc,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
717 "D.remove(value) -- remove first occurrence of value.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
718
81470
623a7de80432 make deque_clear void, since it's infallible
Benjamin Peterson <benjamin@python.org>
parents: 80084
diff changeset
719 static void
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
720 deque_clear(dequeobject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
721 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
722 PyObject *item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
723
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
724 while (Py_SIZE(deque)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
725 item = deque_pop(deque, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
726 assert (item != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
727 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
728 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
729 assert(deque->leftblock == deque->rightblock &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
730 deque->leftindex - 1 == deque->rightindex &&
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
731 Py_SIZE(deque) == 0);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
732 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
733
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
734 static PyObject *
48594
35b1a20470db Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48475
diff changeset
735 deque_item(dequeobject *deque, Py_ssize_t i)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
736 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
737 block *b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
738 PyObject *item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
739 Py_ssize_t n, index=i;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
740
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
741 if (i < 0 || i >= Py_SIZE(deque)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
742 PyErr_SetString(PyExc_IndexError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
743 "deque index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
744 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
745 }
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
746
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
747 if (i == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
748 i = deque->leftindex;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
749 b = deque->leftblock;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
750 } else if (i == Py_SIZE(deque) - 1) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
751 i = deque->rightindex;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
752 b = deque->rightblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
753 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
754 i += deque->leftindex;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
755 n = i / BLOCKLEN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
756 i %= BLOCKLEN;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
757 if (index < (Py_SIZE(deque) >> 1)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
758 b = deque->leftblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
759 while (n--)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
760 b = b->rightlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
761 } else {
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
762 n = (deque->leftindex + Py_SIZE(deque) - 1) / BLOCKLEN - n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
763 b = deque->rightblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
764 while (n--)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
765 b = b->leftlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
766 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
767 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
768 item = b->data[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
769 Py_INCREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
770 return item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
771 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
772
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 /* delitem() implemented in terms of rotate for simplicity and reasonable
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 performance near the end points. If for some reason this method becomes
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
775 popular, it is not hard to re-implement this using direct data movement
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
776 (similar to code in list slice assignment) and achieve a two or threefold
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
777 performance boost.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
778 */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
779
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
780 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
781 deque_del_item(dequeobject *deque, Py_ssize_t i)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
782 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
783 PyObject *item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
784
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
785 assert (i >= 0 && i < Py_SIZE(deque));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
786 if (_deque_rotate(deque, -i) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
787 return -1;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
788
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
789 item = deque_popleft(deque, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
790 assert (item != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
791 Py_DECREF(item);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
792
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
793 return _deque_rotate(deque, i);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
794 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
795
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
796 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
798 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
799 PyObject *old_value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
800 block *b;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
801 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
802
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
803 if (i < 0 || i >= len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
804 PyErr_SetString(PyExc_IndexError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
805 "deque index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
806 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
807 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
808 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
809 return deque_del_item(deque, i);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
810
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
811 i += deque->leftindex;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
812 n = i / BLOCKLEN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
813 i %= BLOCKLEN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
814 if (index <= halflen) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
815 b = deque->leftblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
816 while (n--)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
817 b = b->rightlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
818 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
819 n = (deque->leftindex + len - 1) / BLOCKLEN - n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
820 b = deque->rightblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
821 while (n--)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
822 b = b->leftlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
823 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
824 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
825 old_value = b->data[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
826 b->data[i] = v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
827 Py_DECREF(old_value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
828 return 0;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
829 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
830
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
831 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
832 deque_clearmethod(dequeobject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
833 {
81470
623a7de80432 make deque_clear void, since it's infallible
Benjamin Peterson <benjamin@python.org>
parents: 80084
diff changeset
834 deque_clear(deque);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
835 Py_RETURN_NONE;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
836 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
837
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
838 PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
839
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
840 static void
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
841 deque_dealloc(dequeobject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
843 PyObject_GC_UnTrack(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
844 if (deque->weakreflist != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
845 PyObject_ClearWeakRefs((PyObject *) deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
846 if (deque->leftblock != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
847 deque_clear(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
848 assert(deque->leftblock != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
849 freeblock(deque->leftblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
850 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
851 deque->leftblock = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
852 deque->rightblock = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
853 Py_TYPE(deque)->tp_free(deque);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
855
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
856 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
857 deque_traverse(dequeobject *deque, visitproc visit, void *arg)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
859 block *b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
860 PyObject *item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
861 Py_ssize_t index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
862 Py_ssize_t indexlo = deque->leftindex;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
863
84466
3555cc0ca35b Refactor deque_traverse().
Raymond Hettinger <python@rcn.com>
parents: 84465
diff changeset
864 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
3555cc0ca35b Refactor deque_traverse().
Raymond Hettinger <python@rcn.com>
parents: 84465
diff changeset
865 for (index = indexlo; index < BLOCKLEN ; index++) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
866 item = b->data[index];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
867 Py_VISIT(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
868 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
869 indexlo = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
870 }
84466
3555cc0ca35b Refactor deque_traverse().
Raymond Hettinger <python@rcn.com>
parents: 84465
diff changeset
871 for (index = indexlo; index <= deque->rightindex; index++) {
3555cc0ca35b Refactor deque_traverse().
Raymond Hettinger <python@rcn.com>
parents: 84465
diff changeset
872 item = b->data[index];
3555cc0ca35b Refactor deque_traverse().
Raymond Hettinger <python@rcn.com>
parents: 84465
diff changeset
873 Py_VISIT(item);
3555cc0ca35b Refactor deque_traverse().
Raymond Hettinger <python@rcn.com>
parents: 84465
diff changeset
874 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
875 return 0;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
876 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
877
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
878 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
879 deque_copy(PyObject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
880 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
881 if (((dequeobject *)deque)->maxlen == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
882 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
883 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
884 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
885 deque, ((dequeobject *)deque)->maxlen, NULL);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
886 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
887
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
889
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
890 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
891 deque_reduce(dequeobject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
892 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
893 PyObject *dict, *result, *aslist;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
894 _Py_IDENTIFIER(__dict__);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
895
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
896 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
897 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
898 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
899 aslist = PySequence_List((PyObject *)deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
900 if (aslist == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
901 Py_XDECREF(dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
902 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
903 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
904 if (dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
905 if (deque->maxlen == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
906 result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
907 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
908 result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
909 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
910 if (deque->maxlen == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
911 result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
912 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
913 result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
914 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
915 Py_XDECREF(dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
916 Py_DECREF(aslist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
917 return result;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
918 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
919
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
920 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
921
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
922 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
923 deque_repr(PyObject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
924 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
925 PyObject *aslist, *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
926 int i;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
927
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
928 i = Py_ReprEnter(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
929 if (i != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
930 if (i < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
931 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
932 return PyUnicode_FromString("[...]");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
933 }
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
934
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
935 aslist = PySequence_List(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
936 if (aslist == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
937 Py_ReprLeave(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
938 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
939 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
940 if (((dequeobject *)deque)->maxlen != -1)
48870
82f73b0b5a30 Merged revisions 65910,65977,65980,65984,65986,66000,66011-66012,66014,66017,66020 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48594
diff changeset
941
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
942 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
943 aslist, ((dequeobject *)deque)->maxlen);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
944 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
945 result = PyUnicode_FromFormat("deque(%R)", aslist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
946 Py_DECREF(aslist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
947 Py_ReprLeave(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
948 return result;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
949 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
950
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
951 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
952 deque_richcompare(PyObject *v, PyObject *w, int op)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
953 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
954 PyObject *it1=NULL, *it2=NULL, *x, *y;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
955 Py_ssize_t vs, ws;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
956 int b, cmp=-1;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
957
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
958 if (!PyObject_TypeCheck(v, &deque_type) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
959 !PyObject_TypeCheck(w, &deque_type)) {
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 69504
diff changeset
960 Py_RETURN_NOTIMPLEMENTED;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
961 }
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
962
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
963 /* Shortcuts */
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
964 vs = Py_SIZE((dequeobject *)v);
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
965 ws = Py_SIZE((dequeobject *)w);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
966 if (op == Py_EQ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
967 if (v == w)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
968 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
969 if (vs != ws)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
970 Py_RETURN_FALSE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
971 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
972 if (op == Py_NE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
973 if (v == w)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
974 Py_RETURN_FALSE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
975 if (vs != ws)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
976 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
977 }
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
978
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
979 /* Search for the first index where items are different */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
980 it1 = PyObject_GetIter(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
981 if (it1 == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
982 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
983 it2 = PyObject_GetIter(w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
984 if (it2 == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
985 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
986 for (;;) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
987 x = PyIter_Next(it1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
988 if (x == NULL && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
989 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
990 y = PyIter_Next(it2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
991 if (x == NULL || y == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
992 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
993 b = PyObject_RichCompareBool(x, y, Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
994 if (b == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
995 cmp = PyObject_RichCompareBool(x, y, op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
996 Py_DECREF(x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
997 Py_DECREF(y);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
998 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
999 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1000 Py_DECREF(x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1001 Py_DECREF(y);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1002 if (b == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1003 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1004 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1005 /* We reached the end of one deque or both */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1006 Py_XDECREF(x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1007 Py_XDECREF(y);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1008 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1009 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1010 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1011 case Py_LT: cmp = y != NULL; break; /* if w was longer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1012 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1013 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1014 case Py_NE: cmp = x != y; break; /* if one deque continues */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1015 case Py_GT: cmp = x != NULL; break; /* if v was longer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1016 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1017 }
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 done:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1020 Py_XDECREF(it1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1021 Py_XDECREF(it2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1022 if (cmp == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1023 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1024 if (cmp == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1025 Py_RETURN_FALSE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1026 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1028
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1029 static int
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42478
diff changeset
1030 deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1031 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1032 PyObject *iterable = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1033 PyObject *maxlenobj = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1034 Py_ssize_t maxlen = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1035 char *kwlist[] = {"iterable", "maxlen", 0};
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1037 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1038 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1039 if (maxlenobj != NULL && maxlenobj != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1040 maxlen = PyLong_AsSsize_t(maxlenobj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1041 if (maxlen == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1042 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1043 if (maxlen < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1044 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1045 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1046 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1047 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1048 deque->maxlen = maxlen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1049 deque_clear(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1050 if (iterable != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1051 PyObject *rv = deque_extend(deque, iterable);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1052 if (rv == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1053 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1054 Py_DECREF(rv);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1055 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1056 return 0;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1057 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1058
52120
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1059 static PyObject *
78394
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1060 deque_sizeof(dequeobject *deque, void *unused)
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1061 {
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1062 Py_ssize_t res;
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1063 Py_ssize_t blocks;
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1064
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1065 res = sizeof(dequeobject);
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
1066 blocks = (deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
1067 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
78394
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1068 (blocks - 1) * BLOCKLEN + deque->rightindex);
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1069 res += blocks * sizeof(block);
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1070 return PyLong_FromSsize_t(res);
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1071 }
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1072
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1073 PyDoc_STRVAR(sizeof_doc,
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1074 "D.__sizeof__() -- size of D in memory, in bytes");
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1075
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1076 static PyObject *
52120
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1077 deque_get_maxlen(dequeobject *deque)
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1078 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1079 if (deque->maxlen == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1080 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1081 return PyLong_FromSsize_t(deque->maxlen);
52120
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1082 }
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1083
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1084 static PyGetSetDef deque_getset[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1085 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1086 "maximum size of a deque or None if unbounded"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1087 {0}
52120
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1088 };
21850d6d5b4d For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
Raymond Hettinger <python@rcn.com>
parents: 52118
diff changeset
1089
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090 static PySequenceMethods deque_as_sequence = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1091 (lenfunc)deque_len, /* sq_length */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1092 0, /* sq_concat */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1093 0, /* sq_repeat */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1094 (ssizeargfunc)deque_item, /* sq_item */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1095 0, /* sq_slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1096 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1097 0, /* sq_ass_slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1098 0, /* sq_contains */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1099 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1100 0, /* sq_inplace_repeat */
57632
bc716d8f4345 Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Raymond Hettinger <python@rcn.com>
parents: 55536
diff changeset
1101
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1102 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1104 /* deque object ********************************************************/
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1105
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1106 static PyObject *deque_iter(dequeobject *deque);
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107 static PyObject *deque_reviter(dequeobject *deque);
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1108 PyDoc_STRVAR(reversed_doc,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1109 "D.__reversed__() -- return a reverse iterator over the deque");
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1110
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1111 static PyMethodDef deque_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1112 {"append", (PyCFunction)deque_append,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1113 METH_O, append_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1114 {"appendleft", (PyCFunction)deque_appendleft,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1115 METH_O, appendleft_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1116 {"clear", (PyCFunction)deque_clearmethod,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1117 METH_NOARGS, clear_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1118 {"__copy__", (PyCFunction)deque_copy,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1119 METH_NOARGS, copy_doc},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
1120 {"count", (PyCFunction)deque_count,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
1121 METH_O, count_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1122 {"extend", (PyCFunction)deque_extend,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1123 METH_O, extend_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1124 {"extendleft", (PyCFunction)deque_extendleft,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1125 METH_O, extendleft_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1126 {"pop", (PyCFunction)deque_pop,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1127 METH_NOARGS, pop_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1128 {"popleft", (PyCFunction)deque_popleft,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1129 METH_NOARGS, popleft_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1130 {"__reduce__", (PyCFunction)deque_reduce,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1131 METH_NOARGS, reduce_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1132 {"remove", (PyCFunction)deque_remove,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1133 METH_O, remove_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1134 {"__reversed__", (PyCFunction)deque_reviter,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1135 METH_NOARGS, reversed_doc},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
1136 {"reverse", (PyCFunction)deque_reverse,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60291
diff changeset
1137 METH_NOARGS, reverse_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1138 {"rotate", (PyCFunction)deque_rotate,
78394
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1139 METH_VARARGS, rotate_doc},
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1140 {"__sizeof__", (PyCFunction)deque_sizeof,
b0725c1b3068 Closes #15469: Correct __sizeof__ support for deque
Jesus Cea <jcea@jcea.es>
parents: 74936
diff changeset
1141 METH_NOARGS, sizeof_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1142 {NULL, NULL} /* sentinel */
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145 PyDoc_STRVAR(deque_doc,
80083
9de80866f56b Fix docstring for deque ctor to mark iterable parameter optional
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78394
diff changeset
1146 "deque([iterable[, maxlen]]) --> deque object\n\
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1147 \n\
69059
36344c9505b2 Issue 11713: clarify docstring for collections.deque()
Raymond Hettinger <python@rcn.com>
parents: 64121
diff changeset
1148 Build an ordered collection with optimized access from its endpoints.");
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1149
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1150 static PyTypeObject deque_type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1151 PyVarObject_HEAD_INIT(NULL, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1152 "collections.deque", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1153 sizeof(dequeobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1154 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1155 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1156 (destructor)deque_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1157 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1158 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1159 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1160 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1161 deque_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1162 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1163 &deque_as_sequence, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1164 0, /* tp_as_mapping */
65513
5b069892e413 Remove more unneeded casts to hashfunc.
Georg Brandl <georg@python.org>
parents: 64117
diff changeset
1165 PyObject_HashNotImplemented, /* tp_hash */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1166 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1167 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1168 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1169 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1170 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1171 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
65513
5b069892e413 Remove more unneeded casts to hashfunc.
Georg Brandl <georg@python.org>
parents: 64117
diff changeset
1172 /* tp_flags */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1173 deque_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1174 (traverseproc)deque_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1175 (inquiry)deque_clear, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1176 (richcmpfunc)deque_richcompare, /* tp_richcompare */
65513
5b069892e413 Remove more unneeded casts to hashfunc.
Georg Brandl <georg@python.org>
parents: 64117
diff changeset
1177 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1178 (getiterfunc)deque_iter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1179 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1180 deque_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1181 0, /* tp_members */
65513
5b069892e413 Remove more unneeded casts to hashfunc.
Georg Brandl <georg@python.org>
parents: 64117
diff changeset
1182 deque_getset, /* tp_getset */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1183 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1184 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1185 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1186 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1187 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1188 (initproc)deque_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1189 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1190 deque_new, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1191 PyObject_GC_Del, /* tp_free */
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1192 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1193
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1194 /*********************** Deque Iterator **************************/
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1195
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1197 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1198 Py_ssize_t index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1199 block *b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1200 dequeobject *deque;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1201 long state; /* state when the iterator is created */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1202 Py_ssize_t counter; /* number of items remaining for iteration */
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1203 } dequeiterobject;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1204
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
1205 static PyTypeObject dequeiter_type;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1206
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1207 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1208 deque_iter(dequeobject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1209 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1210 dequeiterobject *it;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1211
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1212 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1213 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1214 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1215 it->b = deque->leftblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1216 it->index = deque->leftindex;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1217 Py_INCREF(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1218 it->deque = deque;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1219 it->state = deque->state;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
1220 it->counter = Py_SIZE(deque);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1221 PyObject_GC_Track(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1222 return (PyObject *)it;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1223 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1224
50553
badb471dbaeb Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49604
diff changeset
1225 static int
badb471dbaeb Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49604
diff changeset
1226 dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
badb471dbaeb Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49604
diff changeset
1227 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1228 Py_VISIT(dio->deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1229 return 0;
50553
badb471dbaeb Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49604
diff changeset
1230 }
badb471dbaeb Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49604
diff changeset
1231
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1232 static void
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1233 dequeiter_dealloc(dequeiterobject *dio)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1234 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1235 Py_XDECREF(dio->deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1236 PyObject_GC_Del(dio);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1237 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1238
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1239 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1240 dequeiter_next(dequeiterobject *it)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1241 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1242 PyObject *item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1243
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1244 if (it->deque->state != it->state) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1245 it->counter = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1246 PyErr_SetString(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1247 "deque mutated during iteration");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1248 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1249 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1250 if (it->counter == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1251 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1252 assert (!(it->b == it->deque->rightblock &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1253 it->index > it->deque->rightindex));
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1254
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1255 item = it->b->data[it->index];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1256 it->index++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1257 it->counter--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1258 if (it->index == BLOCKLEN && it->counter > 0) {
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
1259 CHECK_NOT_END(it->b->rightlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1260 it->b = it->b->rightlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1261 it->index = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1262 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1263 Py_INCREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1264 return item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1265 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1266
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1267 static PyObject *
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1268 dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1269 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1270 Py_ssize_t i, index=0;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1271 PyObject *deque;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1272 dequeiterobject *it;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1273 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1274 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1275 assert(type == &dequeiter_type);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1276
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1277 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1278 if (!it)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1279 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1280 /* consume items from the queue */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1281 for(i=0; i<index; i++) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1282 PyObject *item = dequeiter_next(it);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1283 if (item) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1284 Py_DECREF(item);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1285 } else {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1286 if (it->counter) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1287 Py_DECREF(it);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1288 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1289 } else
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1290 break;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1291 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1292 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1293 return (PyObject*)it;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1294 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1295
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1296 static PyObject *
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1297 dequeiter_len(dequeiterobject *it)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1298 {
64121
2a4ceebdfcfb Merged revisions 84146-84147,84150 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
1299 return PyLong_FromSsize_t(it->counter);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1300 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1301
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1302 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1303
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1304 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1305 dequeiter_reduce(dequeiterobject *it)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1306 {
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
1307 return Py_BuildValue("O(On)", Py_TYPE(it), it->deque, Py_SIZE(it->deque) - it->counter);
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1308 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1309
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1310 static PyMethodDef dequeiter_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1311 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1312 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1313 {NULL, NULL} /* sentinel */
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1314 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1315
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
1316 static PyTypeObject dequeiter_type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1317 PyVarObject_HEAD_INIT(NULL, 0)
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1318 "_collections._deque_iterator", /* tp_name */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1319 sizeof(dequeiterobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1320 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1321 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1322 (destructor)dequeiter_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1323 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1324 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1325 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1326 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1327 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1328 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1329 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1330 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1331 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1332 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1333 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1334 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1335 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1336 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1337 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1338 0, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1339 (traverseproc)dequeiter_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1340 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1341 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1342 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1343 PyObject_SelfIter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1344 (iternextfunc)dequeiter_next, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1345 dequeiter_methods, /* tp_methods */
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1346 0, /* tp_members */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1347 0, /* tp_getset */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1348 0, /* tp_base */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1349 0, /* tp_dict */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1350 0, /* tp_descr_get */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1351 0, /* tp_descr_set */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1352 0, /* tp_dictoffset */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1353 0, /* tp_init */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1354 0, /* tp_alloc */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1355 dequeiter_new, /* tp_new */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1356 0,
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1357 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1358
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1359 /*********************** Deque Reverse Iterator **************************/
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1360
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
1361 static PyTypeObject dequereviter_type;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1362
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1363 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1364 deque_reviter(dequeobject *deque)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1365 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1366 dequeiterobject *it;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1367
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1368 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1369 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1370 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1371 it->b = deque->rightblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1372 it->index = deque->rightindex;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1373 Py_INCREF(deque);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1374 it->deque = deque;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1375 it->state = deque->state;
84470
9166aa413d6f Apply the PyObject_VAR_HEAD and Py_SIZE macros
Raymond Hettinger <python@rcn.com>
parents: 84466
diff changeset
1376 it->counter = Py_SIZE(deque);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1377 PyObject_GC_Track(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1378 return (PyObject *)it;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1379 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1381 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1382 dequereviter_next(dequeiterobject *it)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1383 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1384 PyObject *item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1385 if (it->counter == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1386 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1387
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1388 if (it->deque->state != it->state) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1389 it->counter = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1390 PyErr_SetString(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1391 "deque mutated during iteration");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1392 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1393 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1394 assert (!(it->b == it->deque->leftblock &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1395 it->index < it->deque->leftindex));
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1396
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1397 item = it->b->data[it->index];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1398 it->index--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1399 it->counter--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1400 if (it->index == -1 && it->counter > 0) {
84487
ae9ee46bd471 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
Raymond Hettinger <python@rcn.com>
parents: 84474
diff changeset
1401 CHECK_NOT_END(it->b->leftlink);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1402 it->b = it->b->leftlink;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1403 it->index = BLOCKLEN - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1404 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1405 Py_INCREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1406 return item;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1407 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1408
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1409 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1410 dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1411 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1412 Py_ssize_t i, index=0;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1413 PyObject *deque;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1414 dequeiterobject *it;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1415 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1416 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1417 assert(type == &dequereviter_type);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1418
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1419 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1420 if (!it)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1421 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1422 /* consume items from the queue */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1423 for(i=0; i<index; i++) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1424 PyObject *item = dequereviter_next(it);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1425 if (item) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1426 Py_DECREF(item);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1427 } else {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1428 if (it->counter) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1429 Py_DECREF(it);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1430 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1431 } else
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1432 break;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1433 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1434 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1435 return (PyObject*)it;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1436 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1437
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
1438 static PyTypeObject dequereviter_type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1439 PyVarObject_HEAD_INIT(NULL, 0)
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1440 "_collections._deque_reverse_iterator", /* tp_name */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1441 sizeof(dequeiterobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1442 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1443 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1444 (destructor)dequeiter_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1445 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1446 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1447 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1448 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1449 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1450 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1451 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1452 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1453 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1454 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1455 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1456 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1457 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1458 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1459 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1460 0, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1461 (traverseproc)dequeiter_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1462 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1463 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1464 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1465 PyObject_SelfIter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1466 (iternextfunc)dequereviter_next, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1467 dequeiter_methods, /* tp_methods */
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1468 0, /* tp_members */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1469 0, /* tp_getset */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1470 0, /* tp_base */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1471 0, /* tp_dict */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1472 0, /* tp_descr_get */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1473 0, /* tp_descr_set */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1474 0, /* tp_dictoffset */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1475 0, /* tp_init */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1476 0, /* tp_alloc */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1477 dequereviter_new, /* tp_new */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1478 0,
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1479 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1480
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1481 /* defaultdict type *********************************************************/
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1482
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1483 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1484 PyDictObject dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1485 PyObject *default_factory;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1486 } defdictobject;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1487
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1488 static PyTypeObject defdict_type; /* Forward */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1489
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1490 PyDoc_STRVAR(defdict_missing_doc,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1491 "__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1492 if self.default_factory is None: raise KeyError((key,))\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1493 self[key] = value = self.default_factory()\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1494 return value\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1495 ");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1496
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1497 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1498 defdict_missing(defdictobject *dd, PyObject *key)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1499 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1500 PyObject *factory = dd->default_factory;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1501 PyObject *value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1502 if (factory == NULL || factory == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1503 /* XXX Call dict.__missing__(key) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1504 PyObject *tup;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1505 tup = PyTuple_Pack(1, key);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1506 if (!tup) return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1507 PyErr_SetObject(PyExc_KeyError, tup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1508 Py_DECREF(tup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1509 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1510 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1511 value = PyEval_CallObject(factory, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1512 if (value == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1513 return value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1514 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1515 Py_DECREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1516 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1517 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1518 return value;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1519 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1520
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1521 PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1522
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1523 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1524 defdict_copy(defdictobject *dd)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1525 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1526 /* This calls the object's class. That only works for subclasses
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1527 whose class constructor has the same signature. Subclasses that
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1528 define a different constructor signature must override copy().
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1529 */
55536
658de84381d7 Issue 6637: defaultdict.copy() failed with an empty factory.
Raymond Hettinger <python@rcn.com>
parents: 52120
diff changeset
1530
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1531 if (dd->default_factory == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1532 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1533 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1534 dd->default_factory, dd, NULL);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1535 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1536
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1537 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1538 defdict_reduce(defdictobject *dd)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1539 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1540 /* __reduce__ must return a 5-tuple as follows:
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1541
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1542 - factory function
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1543 - tuple of args for the factory function
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1544 - additional state (here None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1545 - sequence iterator (here None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1546 - dictionary iterator (yielding successive (key, value) pairs
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1547
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1548 This API is used by pickle.py and copy.py.
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1549
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1550 For this to be useful with pickle.py, the default_factory
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1551 must be picklable; e.g., None, a built-in, or a global
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1552 function in a module or package.
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1553
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1554 Both shallow and deep copying are supported, but for deep
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1555 copying, the default_factory must be deep-copyable; e.g. None,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1556 or a built-in (functions are not copyable at this time).
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1557
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1558 This only works for subclasses as long as their constructor
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1559 signature is compatible; the first argument must be the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1560 optional default_factory, defaulting to None.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1561 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1562 PyObject *args;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1563 PyObject *items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1564 PyObject *iter;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1565 PyObject *result;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
1566 _Py_IDENTIFIER(items);
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
1567
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1568 if (dd->default_factory == NULL || dd->default_factory == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1569 args = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1570 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1571 args = PyTuple_Pack(1, dd->default_factory);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1572 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1573 return NULL;
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
1574 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, "()");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1575 if (items == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1576 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1577 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1578 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1579 iter = PyObject_GetIter(items);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1580 if (iter == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1581 Py_DECREF(items);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1582 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1583 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1584 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1585 result = PyTuple_Pack(5, Py_TYPE(dd), args,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1586 Py_None, Py_None, iter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1587 Py_DECREF(iter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1588 Py_DECREF(items);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1589 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1590 return result;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1591 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1592
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1593 static PyMethodDef defdict_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1594 {"__missing__", (PyCFunction)defdict_missing, METH_O,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1595 defdict_missing_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1596 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1597 defdict_copy_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1598 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1599 defdict_copy_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1600 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1601 reduce_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1602 {NULL}
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1603 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1604
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1605 static PyMemberDef defdict_members[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1606 {"default_factory", T_OBJECT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1607 offsetof(defdictobject, default_factory), 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1608 PyDoc_STR("Factory for default value called by __missing__().")},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1609 {NULL}
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1610 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1611
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1612 static void
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1613 defdict_dealloc(defdictobject *dd)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1614 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1615 Py_CLEAR(dd->default_factory);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1616 PyDict_Type.tp_dealloc((PyObject *)dd);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1617 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1618
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1619 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1620 defdict_repr(defdictobject *dd)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1621 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1622 PyObject *baserepr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1623 PyObject *defrepr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1624 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1625 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1626 if (baserepr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1627 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1628 if (dd->default_factory == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1629 defrepr = PyUnicode_FromString("None");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1630 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1631 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1632 int status = Py_ReprEnter(dd->default_factory);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1633 if (status != 0) {
74936
86adb5c7a9d4 Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
Antoine Pitrou <solipsis@pitrou.net>
parents: 69107
diff changeset
1634 if (status < 0) {
86adb5c7a9d4 Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
Antoine Pitrou <solipsis@pitrou.net>
parents: 69107
diff changeset
1635 Py_DECREF(baserepr);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1636 return NULL;
74936
86adb5c7a9d4 Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
Antoine Pitrou <solipsis@pitrou.net>
parents: 69107
diff changeset
1637 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1638 defrepr = PyUnicode_FromString("...");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1639 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1640 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1641 defrepr = PyObject_Repr(dd->default_factory);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1642 Py_ReprLeave(dd->default_factory);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1643 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1644 if (defrepr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1645 Py_DECREF(baserepr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1646 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1647 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1648 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1649 defrepr, baserepr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1650 Py_DECREF(defrepr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1651 Py_DECREF(baserepr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1652 return result;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1653 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1654
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1655 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1656 defdict_traverse(PyObject *self, visitproc visit, void *arg)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1657 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1658 Py_VISIT(((defdictobject *)self)->default_factory);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1659 return PyDict_Type.tp_traverse(self, visit, arg);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1660 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1661
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1662 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1663 defdict_tp_clear(defdictobject *dd)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1664 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1665 Py_CLEAR(dd->default_factory);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1666 return PyDict_Type.tp_clear((PyObject *)dd);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1667 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1668
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1669 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1670 defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1671 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1672 defdictobject *dd = (defdictobject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1673 PyObject *olddefault = dd->default_factory;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1674 PyObject *newdefault = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1675 PyObject *newargs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1676 int result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1677 if (args == NULL || !PyTuple_Check(args))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1678 newargs = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1679 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1680 Py_ssize_t n = PyTuple_GET_SIZE(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1681 if (n > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1682 newdefault = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1683 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1684 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1685 "first argument must be callable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1686 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1687 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1688 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1689 newargs = PySequence_GetSlice(args, 1, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1690 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1691 if (newargs == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1692 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1693 Py_XINCREF(newdefault);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1694 dd->default_factory = newdefault;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1695 result = PyDict_Type.tp_init(self, newargs, kwds);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1696 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1697 Py_XDECREF(olddefault);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1698 return result;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1699 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1700
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1701 PyDoc_STRVAR(defdict_doc,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1702 "defaultdict(default_factory) --> dict with default factory\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1703 \n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1704 The default factory is called without arguments to produce\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1705 a new value when a key is not present, in __getitem__ only.\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1706 A defaultdict compares equal to a dict with the same items.\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1707 ");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1708
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1709 /* See comment in xxsubtype.c */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1710 #define DEFERRED_ADDRESS(ADDR) 0
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1711
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1712 static PyTypeObject defdict_type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1713 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1714 "collections.defaultdict", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1715 sizeof(defdictobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1716 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1717 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1718 (destructor)defdict_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1719 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1720 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1721 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1722 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1723 (reprfunc)defdict_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1724 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1725 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1726 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1727 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1728 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1729 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1730 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1731 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1732 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1733 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1734 /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1735 defdict_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1736 defdict_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1737 (inquiry)defdict_tp_clear, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1738 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1739 0, /* tp_weaklistoffset*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1740 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1741 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1742 defdict_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1743 defdict_members, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1744 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1745 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1746 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1747 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1748 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1749 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1750 defdict_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1751 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1752 0, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1753 PyObject_GC_Del, /* tp_free */
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1754 };
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1755
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1756 /* helper function for Counter *********************************************/
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1757
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1758 PyDoc_STRVAR(_count_elements_doc,
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1759 "_count_elements(mapping, iterable) -> None\n\
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1760 \n\
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1761 Count elements in the iterable, updating the mappping");
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1762
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1763 static PyObject *
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1764 _count_elements(PyObject *self, PyObject *args)
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1765 {
85960
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1766 _Py_IDENTIFIER(get);
85909
6aef095fdb30 Issue #18594: Fix the fast path for collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 82115
diff changeset
1767 _Py_IDENTIFIER(__setitem__);
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1768 PyObject *it, *iterable, *mapping, *oldval;
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1769 PyObject *newval = NULL;
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1770 PyObject *key = NULL;
85916
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1771 PyObject *zero = NULL;
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1772 PyObject *one = NULL;
85960
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1773 PyObject *bound_get = NULL;
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1774 PyObject *mapping_get;
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1775 PyObject *dict_get;
85909
6aef095fdb30 Issue #18594: Fix the fast path for collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 82115
diff changeset
1776 PyObject *mapping_setitem;
6aef095fdb30 Issue #18594: Fix the fast path for collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 82115
diff changeset
1777 PyObject *dict_setitem;
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1778
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1779 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1780 return NULL;
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1781
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1782 it = PyObject_GetIter(iterable);
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1783 if (it == NULL)
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1784 return NULL;
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1785
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1786 one = PyLong_FromLong(1);
85916
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1787 if (one == NULL)
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1788 goto done;
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1789
85960
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1790 /* Only take the fast path when get() and __setitem__()
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1791 * have not been overridden.
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1792 */
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1793 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1794 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
85909
6aef095fdb30 Issue #18594: Fix the fast path for collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 82115
diff changeset
1795 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
6aef095fdb30 Issue #18594: Fix the fast path for collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 82115
diff changeset
1796 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
6aef095fdb30 Issue #18594: Fix the fast path for collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 82115
diff changeset
1797
85960
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1798 if (mapping_get != NULL && mapping_get == dict_get &&
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1799 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1800 while (1) {
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1801 key = PyIter_Next(it);
69504
4bd68b1f8702 Simplify _count_elements() in _collections
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69107
diff changeset
1802 if (key == NULL)
4bd68b1f8702 Simplify _count_elements() in _collections
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69107
diff changeset
1803 break;
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1804 oldval = PyDict_GetItem(mapping, key);
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1805 if (oldval == NULL) {
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1806 if (PyDict_SetItem(mapping, key, one) == -1)
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1807 break;
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1808 } else {
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1809 newval = PyNumber_Add(oldval, one);
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1810 if (newval == NULL)
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1811 break;
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1812 if (PyDict_SetItem(mapping, key, newval) == -1)
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1813 break;
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1814 Py_CLEAR(newval);
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1815 }
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1816 Py_DECREF(key);
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1817 }
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1818 } else {
86977
dbee50619259 Issue #19512: _count_elements() of _collections reuses PyId_get identifier
Victor Stinner <victor.stinner@gmail.com>
parents: 85961
diff changeset
1819 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
85960
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1820 if (bound_get == NULL)
85916
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1821 goto done;
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1822
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1823 zero = PyLong_FromLong(0);
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1824 if (zero == NULL)
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1825 goto done;
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1826
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1827 while (1) {
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1828 key = PyIter_Next(it);
69504
4bd68b1f8702 Simplify _count_elements() in _collections
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69107
diff changeset
1829 if (key == NULL)
4bd68b1f8702 Simplify _count_elements() in _collections
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69107
diff changeset
1830 break;
85960
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1831 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
85916
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1832 if (oldval == NULL)
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1833 break;
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1834 newval = PyNumber_Add(oldval, one);
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1835 Py_DECREF(oldval);
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1836 if (newval == NULL)
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1837 break;
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1838 if (PyObject_SetItem(mapping, key, newval) == -1)
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1839 break;
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1840 Py_CLEAR(newval);
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1841 Py_DECREF(key);
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1842 }
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1843 }
67287
a048d0cf2ad1 Make C helper function more closely match the pure python version, and add tests.
Raymond Hettinger <python@rcn.com>
parents: 66920
diff changeset
1844
85916
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1845 done:
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1846 Py_DECREF(it);
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1847 Py_XDECREF(key);
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1848 Py_XDECREF(newval);
85960
e4cec1116e5c Issue #18594: Make the C code more closely match the pure python code.
Raymond Hettinger <python@rcn.com>
parents: 85916
diff changeset
1849 Py_XDECREF(bound_get);
85916
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1850 Py_XDECREF(zero);
1ee6f8a96fb9 Issue #18594: Fix the fallback path in collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 85909
diff changeset
1851 Py_XDECREF(one);
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1852 if (PyErr_Occurred())
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1853 return NULL;
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1854 Py_RETURN_NONE;
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1855 }
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1856
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1857 /* module level code ********************************************************/
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1858
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1859 PyDoc_STRVAR(module_doc,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1860 "High performance data structures.\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1861 - deque: ordered collection accessible from endpoints only\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1862 - defaultdict: dict subclass with a default value factory\n\
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1863 ");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1864
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1865 static struct PyMethodDef module_functions[] = {
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1866 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1867 {NULL, NULL} /* sentinel */
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1868 };
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45307
diff changeset
1869
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45307
diff changeset
1870 static struct PyModuleDef _collectionsmodule = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1871 PyModuleDef_HEAD_INIT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1872 "_collections",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1873 module_doc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1874 -1,
66920
40125cddafb9 Issue 10667: Fast path for collections.Counter
Raymond Hettinger <python@rcn.com>
parents: 65513
diff changeset
1875 module_functions,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1876 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1877 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1878 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1879 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45307
diff changeset
1880 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45307
diff changeset
1881
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1882 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45307
diff changeset
1883 PyInit__collections(void)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1884 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1885 PyObject *m;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1886
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1887 m = PyModule_Create(&_collectionsmodule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1888 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1889 return NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1890
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1891 if (PyType_Ready(&deque_type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1892 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1893 Py_INCREF(&deque_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1894 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1895
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1896 defdict_type.tp_base = &PyDict_Type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1897 if (PyType_Ready(&defdict_type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1898 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1899 Py_INCREF(&defdict_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1900 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1901
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1902 if (PyType_Ready(&dequeiter_type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1903 return NULL;
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1904 Py_INCREF(&dequeiter_type);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1905 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1906
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1907 if (PyType_Ready(&dequereviter_type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1908 return NULL;
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1909 Py_INCREF(&dequereviter_type);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 74937
diff changeset
1910 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1911
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57632
diff changeset
1912 return m;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1913 }